Annotation of Amaya/amaya/HTML.trans, revision 1.25
1.1 cvs 1: ! Use of the file HTML.trans
2: !!!!!!!!!!!!!!!!!!!!!!!!!!!!
3: ! This file can be edited during an Amaya session. It will be
4: ! dynamically parsed when the transformation tool is required by
1.2 cvs 5: ! the editor. So new transformations can be added while editing.
1.1 cvs 6: !
7: ! Syntax of the transformation language for Amaya
8: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
9: !
10: ! comments begin with !
11: !
12: ! This file can be edited during an Amaya session. It will be
13: ! dynamically parsed when the transformation tool is required by
1.2 cvs 14: ! the editor. So new transformations can be added while editing.
1.1 cvs 15: !
16: ! A tranformation rule has three parts :
17: ! - a name terminated by a colon ":"
18: ! - a source pattern terminated by a semi-colon ";"
19: ! - and a list of rules between braces "{" "}", each one
1.2 cvs 20: ! terminated by a semi-colon ";"
1.1 cvs 21: !
22: ! The name will appear in the transform menu.
23: !
24: ! The pattern gives of a specific organization of the elements
25: ! to be transformed: it contains HTML tags and SGML-like syntax
26: ! for the composition operators:
1.10 cvs 27: ! e1 | e2 for a choice between elements e1 and e2
28: ! e1 , e2 for a sequence e1 followed by e2
29: ! e+ for a sequence of one or more elements e
30: ! ?e for an optional element e
31: ! ( ) for grouping nodes
1.1 cvs 32: ! The braces "{" "}" define the content of a node.
33: ! The symbol "*" is a token that matches any element type
34: ! It is possible to rename a tag by preceeding it with a name
35: ! followed by a colon ":"
36: !
37: ! A rule expresses transformations to be applied to the elements
1.10 cvs 38: ! identified in the pattern. They have two parts :
39: ! - a source identifier: a tag or a name which occurs in
40: ! the pattern and links the rule to the pattern nodes
41: ! - a rule body: drives the transformation
42: ! Each rule end with a symbol ";"
43: !
44: ! there are two kinds of rule bodies:
45: ! - A discard rule body is slash and express that the correspoding
46: ! pattern node does not occurin the transformation result
47: !
48: ! - A generation rule begins with
49: ! - a symbol ">"
1.1 cvs 50: ! - and a target tag list. This list is itself divided into
51: ! two parts separated by a colon":":
52: ! * the generation location path
53: ! * and the list of tags to be generated
54: ! The dot symbol "." is used for descending in the tree structure.
55: ! if the special token star "*" ends the list of tags to be
56: ! generated, the source elment tag is not changed but this element
57: ! can be moved in a different place in the destination.
1.10 cvs 58: !
1.25 ! cvs 59: ! The rules are applied in the order the identifiers are met when
1.10 cvs 60: ! (depth first) traversing the source structure.
61: ! Several rules may have the same identifier, in that case, the rules
62: ! are applied in the order they are defined.
1.1 cvs 63:
64: ! Transformation rules
65: !!!!!!!!!!!!!!!!!!!!!!
66:
1.9 cvs 67: Address:(P{*+})+;
68: {
69: * > ADDRESS:*;
70: }
71:
1.1 cvs 72: !between lists
73: !!!!!!!!!!!!!!
74:
1.20 cvs 75: Definition list:*{(LI{(list:*{(li2:LI)+}|other:*)+})+};
1.1 cvs 76: {
1.20 cvs 77: other > DL:DT;
1.1 cvs 78: list > DL:DD;
79: li2 > DL.DD:;
80: }
81:
82: Bulleted list:(DL{(DT|DD{(*)+})+})+;
83: {
1.9 cvs 84: DT > UL:LI;
1.1 cvs 85: * > UL.LI.UL:LI.*;
86: }
87:
88: Numbered list:(DL{(DT|DD{(*)+})+})+;
89: {
1.9 cvs 90: DT > OL:LI;
1.1 cvs 91: * > OL.LI.OL:LI.*;
92: }
93:
1.20 cvs 94: Remove DL: (DL{(DT{(dtc:*)+}|DD{(ddc:*)+})+})+;
1.1 cvs 95: {
1.20 cvs 96: dtc > :<* style="font-weight:bold">;
97: ddc > :*;
1.1 cvs 98: }
99:
100: !flattering headings
101: !!!!!!!!!!!!!!!!!!!!
102:
103: Paragraphs:
104: (H1|H2|H3|H4|H5|H6|*{(LI{(il:*)+})+}),(H1|H2|H3|H4|H5|H6|P|*{(LI{(il:*)+})+})+;
105: {
106: H1 > :P;
107: H2 > :P;
108: H3 > :P;
109: H4 > :P;
110: H5 > :P;
111: H6 > :P;
112: P > :P;
113: il > :P;
114: }
115:
116: ! Preformatted to/from paragraphs
117: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
118:
1.20 cvs 119: !Preformatted: P+;
120: ! {
121: ! P>:PRE;
122: ! }
1.1 cvs 123:
1.20 cvs 124: !Paragraph: PRE+;
125: ! {
126: ! PRE>:P;
127: ! }
1.1 cvs 128:
129:
130:
131:
132: !Tables to/from lists
133: !!!!!!!!!!!!!!!!!!!!
134:
135: Table: *{(lev1:LI{?(*{(lev2:LI)+}|elem:*)+})+};
136: {
137: lev1 > <TABLE border=1>:TR;
138: elem > TABLE.TR:TD.*;
139: lev2 > TABLE.TR:TD;
140: }
141:
142: Table: DL{(DT|DD)+};
143: {
144: DT > <TABLE border=1>.TBODY:TR.TD;
145: DD > TABLE.TBODY.TR:TD;
146: }
147:
1.11 cvs 148: Numbered List:TABLE{?CAPTION,(block:*{(TR{(TD|TH),?(TD2:TD|TH2:TH)+})+})+};
1.1 cvs 149: {
1.12 cvs 150: CAPTION > :OL.LI.STRONG;
1.11 cvs 151: block > :OL;
1.1 cvs 152: TR > OL:LI;
153: TD > OL.LI:;
1.11 cvs 154: TH > OL.LI:;
1.1 cvs 155: TD2 >OL.LI.UL:LI;
1.11 cvs 156: TH2 >OL.LI.UL:LI;
1.1 cvs 157: }
158:
1.11 cvs 159: Bulleted List:TABLE{?CAPTION,(block:*{(TR{(TD|TH),?(TD2:TD|TH2:TH)+})+})+};
1.1 cvs 160: {
1.12 cvs 161: CAPTION > :UL.LI.STRONG;
1.11 cvs 162: block > :UL;
1.1 cvs 163: TR > UL:LI;
164: TD > UL.LI:;
1.11 cvs 165: TH > UL.LI:;
1.1 cvs 166: TD2 >UL.LI.UL:LI;
1.11 cvs 167: TH2 >UL.LI.UL:LI;
1.1 cvs 168: }
1.20 cvs 169: Definition List:TABLE{?CAPTION,(block:*{(TR{(TD|TH),?(TD2:TD|TH2:TH)+})+})+};
170: {
171: CAPTION > :DL.DT;
172: block > :DL;
173: TD > DL:DT;
174: TH > DL:DT;
175: TD2 > DL:DD;
176: TH2 > DL:DD;
177: }
1.1 cvs 178:
179: ! List transformations
180: !!!!!!!!!!!!!!!!!!!!!!
181:
182: Remove one level: *{(LI{(cont:*)+})+};
183: {
184: cont > :*;
185: }
186:
187: Remove two levels: *{(LI{(*{?(LI{(Lev2:*)+})+})+})+};
188: {
189: Lev2 > :*;
190: }
191:
192: Merge Items: LI,(LI2:LI)+;
193: {
194: LI > LI:;
195: LI2 > LI:;
196: }
1.23 cvs 197: Remove Paragraph level: LI{P{(cont:*)+},?(next:*)+};
198: {
199: LI > LI:;
200: cont > *;
201: next > *;
202: }
1.1 cvs 203:
204: Split Items: (LI{a:*,(b:*)+})+;
205: {
206: a > :LI.*;
207: b > :LI.*;
208: }
209:
210: Merge Lists: UL{LI+},(UL{LI+})+;
211: {
212: LI > UL:LI;
213: }
214:
215: Merge Lists: OL{LI+},(OL{LI+})+;
216: {
217: LI > OL:LI;
218: }
219:
220: Merge Lists: DL{(DT|DD)+},(DL{(DT|DD)+})+;
221: {
222: DT > DL:DT;
223: DD > DL:DD;
224: }
225:
226: ! Forms to/from elements
227: !!!!!!!!!!!!!!!!!!!!!!!!
228:
229: Form: *+;
230: {
231: *>Form:*;
232: }
233:
234: Remove Form: FORM{*+};
235: {
236: *>:*;
237: }
238:
1.16 cvs 239: Remove submenu: (OPTGROUP{*+})+;
240: {
241: * > :*;
242: }
243:
1.1 cvs 244: ! Lists to/from elements
245: !!!!!!!!!!!!!!!!!!!!!!!!
246:
1.9 cvs 247: Bulleted list: (P|OL|MENU|DIR|PRE|FORM)+;
1.1 cvs 248: {
1.24 cvs 249: P > UL:<LI style=P.style>;
1.9 cvs 250: OL> UL;
1.1 cvs 251: MENU> UL:LI.MENU;
252: DIR> UL:LI.DIR;
253: PRE> UL:LI.PRE;
254: FORM> UL:LI.FORM;
255: }
256:
1.9 cvs 257: Numbered list:(P|UL|MENU|DIR|PRE|FORM)+;
1.1 cvs 258: {
1.9 cvs 259: P > OL:LI;
260: UL> OL;
1.1 cvs 261: MENU> OL:LI.MENU;
262: DIR> OL:LI.DIR;
263: PRE> OL:LI.PRE;
264: FORM> OL:LI.FORM;
265: }
266:
267: ! Tables to/from elements
268: !!!!!!!!!!!!!!!!!!!!!!!!!
269:
270: !Table: (H:H1|H:H2|H:H3|H:H4|H:H5|H:H6|P),(H:H1|H:H2|H:H3|H:H4|H:H5|H:H6|*)+;
271: ! {
272: ! P> <TABLE border=1>.TR.TD:P;
273: ! H> <TABLE border=1>:TR.TD.*;
274: ! *> <TABLE border=1>.TR:TD.*;
275: ! }
276:
277:
1.15 cvs 278: Vertical Table: *+;
1.1 cvs 279: {
280: *><TABLE border=1>:TR.TD.*;
281: }
282:
1.15 cvs 283: Horizontal Table : *+;
1.1 cvs 284: {
285: *><TABLE border=1>.TR:TD.*;
286: }
287:
1.11 cvs 288: Remove Table:TABLE{?CAPTION,?(body:*{(TR{(*{(?cell_content:*)+})+})+})+};
1.1 cvs 289: {
290: CAPTION>H3;
291: cell_content>:*;
292: }
293:
1.11 cvs 294: Transpose Table:TABLE{TBODY{TR{(TD|TH)+}|(TR{td2:TD|th2:TH})+}};
1.1 cvs 295: {
1.11 cvs 296: TD><TABLE BORDER=TABLE.BORDER>:TR.TD;
297: TH>TABLE:TR.TD;
298: td2><TABLE BORDER=TABLE.BORDER>.TR:TD;
299: th2>TABLE.TR:TD;
1.1 cvs 300: }
301:
1.11 cvs 302: Heading Cell :?(TD|TH)+,TD,?(TD|TH)+;
303: {
304: TD>:TH;
305: }
306:
307: Data Cell :?(TD|TH)+,TH,?(TD|TH)+;
308: {
309: TH>:TD;
310: }
1.1 cvs 311:
312: !headings to/from definitions
313: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
314:
1.9 cvs 315: Definition list:((H1|H2|H3|H4|H5|H6),*+)+;
316: {
317: H1 > DL:DT;
318: H2 > DL:DT;
319: H2 > DL:DT;
320: H3 > DL:DT;
321: H4 > DL:DT;
322: H5 > DL:DT;
323: H6 > DL:DT;
324: * > DL.DD:*;
325: }
326:
327:
1.1 cvs 328: Definition list:(H1,?HR,?(level1:*)+,?(H2,?(level2:*)+,?((H3|H4|H5|H6),(level3:*)+)+)+)+;
329: {
330: H1 > DL:DT;
331: level1>DL.DD:*;
332: H2 > DL.DD:DL.DT ;
333: level2 > DL.DD.DL.DD:*;
334: H3 > DL.DD.DL.DD:DL.DT ;
335: H4 > DL.DD.DL.DD:DL.DT ;
336: H5 > DL.DD.DL.DD:DL.DT ;
337: H6 > DL.DD.DL.DD:DL.DT ;
338: level3 > DL.DD.DL.DD.DL.DD:*;
339: }
340:
341: Definition list:(H2,?HR,?(level1:*)+,(H3,?(level2:*)+,((H4|H5|H6),(level3:*)+)+)+)+;
342: {
343: H2 > DL:DT;
344: level1>DL.DD:*;
345: H3 > DL.DD:DL.DT ;
346: level2 > DL.DD.DL.DD:*;
347: H4 > DL.DD.DL.DD:DL.DT ;
348: H5 > DL.DD.DL.DD:DL.DT ;
349: H6 > DL.DD.DL.DD:DL.DT ;
350: level3 > DL.DD.DL.DD.DL.DD:*;
351: }
352:
353:
354:
355: Definition list:(H3,?HR,?(level1:*)+,?(H4,?(level2:*)+,((H5|H6),(level3:*)+)+)+)+;
356: {
357: H3 > DL:DT;
358: level1>DL.DD:*;
359: H4 > DL.DD:DL.DT ;
360: level2 > DL.DD.DL.DD:*;
361: H5 > DL.DD.DL.DD:DL.DT ;
362: H6 > DL.DD.DL.DD:DL.DT ;
363: level3 > DL.DD.DL.DD.DL.DD:*;
364: }
365:
366: Multi level Definition list:(H4,?HR,?(level1:*)+,(H5,?(level2:*)+,((H6)+,(level3:*)+)+)+)+;
367: {
368: H4 > DL:DT;
369: level1>DL.DD:*;
370: H5 > DL.DD:DL.DT ;
371: level2 > DL.DD.DL.DD:*;
372: H6 > DL.DD.DL.DD:DL.DT ;
373: level3 > DL.DD.DL.DD.DL.DD:*;
374: }
375:
376:
1.8 cvs 377:
1.1 cvs 378: Headings H1:(DL{(dt1:DT|DD{(DL{(dt2:DT|DD{(DL{(dt3:DT|DD{content:*})+}|content:*)+})+}|content:*)+})+}|HR)+;
379: {
380: dt1 > :H1;
381: dt2 > :H2;
382: dt3 > :H3;
383: content > :*;
384: }
385:
386: Headings H2:(DL{(dt1:DT|DD{(DL{(dt2:DT|DD{(DL{(dt3:DT|DD{content:*})+}|content:*)+})+}|content:*)+})+}|HR)+;
387: {
388: dt1 > :H2;
389: dt2 > :H3;
390: dt3 > :H4;
391: content > :*;
392: }
393:
394:
395: Headings H3:(DL{(dt1:DT|DD{(DL{(dt2:DT|DD{(DL{(dt3:DT|DD{content:*})+}|content:*)+})+}|content:*)+})+}|HR)+;
396: {
397: dt1 > :H3;
398: dt2 > :H4;
399: dt3 > :H5;
400: content > :*;
401: }
402:
1.8 cvs 403: Definition list: P,*+;
1.1 cvs 404: {
1.8 cvs 405: P > DL:DT;
406: * > DL.DD:*;
1.1 cvs 407: }
408:
409: Remove Div: (DIV{*+})+;
410: {
1.3 cvs 411: * > :*;
412: }
413:
1.14 cvs 414: Remove Center: (CENTER{*+})+;
415: {
416: * > :*;
417: }
418:
1.23 cvs 419: Remove Paragraph level: P{IMG};
420: {
421: IMG > :*;
422: }
1.1 cvs 423:
1.19 cvs 424: Remove BlockQuote: BLOCKQUOTE{*+};
1.1 cvs 425: {
426: * > :*;
427: }
428:
1.19 cvs 429: Remove FONT: FONT{*+};
1.1 cvs 430: {
431: * > :*;
432: }
1.4 cvs 433:
1.9 cvs 434: Remove SPAN: SPAN{*+};
435: {
436: *>:*;
437: }
1.13 cvs 438:
439: Remove Subscript: SUB{*+};
440: {
441: * > :*;
442: }
1.9 cvs 443:
1.13 cvs 444: Remove Superscript: SUP{*+};
445: {
446: * > :*;
447: }
448:
449: Remove Quotation: Q{*+};
450: {
451: * > :*;
452: }
453:
454: Remove BiDi: BDO{*+};
455: {
456: * > :*;
457: }
458:
1.9 cvs 459: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
460: ! Global Document transformation tests !
461: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
462:
463: DistrThot: BODY{*+}
464: {
465: BODY > <TABLE border=0 with="100%">.TBODY.TR.<TD with="30%">.<A href="http://opera.inrialpes.fr/OPERA/Thot.en.html"><IMG src="thot.gif" alt="Thot Editor" border=0 align="middle">;
466: BODY > TABLE.TBODY.TR.TD:<A href = "http://opera.inrialpes.fr">.<IMG src="opera.gif" alt="Opera project" border=0 align="middle">;
467: BODY > TABLE.TBODY.TR:TD.<IMG src="guide.gif" alt="Documentation" border=0 align="middle">;
468: BODY > TABLE.TBODY.TR.TD:H1."Title of the page";
469: BODY > :<TABLE border=0 with="100%">.TBODY.TR.<TD with="30%">.H2.<A href="Index.html">."Home";
470: * > TABLE.TBODY.TR:TD.*;
471: }
1.10 cvs 472:
Webmaster