E’ una notizia talmente ovvia che non sembra neppure una notizia, ma qualcuno ha sviuppato un plugin per Ruby on Rails che permette di fare il rendering in HTML delle pagine scritte con la sintassi di MediaWiki… cioè lo stesso software utilizzato da Wikipedia. :)
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 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 “”/images/#{resource}\" alt=\“#{resource}\” />" else link_for “#{resource}”, !(options.empty?) ? options.join(’, ’) : “#{resource}” end end protected def elem Builder::XmlMarkup.new end
def url_for(page)
“/wiki/#{page}” # … PER ESEMPIO
endend
… 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: blank">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!












