Dokumentation in Textile schreiben

Gibheer
20
January
2011
17
00

Da ich mal Dokumentation schreiben musste, OpenOffice aber schon beim ersten Tastenschlag keine Lust mehr hatte, ich mich bei HTML staendig verschrieben habe, bin ich einfach auf Textile umgestiegen und hab erfolgreich Dokumetation schreiben koennen.

Textile ist ein einfaches Wikiaehnliches Markup. Zusammen mit Ruby ist daraus ein kleines Script geschrieben, welches mir mein textile File in ein HTML-Grundgeruest stopft, den Code etwas aufhuebscht und dann einfach schnell arbeitet.

Als Bibliotheken kamen dabei RedCloth, RedclothCoderay und CodeRay zum Einsatz.

Damit das Script funktioniert muessen die Gems CodeRay, RedCloth und RedclothCoderay installiert sein.
Als naechstes muss im Verzeichniss des Scriptes eine index_template.html angelegt werden. Darin kann {{content}} als Platzhalter fuer den Content des textile-Files benutzt werden. In die index.textile kommt dann das Markup rein. Mit {{toc}} kann in diesem File eine Inhaltsangabe aus den h[1-3]. erstellt werden.

Speichert einfach das folgende Script in einer Datei und ruft es mit ruby auf und schon bekommt ihr euer textile umgewandelt.

# To change this template, choose Tools | Templates
# and open the template in the editor.

require 'rubygems'
require 'redcloth'
require 'coderay'
require 'redclothcoderay'

RedclothCoderay.coderay_options :css => :class
search_headlines = /h([1-3])\.\s(.*)/

def build_menu array, depth
  result = ""
  if array.length > 0 then
    array.each do |el|
      result << '*' * (depth + 1) + ' "' + el[:bez]+"\":\##{el[:bez].gsub(/\s/,'_')}\n"
      if el[:toc].length > 0 then
        result << build_menu(el[:toc], depth + 1)
      end
    end
  end
  result
end

File.open 'index.html', 'w' do |file|
  index = File.read('index_template.html')
  code = File.read('documentation.textile')
  toc = []
  code.gsub! search_headlines do |sub|
    match = sub.scan(search_headlines)[0]
    if match[0] == 1.to_s then
      toc << {:bez => match[1], :toc => []}
    elsif match[0] == 2.to_s then
      toc.last[:toc] << {:bez => match[1], :toc => []}
    elsif match[0] == 3.to_s then
      toc.last[:toc].last[:toc] << {:bez => match[1], :toc => []}
    end
    'h'+match[0]+'(#'+match[1].gsub(/\s/,'_')+'). '+match[1]
  end
  code = code.gsub(//, build_menu(toc, 0)+"\n")
  file.write(index.gsub //, RedCloth.new(code).to_html)
end
puts 'ready'

Comments