Sarebbe successo… prima o poi. Gli automatismi di Rails non potevano permettersi una tale carenza!

margherite e rubini… un regalo di sicuro effetto! :)
MediaCloth è il nome del plugin: implementa tutti i tag più diffusi della sintassi di MediaWiki, lasciando però al programmatore il compito di gestire le caratteristiche che cambiano da un sito all’altro, come la gestione dei link e delle immagini.
Mi sono convinto che questo post potesse essere utile nel momento in cui ho cercato un po’ di documentazione riguardo quest’ultimo punto. Essendo il progetto in via di sviluppo (la versione corrente è la 0.0.3), probabilmente nessuno si è ancora preso la briga di scrivere due righe sull’argomento… quindi ho dovuto andarci per tentativi! :P
L’installazione è semplice:
# gem install mediacloth
... mentre nel controller o nel modulo che si occuperà del rendering, servirà qualcosa del genere:
require 'mediacloth' parser = MediaWikiParser.new parser.lexer = MediaWikiLexer.new ast = parser.parse(input) generator = MediaWikiHTMLGenerator.new generator.parse(ast) output = generator.html
Quello che nessuno vi dirà mai è che… è proprio qui che si deve intervenire per includere il nostro gestore di link!
Prima di tutto creiamo il file lib/mywikilinkhandler.rb :require 'mediacloth'
require 'builder'
class MyWikiLinkHandler < MediaWikiLinkHandler
def url_for(page)
"/wiki/#{page}" # ... PER ESEMPIO
end
def link_attributes_for(page)
{ :href => url_for(page) }
end
def link_for(page, text)
elem.a(link_attributes_for(page)) { |x| x << text }
end
def link_for_resource(prefix, resource, options=[])
case prefix
when 'Image' # ANALOGAMENTE E' POSSIBILE AGGIUNGERE ALTRI TIPI DI RISORSA
"<img src=\"/images/#{resource}\" alt=\"#{resource}\" />"
else
link_for "#{resource}",
!(options.empty?) ? options.join(', ') : "#{resource}"
end
end
protected
def elem
Builder::XmlMarkup.new
end
end
... e poi modifichiamo il codice di prima, dicendogli di utilizzare il nuovo link handler:
require 'mediacloth' require 'mywikilinkhandler' parser = MediaWikiParser.new parser.lexer = MediaWikiLexer.new ast = parser.parse(input) generator = MediaWikiHTMLGenerator.new generator.link_handler = MyWikiLinkHandler.new generator.parse(ast) output = generator.html
Fatto! :)
Adesso il parser riconoscerà [[Link interno]], [http://www.brunomendola.net Link esterno] e [[Image:immagine.png]].
Per una panoramica sulla sintassi wiki, fate riferimento alla guida base di MediaWiki.
Opzionalmente, se proprio voleste realizzare un super-wiki, c’è la possibilità di utilizzare un altro plugin per fare il rendering delle differenze tra le diverse versioni dei documenti: diff-lcs un porting in linguaggio Ruby del famoso algoritmo Diff che viene utilizzato un po’ dappertutto.
Al contrario di MediaCloth, questo plugin è molto ben documentato… basta leggere e programmare! :)
Spero che questo post faccia risparmiare tempo a qualche programmatore in cerca di lumi :)
Buon divertimento!







