Domanda

sto cercando di analizzare (in Java) Wikimedia markup come si trova su Wikipedia. Ci sono una serie di pacchetti esistenti là fuori per questo compito, ma non ho trovato alcuna per soddisfare le mie esigenze particolarmente bene. Il pacchetto migliore che ho lavorato con la Mathclipse Bliki parser , che fa un lavoro decente su più pagine.

Questo parser è incompleta, però, e non riesce a analizzare alcune pagine o analizza in modo errato su altri. Purtroppo il codice è piuttosto disordinato e fissando così i problemi in questo motore di analisi richiede molto tempo e soggetto a errori.

Nel tentativo di trovare una migliore motore di analisi che ho studiato utilizzando un parser EBNF-based per questo compito (in particolare ANTLR). Dopo alcuni tentativi tuttavia sembra che questo approccio non è particolarmente adatto per questo compito, come la marcatura Wikimedia è relativamente rilassato e quindi non può essere facilmente inserita in una grammatica strutturata.

La mia esperienza con ANTLR e parser simili è molto limitato comunque, quindi potrebbe essere la mia inesperienza che sta causando problemi, piuttosto che tali parser che sono intrinsecamente poco adatta per questo compito. qualcuno con più esperienza su questi argomenti può pesare qui?

@Stobor: Ho detto che ho guardato vari motori di analisi, compresi quelli restituiti dalla query di Google. Il migliore che ho trovato finora è il motore Bliki. Il problema è che risolvere i problemi con questi parser diventa incredibilmente noioso, perché sono tutti essenzialmente lunghe catene di condizionali e le espressioni regolari, con conseguente spaghetti code. Sto cercando qualcosa di più simile al metodo EBNF di analisi, come che il metodo è molto più chiara e concisa, e quindi più facile da capire ed evolversi. Ho visto le MediaWiki link che hai postato, e sembra confermare i miei sospetti che EBNF fuori dalla scatola è poco adatta per questo compito. Così sto cercando un motore di analisi che siano chiare e comprensibili come EBNF, ma anche in grado di gestire la sintassi disordinato di markup wiki.

È stato utile?

Soluzione

L'analisi di contenuto MediaWiki in ogni senso generico è praticamente impossibile a breve utilizzando MediaWiki stessa. Al fine di analizzarlo è necessario essere in grado pienamente analizzare HTML e CSS (dal momento che possono essere incorporati), e di gestire il full modello di istanze e di espansione, così come qualsiasi aggiunta parser il contenuto relevent potrebbe essere stato utilizzato. Questo modello di istanza è equivalente a un preprocessore.

È per certi versi similare a parsing C ++ tranne il parser anche gestire l'input valido ed aggiunte sintassi arbitrarie da parte degli interni parser. L'implementazione effettiva MediaWiki è molto simile a Perl 5, l'implementazione originale non era così male, perché tutti i casi limite appena cadono però le cose sono collegate tra loro, ma in realtà sempre ogni successiva implementazione di fare la stessa cosa è davvero complicato, soprattutto perché il comportamenti sono spesso emergenti e non documentata, non progettati.

Se non avete bisogno di 100% delle pagine di lavorare o di essere in grado di estrarre tutti i contenuti che si potrebbe essere in grado a mettere insieme qualcosa che funziona per voi, e come hai notato ci sono alcuni pacchetti che lo fanno. Breve di conoscere le vostre esigenze precise effettive dubito che qualcuno può dare una risposta sostanzialmente migliore su come analizzarlo. Se avete bisogno di essere in grado di lavorare in ogni pagina e corretto analizzare tutto quello che hai di meglio di una abbastanza grande squadra e diversi anni per lavorare, e anche allora avete ancora un sacco di piccoli casi limite.

Così, in breve, senza una grammatica EBNF non è adatto per l'analisi MediaWiki markup, ma niente è davvero ...

Altri suggerimenti

Hai ragione Wikimedia non si presta a EBNF Grammers ben definiti.

Si dovrà guardare strumenti che BackTrack per essere in grado di analizzare Wiki

btyacc che è un Yacc backtracking. http://www.siber.com/btyacc/

Si potrebbe guardare a Accent. Meglio di Yacc http://accent.compilertools.net/

In alternativa si può avere a ripartizione e imparare un po 'il sapore del prologo and roll si possiede. Qualunque cosa tu hai un periodo di apprendimento interessante davanti a voi.

In bocca al lupo

Una volta ho provato a scrivere un parser per Boost.Quickbook , che è essenzialmente lo stesso del wiki-testo utilizzato da Wikipedia.

E 'stato un processo molto noioso solo per ottenere alcuni principi fondamentali di lavoro, ma penso che alla fine, sarebbe possibile scrivere EBNF grammatica per esso. Se siete interessati, mio parser parziale è disponibile on-line (la grammatica è incorporato nel doc-stringhe).

Questa risposta è un po 'là fuori, ma per quanto riguarda il rendering del testo e poi l'analisi del DOM HTML al fine di capire diverse componenti wiki.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top