Blog

bruno @ 19/01/2008 21:14 - No comments yet
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!
MediaCloth
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!


5.0/5 Stars
  • Currently 5.0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Name


Email


Website


Add comment