Recherche Parseur
GreG1-May-2006/16:14:32+2:00
Pour le present forum, il faudrait un parseur qui prend en entree le message original et qui en sortie cree le message HTML qui sera affiche.
Il faut:
- reperer les newline et les transformer en <br>
- reperer les URLs qui commencent par http:// ou www
- reperer les balises [code][/code]? ou [code][/code]? le texte ainsi identifier subira un color-code.r
- reperer les smileys qui seront transformer en images
- reperer les balises [makedoc][/makedoc]

Merci d'avance aux volontaires!
GreG
Reb-Kodeur2-May-2006/9:09:13+2:00
Pour les newline

replace/all texte "^/" "<br>"
reboltof2-May-2006/10:29:18+2:00
GreG, donnes-moi tes specs ainsi que quelques exemples d'input et d'ouput attendu. Comme je travaille assez bien avec le parseur, je ne pense pas que ce code pose de gros problèmes...
GreG2-May-2006/15:32:34+2:00
Le but est de processer chaque message en une seule pass.
Aujourd'hui deja je fais un replace/all pour les <br>, puis je fais un parse pour les URLs, etc...

quelques exemples, j'ecris newline en toute lettres:

input: {salut newline il faut un parseur}
output: {salut <br> il faut un parseur}


input: {allez voir ici www.rebol.com}
output: {allez voir ici <a href=http://www.rebol.com>www.rebol.com</a>}

input: {allez voir ici http://www.rebol.com}
output: {allez voir ici <a href=http://www.rebol.com>www.rebol.com</a>}


input: {exemple:
parse/all input rules
}
output: faire un color-code de ce qu'il y a entre
 et 
et faire un append du resultat a l'output


input: {}
ouput: {<img src="smiley" border="0">}
reboltof3-May-2006/22:14:33+2:00
OK, je m'y met ASAP...
Reb-Kodeur4-May-2006/9:50:55+2:00
Pour les smileys tu peux deja faire un replace/all
Didec4-May-2006/22:04:23+2:00
Le parseur de lecture-forum pourrait être une base de départ, peut-être.

Il est dans module\lecture-message.r le contexte ctx-parse juste au début.
Il reconnait déjà les balises du forum Codeur.org, les sauts de lignes, les urls...

Ajouter les balises [makedoc] = une ligne dans la liste des balises.
Pour les smileys, faut voir :-\

Evidemment, là les actions ont pour but de générer du dialect RTD pour l'affichage, mais c'est facilement remplacable par de la génération de texte (HTML).

Je suis désolé de ne pouvoir y regarder moi même pour le moment, mais je pars pour une semaine de congé demain soir.
reboltof8-May-2006/13:59:43+2:00
Comme promis...

Il existe évidement plusieurs approche du problème. J'ai choisi une utilisation simple du parseur, facilitant le debogage et la maintenance, plutôt qu'une suite de régles récursives, assez indigeste...

Il t'est facile maintenant d'adapter les régles ou d'en ajouter d'autres, en te basant sur celles existantes. Par exemple pour parser d'autres smileys

Je conseille, pour la clarté du code, d'imposer l'emploi d'URL commençant par "http://".

*** CODE **************************

rebol []

str: {

salut newline il faut un parseur
allez voir ici www.rebol.com
ou http://www.rebol.org
ou encore http://rebdocproj.org
et là encore www.reboltalk.com
et là encore http://www.reboltalk.com
exemple:
parse/all input rules


[makedoc]=== title1
- text

- text

\note attention

note body

/note

text

[/makedoc]
text sans rien de spécial
}

color-code: func
 [
    foreach tag ["[code]" "
"] [replace code tag ""]
code: rejoin [{ <div class="code">} trim code "</div>"]
code
]

makedoc: func [data] [
foreach tag ["[makedoc]" "[/makedoc]"] [replace data tag ""]
data: rejoin [{ <div class="makedoc">} data "</div>"]
data
]

rule-newline: [
to "newline" begin: to " " ending:
(change/part begin "<br />" ending)
]

rule-url: [
to " http" begin: copy txt [to "^/" | to " "] ending:
(
trim txt
url: copy rejoin [{ <a href="} txt {">} txt "</a>"]
change/part begin url ending
)
]

rule-code: [
to "
" begin: copy txt thru "
" ending:
(change/part begin color-code txt ending)
]

rule-makedoc: [
to "[makedoc]" begin: copy txt thru "[/makedoc]" ending:
(change/part begin makedoc txt ending)
]

rule-smiley: [
to "" begin: copy txt [to "^/" | to " "] ending:
(change/part begin {<img src="smiley" border="0">} ending)
]

rules: reduce [rule-smiley rule-url rule-code rule-newline rule-makedoc]
foreach rule rules [parse str [some rule to end]]

? str

halt

*** END CODE ***************

*** OUTPUT *****************

STR is a string of value: {
<img src="smiley" border="0">
salut <br /> il faut un parseur
allez voir ici www.rebol.com <img src="smiley" border="0">
ou <a href="http://www.rebol.org">http://www.rebol.org</a>
ou encore <a href="http://rebdocproj.org">http://rebdocproj.org</a>
et là encore www.reboltalk.com
et là encore <a href="http://www.reboltalk.com">http://www.reboltalk.com</a>
exemple: <div class="code">parse/all input rules</div> <img src="smiley" border="0">
<img src="smiley" border="0">
<div class="makedoc">=== title1
- text

- text

\note attention

note body

/note

text

</div>
text sans rien de spécial
}
** Press enter to quit...

*** END OUTPUT ******************
GreG8-May-2006/16:50:08+2:00
Super!
Je vais probablement integrer ce code ce soir.
reboltof9-May-2006/12:22:29+2:00
test

view layout [text "hello"]
Reb-Kodeur9-May-2006/14:31:58+2:00
Ce n'est pas très 'propre' mais ca marche

avant le parsing :

replace/all str "www." "http://www."
replace/all str "http://http://www." "http://www."
Reb-Kodeur9-May-2006/14:36:21+2:00
Concernant toutes ces transformations : il y a deux moyens de travailler :

- soit tu modifies le texte lors de l'entrée dans la BD (une seule fois et si dans ce cas bcp de travail de parsing ou autres, alors le travail n'est effectué qu'une seule fois)
- soit tu modifies le texte lors de sa sortie (parsing plusieurs fois)
Reb-Kodeur9-May-2006/14:37:18+2:00
Dans le 1er cas, tu stockes un texte contenant deja du html..
reboltof9-May-2006/16:52:59+2:00
Si tu tiens abolument au "www..." alors, ajoute la régle suivante aux autres:

rule-url2: [
thru " www" begin: copy txt [to "^/" | to " "] ending:
(
trim txt
url: copy rejoin [{ <a href="} txt {">} txt "</a>"]
change/part begin url ending
)
]

et rajoute-la au bloc rules:
rules: reduce [rule-smiley rule-url rule-url2 rule-code rule-newline rule-makedoc]

voilà...
GreG9-May-2006/16:53:49+2:00
J'ai realise un probleme avec le color-code: il lui faut une en-tete REBOL[], sinon ca marche pas.

Le dernier parseur a un probleme avec les urls... je ne sais pas trop pourquoi encore...

je prefere ne pas enregistrer de HTML car il est possible qu'un client comme lecture-forum veuille acceder a la base de messages. et je me dis que c'est plus sympa si il ne doit pas interpreter le HTML, en fait, chaque client fait son interpretation.
reboltof9-May-2006/16:57:32+2:00
si color-code est un script indépendant (et doit rester comme tel), alors un simple do %color-script.r en début de ton script devrait résoudre le problème... Ou je n'ai pas compris ?

Quand au parseur, il se peut que des formattages particuliers ne soit pas pris en compte. Là il faut juger sur pièce. Transmet-moi le code à parser et qui pose problème. Je vais voir ce que je peut faire.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2