/[suikacvs]/messaging/manakai/lib/Message/Markup/SuikaWiki.dis
Suika

Contents of /messaging/manakai/lib/Message/Markup/SuikaWiki.dis

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations) (download)
Sat Dec 30 08:27:50 2006 UTC (17 years, 10 months ago) by wakaba
Branch: MAIN
Changes since 1.6: +5 -20 lines
++ manakai/bin/ChangeLog	30 Dec 2006 06:47:17 -0000
2006-12-30  Wakaba  <wakaba@suika.fam.cx>

	* idl2dis.pl: Removed.

++ manakai/lib/Message/Markup/ChangeLog	30 Dec 2006 08:26:03 -0000
	* Atom.dis, SuikaWiki.dis, H2H.dis: |WithFor|
	and |DefaultFor| properties are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Util/ChangeLog	30 Dec 2006 08:26:59 -0000
	* PerlCode.dis: |WithFor| and |DefaultFor| are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/DOM/ChangeLog	30 Dec 2006 08:25:38 -0000
        GenericLS.dis, TreeCore.dis, DOMString.dis,
        XML.dis, Element.dis, Document.dis, TreeStore,dis,
        Traversal.dis, XDoctype.dis, XMLParser.dis, DOMLS.dis,
        SimpleLS.dis, DOMMain.dis, XDP.dis: |WithFor| specifications
	and |DefaultFor|s are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

	* CharacterData.dis, DOMCore.dis, DOMFeature.dis,
++ manakai/lib/Message/URI/ChangeLog	30 Dec 2006 08:26:32 -0000
	* Generic.dis: |WithFor| and |DefaultFor| are removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/Message/Charset/ChangeLog	30 Dec 2006 08:24:04 -0000
	* Encode.dis (Require): |WithFor| specifications are removed.
	(DefaultFor): Removed.

2006-12-30  Wakaba  <wakaba@suika.fam.cx>

++ manakai/lib/manakai/ChangeLog	30 Dec 2006 07:46:56 -0000
2006-12-30  Wakaba  <wakaba@suika.fam.cx>

	* dis.pl: Removed.

1 wakaba 1.1 Module:
2     @QName: Markup|SuikaWiki
3     @enFN:
4     SuikaWiki/0.9 and SuikaWiki/0.10 Document Markup Language DOM
5     @enDesc:
6     {TODO::
7    
8     }
9    
10 wakaba 1.2 <Caption::Supported element types>
11    
12     - SuikaWiki/0.9 Structure:::
13     <XE::sw09|document>, <XE::xhtml2|head>, <XE::xhtml2|body>,
14     <XE::sw09|parameter> (deprecated), <XE::sw09|value> (deprecated),
15     <XE::sw09|replace> (deprecated), <XE::sw09|text> (deprecated)
16    
17     - SuikaWikiImage/0.9 Structure:::
18     <XE::sw09|image> (deprecated)
19    
20     - SuikaWiki/0.9 Block-level:::
21     <XE::xhtml2|section>, <XE::xhtml2|blockquote>, <XE::html3|bodytext>,
22     <XE::sw09|insert>, <XE::sw09|delete>,
23     <XE::xhtml2|ul>, <XE::xhtml2|ol>, <XE::xhtml2|dl>,
24     <XE::xhtml2|li>, <XE::sw09|dr>, <XE::xhtml2|dt>, <XE::xhtml2|dd>,
25     <XE::xhrml2|p>, <XE::xhtml2|pre>
26    
27     - SuikaWiki/0.10 Block-level:::
28     <XE::sw010|ed>, <XE::sw010|comment-p>
29    
30     - SuikaWiki/0.9 Table:::
31     <XE::xhtml2|table>, <XE::xhtml2|tbody>,
32     <XE::xhtml2|tr>, <XE::xhtml2|td>
33    
34     - SuikaWiki/0.9 Hyperlink:::
35     <XE::sw09|anchor-external>, <XE::sw09|anchor-internal>,
36     <XE::sw09|anchor-end>, <XE::sw09|form>
37    
38     - SuikaWiki/0.9 Phrase:::
39     <XE::xhtml2|dfn>, <XE::xhtml2|q>, <XE::xhtml2|sub>, <XE::xhtml2|sup>,
40     <XE::xhtml2|abbr>, <XE::xhtml2|ruby>, <XE::sw09|rubyb>,
41     <XE::xhtml2|rb>, <XE::xhtml2|rt>, <XE::xhtml2|var>,
42     <XE::xhtml2|code>, <XE::xhtml2|kbd>, <XE::xhtml2|samp> (deprecated),
43     <XE::xhtml2|del>, <XE::xhtml2|ins>, <XE::sw09|anchor>,
44     <XE::xhtml2|em>, <XE::xhtml2|strong>, <XE::sw09|weak>
45    
46     - SuikaWiki/0.10 Phrase::
47     <XE::sw010|aa>, <XE::sw010|key>, <XE::xhtml2|span>,
48     <XE::xhtml2|cite>, <XE::sw010|csection>, <XE::sw010|src>,
49     <XE::sw010|qn>, <XE::sw010|qname>, <XE::sw010|nsuri>
50    
51 wakaba 1.1 @Namespace:
52     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/SuikaWiki/
53    
54     @DISCore:author: DISCore|Wakaba
55     @License: license|Perl+MPL
56     @Date:
57 wakaba 1.7 $Date: 2006/12/30 04:42:55 $
58 wakaba 1.1
59     @Require:
60     @@Module:
61     @@@QName: Markup|common
62     @@Module:
63     @@@QName: MDOM|TreeCore
64     @@Module:
65     @@@QName: Markup|Atom
66    
67     Namespace:
68     @aa:
69     http://pc5.2ch.net/test/read.cgi/hp/1096723178/aavocab#
70     @c:
71     http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#
72     @cfg:
73     http://suika.fam.cx/www/2006/dom-config/
74     @dis:
75     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
76     @doc:
77     http://suika.fam.cx/~wakaba/archive/2005/7/tutorial#
78     @d:
79     http://suika.fam.cx/~wakaba/archive/2004/dom/xdt#
80     @DOMMain:
81     http://suika.fam.cx/~wakaba/archive/2004/dom/main#
82     @dx:
83     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/DOMException#
84     @ecore:
85     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/Error/Core/
86     @f:
87     http://suika.fam.cx/~wakaba/archive/2004/dom/feature#
88     @fe:
89     http://suika.fam.cx/www/2006/feature/
90     @gls:
91     http://suika.fam.cx/~wakaba/archive/2004/dom/gls#
92     @html:
93     http://www.w3.org/1999/xhtml
94     @idl:
95     http://suika.fam.cx/~wakaba/archive/2004/dis/IDL#
96     @kwd:
97     http://suika.fam.cx/~wakaba/archive/2005/rfc2119/
98     @lang:
99     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#
100     @license:
101     http://suika.fam.cx/~wakaba/archive/2004/8/18/license#
102     @ManakaiDOM:
103     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#
104     @mat:
105     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/Atom/
106     @Markup:
107     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup#
108     @mat:
109     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup/Atom/
110     @MDOM:
111     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM.
112     @MDOMX:
113     http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception#
114     @dlp:
115     http://suika.fam.cx/~wakaba/archive/2004/dis/Perl#
116     @html3:
117     urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:
118     @html5:
119     http://www.w3.org/1999/xhtml
120     @rel:
121     http://www.iana.org/assignments/relation/
122     @s:
123     http://suika.fam.cx/~wakaba/archive/2004/dis/Markup#
124     @sw09:
125     urn:x-suika-fam-cx:markup:suikawiki:0:9:
126     @sw010:
127     urn:x-suika-fam-cx:markup:suikawiki:0:10:
128     @tc:
129     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/TreeCore/
130     @td:
131     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Document/
132     @te:
133     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/Element/
134     @test:
135     http://suika.fam.cx/~wakaba/archive/2004/dis/Test#
136     @tx:
137     http://suika.fam.cx/~wakaba/archive/2005/manakai/DOM/XML/
138     @urigen:
139     http://suika.fam.cx/~wakaba/archive/2005/manakai/URI/Generic/
140     @xhtml2:
141     http://www.w3.org/2002/06/xhtml2/
142     @xml:
143     http://www.w3.org/XML/1998/namespace
144     @xmlns:
145     http://www.w3.org/2000/xmlns/
146    
147     ElementTypeBinding:
148     @Name: CODE
149     @ElementType:
150     dis:ResourceDef
151     @ShadowContent:
152     @@DISCore:resourceType: dlp|BlockCode
153     @@ForCheck: ManakaiDOM|ForClass
154    
155     ElementTypeBinding:
156     @Name: Method
157     @ElementType:
158     dis:ResourceDef
159     @ShadowContent:
160     @@DISCore:resourceType: DISLang|Method
161     @@ForCheck: !=ManakaiDOM|ManakaiDOM
162    
163     ElementTypeBinding:
164     @Name: Param
165     @ElementType:
166     dis:ResourceDef
167     @ShadowContent:
168     @@DISCore:resourceType: DISLang|MethodParameter
169    
170     ElementTypeBinding:
171     @Name: Return
172     @ElementType:
173     dis:ResourceDef
174     @ShadowContent:
175     @@DISCore:resourceType: DISLang|MethodReturn
176    
177     ElementTypeBinding:
178     @Name: Attr
179     @ElementType:
180     dis:ResourceDef
181     @ShadowContent:
182     @@DISCore:resourceType: DISLang|Attribute
183    
184     ElementTypeBinding:
185     @Name: Get
186     @ElementType:
187     dis:ResourceDef
188     @ShadowContent:
189     @@DISCore:resourceType: DISLang|AttributeGet
190    
191     ElementTypeBinding:
192     @Name: Set
193     @ElementType:
194     dis:ResourceDef
195     @ShadowContent:
196     @@DISCore:resourceType: DISLang|AttributeSet
197    
198     ElementTypeBinding:
199     @Name: nullCase
200     @ElementType:
201     dis:ResourceDef
202     @ShadowContent:
203     @@DISCore:resourceType: ManakaiDOM|InCase
204     @@Value:
205     @@@is-null:1
206    
207     ElementTypeBinding:
208     @Name: PerlDef
209     @ElementType:
210     dis:Def
211     @ShadowContent:
212     @@ContentType: lang|Perl
213     @@ForCheck: ManakaiDOM|ForClass
214    
215     ElementTypeBinding:
216     @Name: PerlCDef
217     @ElementType:
218     dis:Def
219     @ShadowContent:
220     @@ContentType: lang|Perl
221    
222     ElementTypeBinding:
223     @Name: enImplNote
224     @ElementType:
225     dis:ImplNote
226     @ShadowContent:
227     @@lang:en
228    
229     ElementTypeBinding:
230     @Name: enFN
231     @ElementType:
232     dis:FullName
233     @ShadowContent:
234     @@lang:en
235    
236     ElementTypeBinding:
237 wakaba 1.3 @Name: PTests
238     @ElementType:
239     dis:ResourceDef
240     @ShadowContent:
241     @@ForCheck: ManakaiDOM|ForClass
242     @@DISCore:resourceType: test|ParserTestSet
243    
244     ElementTypeBinding:
245     @Name: PTest
246     @ElementType:
247     dis:ResourceDef
248     @ShadowContent:
249     @@ForCheck: ManakaiDOM|ForClass
250     @@DISCore:resourceType: test|ParserTest
251    
252     ElementTypeBinding:
253     @Name: DEnt
254     @ElementType:
255     dis:ResourceDef
256     @ShadowContent:
257     @@DISCore:resourceType: test|RootEntity
258    
259     ElementTypeBinding:
260 wakaba 1.1 @Name: IFClsETDef
261     @ElementType:
262     dis:ResourceDef
263     @ShadowContent:
264     @@DISCore:resourceType:
265     @@@@: dis|MultipleResource
266     @@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML
267     @@resourceFor: ManakaiDOM|ForIF
268     @@resourceFor: ManakaiDOM|ForClass
269     @@resourceFor: s|ForML
270    
271     @@DISCore:resourceType:
272     @@@@: DISLang|Interface
273     @@@ForCheck: ManakaiDOM|ForIF
274    
275     @@DISCore:resourceType:
276     @@@@: DISLang|Class
277     @@@ForCheck: ManakaiDOM|ForClass
278 wakaba 1.6
279 wakaba 1.1 @@Implement:
280 wakaba 1.7 @@@@: ||+||ManakaiDOM|ForIF
281 wakaba 1.1 @@@ContentType: DISCore|TFPQNames
282 wakaba 1.7 @@@ForCheck: ManakaiDOM|ForClass
283 wakaba 1.1
284     @@s:elementType:
285     @@@@: ||+||s|ForML
286     @@@ContentType: DISCore|TFPQNames
287     @@@DISCore:stopISARecursive:1
288    
289     @@DISCore:resourceType:
290     @@@@: s|ElementType
291     @@@ForCheck: s|ForML
292    
293     @@f:implements: AtomFeature10
294    
295     ElementTypeBinding:
296     @Name: IFClsDef
297     @ElementType:
298     dis:ResourceDef
299     @ShadowContent:
300     @@DISCore:resourceType:
301     @@@@: dis|MultipleResource
302     @@@ForCheck: !ManakaiDOM|ForIF !ManakaiDOM|ForClass !s|ForML
303     @@resourceFor: ManakaiDOM|ForIF
304     @@resourceFor: ManakaiDOM|ForClass
305    
306     @@DISCore:resourceType:
307     @@@@: DISLang|Interface
308     @@@ForCheck: ManakaiDOM|ForIF
309    
310     @@DISCore:resourceType:
311     @@@@: DISLang|Class
312     @@@ForCheck: ManakaiDOM|ForClass
313 wakaba 1.6
314 wakaba 1.1 @@Implement:
315 wakaba 1.7 @@@@: ||+||ManakaiDOM|ForIF
316 wakaba 1.1 @@@ContentType: DISCore|TFPQNames
317 wakaba 1.7 @@@ForCheck: ManakaiDOM|ForClass
318 wakaba 1.1
319     @@f:implements: AtomFeature10
320    
321     ElementTypeBinding:
322     @Name: IFQName
323     @ElementType:
324     dis:QName
325     @ShadowContent:
326     @@ForCheck: ManakaiDOM|ForIF
327    
328     ElementTypeBinding:
329     @Name: ClsQName
330     @ElementType:
331     dis:QName
332     @ShadowContent:
333     @@ForCheck: ManakaiDOM|ForClass
334    
335     ElementTypeBinding:
336     @Name: ETRQName
337     @ElementType:
338     dis:QName
339     @ShadowContent:
340     @@ForCheck: s|ForML
341    
342     ElementTypeBinding:
343     @Name: ETQName
344     @ElementType:
345     dis:AppName
346     @ShadowContent:
347     @@ForCheck: s|ForML
348     @@ContentType: DISCore|QName
349    
350     ElementTypeBinding:
351     @Name: IFISA
352     @ElementType:
353     dis:ISA
354     @ShadowContent:
355     @@ForCheck: ManakaiDOM|ForIF
356    
357     ElementTypeBinding:
358     @Name: ClsISA
359     @ElementType:
360     dis:ISA
361     @ShadowContent:
362     @@ForCheck: ManakaiDOM|ForClass
363    
364     ElementTypeBinding:
365     @Name: disDef
366     @ElementType:
367     dis:Def
368     @ShadowContent:
369     @@ContentType:
370     lang:dis
371     @@ForCheck: ManakaiDOM|ForClass
372    
373     ElementTypeBinding:
374     @Name: Code
375     @ElementType:
376     dis:ResourceDef
377     @ShadowContent:
378     @@DISCore:resourceType: dlp|InlineCode
379     @@ForCheck: ManakaiDOM|ForClass
380    
381     ElementTypeBinding:
382     @Name: Test
383     @ElementType:
384     dis:ResourceDef
385     @ShadowContent:
386     @@DISCore:resourceType: test|StandaloneTest
387     @@ForCheck: ManakaiDOM|ForClass
388    
389     ElementTypeBinding:
390     @Name: TestC
391     @ElementType:
392     dis:ResourceDef
393     @ShadowContent:
394     @@DISCore:resourceType: test|StandaloneTest
395    
396     ResourceDef:
397     @QName: Document
398     @AliasFor: td|Document
399    
400     ResourceDef:
401     @QName: Element
402     @AliasFor: te|Element
403    
404     ResourceDef:
405     @QName: Attr
406     @AliasFor: te|Attr
407    
408     ResourceDef:
409     @QName: DOMString
410     @AliasFor: DOMMain|DOMString
411    
412     ResourceDef:
413     @QName: DOMURI
414     @AliasFor: ManakaiDOM|ManakaiDOMURI
415    
416     ResourceDef:
417     @QName: DOMTimeStamp
418     @AliasFor: DOMMain|DOMTimeStamp
419    
420     ResourceDef:
421     @QName: boolean
422     @AliasFor: idl|boolean||ManakaiDOM|all
423    
424     ResourceDef:
425     @QName: Node
426     @AliasFor: tc|Node
427    
428     ResourceDef:
429     @QName: NodeList
430     @AliasFor: tc|NodeList
431    
432     ResourceDef:
433     @QName: StaticNodeList
434     @AliasFor: tc|StaticNodeList
435    
436     ElementTypeBinding:
437     @Name: enDesc
438     @ElementType:
439     dis:Description
440     @ShadowContent:
441     @@lang:en
442    
443     ElementTypeBinding:
444     @Name: TrueCase
445     @ElementType:
446     dis:ResourceDef
447     @ShadowContent:
448     @@DISCore:resourceType:
449     ManakaiDOM:InCase
450     @@Value:
451     @@@@: 1
452     @@@ContentType: DISCore|Boolean
453     @@Type: idl|boolean||ManakaiDOM|all
454    
455     ElementTypeBinding:
456     @Name: FalseCase
457     @ElementType:
458     dis:ResourceDef
459     @ShadowContent:
460     @@DISCore:resourceType:
461     ManakaiDOM:InCase
462     @@Value:
463     @@@@: 0
464     @@@ContentType: DISCore|Boolean
465     @@Type: idl|boolean||ManakaiDOM|all
466    
467     ## -- Features
468    
469     ElementTypeBinding:
470     @Name: FeatureDef
471     @ElementType:
472     dis:ResourceDef
473     @ShadowContent:
474     @@DISCore:resourceType: f|Feature
475     @@For: =ManakaiDOM|all
476    
477     ElementTypeBinding:
478     @Name: FeatureVerDef
479     @ElementType:
480     dis:ResourceDef
481     @ShadowContent:
482     @@DISCore:resourceType: f|Feature
483    
484     ElementTypeBinding:
485     @Name: featureQName
486     @ElementType:
487     f:name
488     @ShadowContent:
489     @@ContentType: DISCore|QName
490    
491     FeatureDef:
492     @featureQName: fe|SuikaWikiDML
493     @QName: SWDMLFeature
494     @FeatureVerDef:
495     @@QName: SWDMLFeature010
496     @@Version: 0.10
497     @@f:instanceOf: SWDMLFeature
498     @@f:requires: tx|XMLFeature30
499     @@enDesc:
500     The SuikaWiki Document Markup Language DOM, version 0.10.
501    
502     ## -- Implementation
503    
504     ## TODO:
505    
506     ## -- Elements
507    
508     IFClsDef:
509     @IFQName: SWDMLElement
510     @ClsQName: ManakaiSWDMLElement
511    
512     @IFISA: Element
513     @ClsISA: te|ManakaiDOMElement
514    
515     @s:elementType: AnySW09Element||ManakaiDOM|all
516     @s:elementType: AnySW010Element||ManakaiDOM|all
517     ##SWDMLElement
518    
519     ResourceDef:
520     @QName: AnySW09Element
521     @DISCore:resourceType: s|AnyElementInNS
522     @AppName:
523     @@@: sw09|*
524     @@ContentType: DISCore|QName
525     @ForCheck: =ManakaiDOM|all
526    
527     ResourceDef:
528     @QName: AnySW010Element
529     @DISCore:resourceType: s|AnyElementInNS
530     @AppName:
531     @@@: sw010|*
532     @@ContentType: DISCore|QName
533     @ForCheck: =ManakaiDOM|all
534    
535     IFClsETDef:
536     @IFQName: SWDMLDocumentElement
537     @ETQName: sw09|document
538     @ClsQName: ManakaiSWDMLDocumentElement
539    
540     @IFISA: SWDMLElement
541     @ClsISA: ManakaiSWDMLElement
542    
543     @Attr:
544     @@Name: headElement
545     @@enDesc:
546     The <XE::xhtml2|head> child element of the node.
547     @@Type: SWDMLElement
548     @@Get:
549     @@@enDesc:
550     It <kwd:MUST> <I::return a <XE::xhtml2|head> child element>
551     of the node.
552     @@@nullCase:
553     @@@@enDesc:
554     If the algorithm returns <DOM::null>.
555     @@@NodeReadOnlyError:
556     @@@PerlDef:
557     __CODE{mat|returnChildElement::
558     $node => $self,
559     $namespaceURI => {<Q::xhtml2|>},
560     $localName => 'head',
561     $r => $r,
562     }__;
563    
564     @Attr:
565     @@Name: bodyElement
566     @@enDesc:
567     The <XE::xhtml2|body> child element of the node.
568     @@Type: SWDMLElement
569     @@Get:
570     @@@enDesc:
571     It <kwd:MUST> <I::return a <XE::xhtml2|body> child element>
572     of the node.
573     @@@nullCase:
574     @@@@enDesc:
575     If the algorithm returns <DOM::null>.
576     @@@NodeReadOnlyError:
577     @@@PerlDef:
578     __CODE{mat|returnChildElement::
579     $node => $self,
580     $namespaceURI => {<Q::xhtml2|>},
581     $localName => 'body',
582     $r => $r,
583     }__;
584    
585     @Attr:
586     @@Name: markupLanguageName
587     @@enDesc:
588     The markup language name.
589    
590     It <kwd:MUST> <I::reflect the string value
591     of the <XA::sw09|Name> attribute> of the node. It default
592     value <kwd:MUST> be <CODE::SuikaWiki>.
593     @@Type: DOMString
594     @@Get:
595     @@@nullCase:
596     @@@@enDesc:
597     If the algorithm returns <DOM::null>.
598     @@@PerlDef:
599     __CODE{mat|getReflectAttrStringValue::
600     $node => $self,
601     $namespaceURI => {<Q::sw09|>},
602     $localName => 'Name',
603     $r => $r,
604     $defaultValue => 'SuikaWiki',
605     }__;
606     @@Set:
607     @@@nullCase:
608     @@@@enDesc:
609     Removes the attribute.
610     @@@NodeReadOnlyError:
611     @@@PerlDef:
612     __CODE{mat|setReflectAttrStringValue::
613     $node => $self,
614     $namespaceURI => {<Q::sw09|>},
615     $localName => 'Name',
616     $given => $given,
617     }__;
618    
619     @Attr:
620     @@Name: markupLanguageVersion
621     @@enDesc:
622     The markup language version.
623    
624     It <kwd:MUST> <I::reflect the string value
625     of the <XA::sw09|Version> attribute> of the node. It default
626     value <kwd:MUST> be <CODE::0.9>.
627     @@Type: DOMString
628     @@Get:
629     @@@nullCase:
630     @@@@enDesc:
631     If the algorithm returns <DOM::null>.
632     @@@PerlDef:
633     __CODE{mat|getReflectAttrStringValue::
634     $node => $self,
635     $namespaceURI => {<Q::sw09|>},
636     $localName => 'Version',
637     $r => $r,
638     $defaultValue => '0.9',
639     }__;
640     @@Set:
641     @@@nullCase:
642     @@@@enDesc:
643     Removes the attribute.
644     @@@NodeReadOnlyError:
645     @@@PerlDef:
646     __CODE{mat|setReflectAttrStringValue::
647     $node => $self,
648     $namespaceURI => {<Q::sw09|>},
649     $localName => 'Version',
650     $given => $given,
651     }__;
652     ##SWDMLDocumentElement
653    
654     ElementTypeBinding:
655     @Name: NodeReadOnlyError
656     @ElementType:
657     dx:raises
658     @ShadowContent:
659     @@@: MDOMX|NOMOD_THIS
660     @@Description:
661     @@@lang:en
662     @@@@:
663     If the node or a descendant of it, which
664     is to be modified, is read-only.
665    
666     ## -- Parser
667    
668     IFClsDef:
669     @IFQName: SWDMLParser
670     @ClsQName: ManakaiSWDMLParser
671    
672     @Implement: ecore|MUErrorTarget||ManakaiDOM|Perl
673    
674     @DISLang:role: gls|ParserRole
675    
676     @f:implements: SWDMLFeature010
677     @f:provides:
678     @@@: SWDMLFeature010
679     @@f:through: c|ManakaiDOMImplementation
680    
681     @enDesc:
682     A <IF::SWDMLParser> object parses a SuikaWiki/0.9,
683     SuikaWikiImage/0.9, or SuikaWiki/0.10 textual document and
684     returns it as an object.
685    
686     @Attr:
687     @@Name: domConfig
688     @@enDesc:
689     The configuration of the parser.
690    
691     @@Get:
692     @@@Type: c|DOMConfiguration
693     @@@enDesc: The DOM configuration object.
694     @@@PerlDef:
695     __CODE{c|getConfigObject::
696     $target => $self,
697     $targetHash => $self,
698     $targetType => {<IFName::SWDMLParser>},
699     $result => $r,
700     }__;
701    
702     @Method:
703     @@ManakaiDOM:isForInternal:1
704     @@ForCheck: ManakaiDOM|ForClass
705     @@Operator: DISPerl|NewMethod
706     @@enDesc:
707     Creates a new instance of the object.
708     @@Param:
709     @@@Name: impl
710     @@@Type: gls|GLSImplementation
711     @@@enDesc:
712     The implementation from which the parser is created.
713     @@Param:
714     @@@Name: features
715     @@@Type: DOMString
716     @@@dis:actualType: f|FeaturesString
717     @@@enDesc:
718     The set of features requested for the parser.
719     @@Return:
720     @@@Type: DOMMain|DOMObject
721     @@@enDesc:
722     The newly created parser.
723     @@@PerlDef:
724     $r = bless {
725 wakaba 1.4 <H::f|implementation> => $impl->get_feature ('XML' => '3.0'),
726 wakaba 1.1 }, $self;
727    
728     @Method:
729     @@Name: parseString
730     @@enDesc:
731     Parses a string as SWDML textual document and converts it into
732     DOM tree.
733     @@Param:
734     @@@Name: sourceText
735     @@@Type: DOMString
736     @@@enDesc:
737     The text to parse.
738     @@Return:
739     @@@Type: DISPerl|HASH
740     @@@enDesc:
741     An object representation of <P::sourceText>.
742     @@@PerlDef:
743     $self->{scanner} = $self->can ('_scan_Body');
744     $self->{char} = [0x000A];
745     $self->{token} = [];
746     $self->{source} = $sourceText;
747 wakaba 1.2 pos ($self->{source}) = 0;
748 wakaba 1.1 $self->{location} = {};
749     $self->{doc} = $self->{<H::f|implementation>}
750     ->create_document (<Q::sw09|>, 'document');
751     $self->{doc}->strict_error_checking (false);
752     $self->{docel} = $self->{doc}->document_element;
753     $self->{docel}->set_attribute_ns (<Q::xmlns|>, 'xmlns', <Q::sw09|>);
754     $self->{docel}->set_attribute_ns (<Q::xmlns|>, 'xmlns:h2', <Q::xhtml2|>);
755 wakaba 1.3 $self->{docel}->markup_language_name ('SuikaWiki');
756 wakaba 1.1 $self->{docel}->markup_language_version ('0.10');
757     $self->{docel}->append_child
758     ($self->{doc}->create_element_ns
759     (<Q::xhtml2|>, 'h2:head'));
760     $self->{docel}->append_child
761     ($self->{doc}->create_element_ns
762     (<Q::xhtml2|>, 'h2:body'));
763     __DEEP{
764     $self->_parse_Document;
765     }__;
766    
767     $r = $self->{doc};
768    
769     @Method:
770     @@Name: shiftChar
771     @@ManakaiDOM:isForInternal:1
772     @@ForCheck: ManakaiDOM|ForClass
773     @@enDesc:
774     Returns the next character.
775     @@Return:
776     @@@Type: idl|long||ManakaiDOM|all
777     @@@enDesc:
778     The code position number of the next character, if any,
779     or <CODE::-2>.
780     @@@PerlDef:
781     if (@{$self->{char}}) {
782     $r = shift @{$self->{char}};
783     } else {
784     my $char = substr ($self->{source}, pos ($self->{source}), 1);
785     pos ($self->{source})++;
786    
787     if (length $char) {
788     $r = ord $char;
789     if ($r == 0x000D) {
790     my $char2 = substr ($self->{source}, pos ($self->{source}), 1);
791     if (length $char2) {
792     if (ord $char2 == 0x000A) {
793     pos ($self->{source})++;
794     }
795     push @{$self->{char}}, 0x000A;
796     }
797     } elsif ($r == 0x000A) {
798     $r = 0x000D;
799     push @{$self->{char}}, 0x000A;
800     }
801     } else { ## ISSUE: The last |RE|
802     $r = -1;
803     }
804     }
805    
806     @Method:
807     @@ManakaiDOM:isForInternal: 1
808     @@Operator: ManakaiDOM|MUErrorHandler
809     @@enDesc:
810     When a <IF::ecore|ErrorInterface||ManakaiDOM|Perl> is <Perl::report>ed,
811     then this method is invoked.
812    
813     The method calls the <cfg::DOMCore|error-handler> if the error is of
814     <IF::DOMCore|DOMError>. Otherwise, the error is re-thrown so that
815     corresponding <Perl::catch> clause, if any, can catch the error.
816     @@Param:
817     @@@Name: err
818     @@@Type: ecore|ErrorInterface||ManakaiDOM|Perl
819     @@@enDesc:
820     The reported error object.
821     @@Return:
822     @@@Type: DISPerl|Any
823     @@@enDesc:
824     If the <P::err> is a <IF::DOMCore|DOMError>, then the return value
825     of the error handler.
826    
827     {NOTE:: If the error is thrown, the method never returns.
828     }
829     @@@nullCase:
830     @@@@enDesc:
831     No error handler.
832     @@@PerlDef:
833 wakaba 1.6 if ($err->isa (<IFName::DOMCore|DOMError>)) {
834 wakaba 1.1 __DEEP{
835     A: {
836     my $cfg = $self-><AG::SWDMLParser.domConfig>;
837     my $h = $cfg-><M::DOMCore|DOMConfiguration.getParameter>
838     ('error-handler');
839     $r = $h-><M::DOMCore|DOMErrorHandler.handleError> ($err);
840     } # A
841     }__;
842     } else {
843     $err-><M::ecore|ErrorInterface||ManakaiDOM|Perl.throw>;
844     }
845    
846     @DISPerl:dpgDef:
847    
848     lexmode WSP {
849     $wsp := [U+0009 U+0020];
850    
851     /*
852     U+000D and U+000A characters in source stream are
853     replaced to record separators by |shiftChar|.
854     */
855     $rs := [U+000A];
856     $re := [U+000D];
857     $nonRSRE := [^U+000D U+000A];
858     }
859    
860     lexmode Body
861     : extends => 'WSP'
862     : initial
863     : standalone
864     {
865     $digit := [U+0030..U+0039];
866     $ltagchar := [U+0041..U+005A U+0061..U+007A U+0030..U+0039 '-' '_'];
867     $classchar := [^'(' ')' U+005C U+000D U+000A];
868    
869     magicVersionS : value
870     := $rs ['#'] ['?'] ['S'] ['u'] ['i'] ['k'] ['a']
871     ['W'] ['i'] ['k'] ['i'] ['/'] ['0'] ['.'] ['9'] $wsp*
872     -> MagicParameter;
873     magicVersionI : value
874     := $rs ['#'] ['?'] ['S'] ['u'] ['i'] ['k'] ['a']
875     ['W'] ['i'] ['k'] ['i'] ['I'] ['m'] ['a'] ['g'] ['e']
876     ['/'] ['0'] ['.'] ['9'] $wsp*
877     -> MagicParameter;
878     otherRS : ignore := $rs;
879     headingStart : value := $rs ['*']+ $wsp*;
880     listStart : value := $rs ['-' '=']+ $wsp*;
881     dlistStart : value := $rs [':'] [^':' U+000D U+000A]* [':'] $wsp*;
882     quote : value := $rs ['>']+ $wsp*;
883     eol := $re;
884     anchorNumberDef : value := ['['] $digit+ [']'];
885     anchorNumberRef : value := ['>'] ['>'] $digit+;
886     externalRefStart := ['<'] -> ExternalRefBody;
887     startTag : value := ['['] [U+0041..U+005A]+ ['['];
888     startTagClass : value := ['['] [U+0041..U+005A]+
889     ['('] $classchar* [')'] ['['];
890     startTagClassLang : value := ['['] [U+0041..U+005A]+
891     ['('] $classchar* [')']
892     ['@'] $ltagchar* ['['];
893     startTagLang : value := ['['] [U+0041..U+005A]+ ['@'] $ltagchar* ['['];
894     termStartTag := ['['] ['['];
895     midTag : value := [']'] $wsp* ['['];
896 wakaba 1.2 midTagLang : value := [']'] $wsp* ['@'] $ltagchar* ['['];
897 wakaba 1.1 endTag := [']'] [']'];
898     endTagAnchorNumberRef : value := [']'] ['>'] ['>'] $digit+ [']'];
899     endTagExternalRefStart := [']'] ['<'] -> EndTagExternalRefBody;
900 wakaba 1.2 preStartTag : value := $rs ['['] ['P'] ['R'] ['E'] ['['] $wsp* $re;
901     preStartTagClass : value := $rs ['['] ['P'] ['R'] ['E']
902     ['('] $classchar* [')'] ['['] $wsp* $re;
903     insStartTag : value := $rs ['['] ['I'] ['N'] ['S'] ['['] $wsp* $re;
904     insStartTagClass : value := $rs ['['] ['I'] ['N'] ['S']
905     ['('] $classchar* [')'] ['['] $wsp* $re;
906     delStartTag : value := $rs ['['] ['D'] ['E'] ['L'] ['['] $wsp* $re;
907     delStartTagClass : value := $rs ['['] ['D'] ['E'] ['L']
908     ['('] $classchar* [')'] ['['] $wsp* $re;
909     preEndTag : value := $rs [']'] ['P'] ['R'] ['E'] [']'] $wsp* $re;
910     insEndTag : value := $rs [']'] ['I'] ['N'] ['S'] [']'] $wsp* $re;
911     delEndTag : value := $rs [']'] ['D'] ['E'] ['L'] [']'] $wsp* $re;
912 wakaba 1.1 formStart : value := ['['] ['['] ['#'] [U+0061..U+007A '-']+
913     -> FormBody;
914     emphasis2 := [U+0027] [U+0027];
915     emphasis3 := [U+0027] [U+0027] [U+0027];
916     entityRef : value := ['_'] ['_'] ['&'] ['&']
917     [^'&' U+000D U+000A]+
918     ['&'] ['&'] ['_'] ['_'];
919     obsPreStart : value := $rs $wsp;
920 wakaba 1.2 noteStart : value := $rs [';'] [';'] $wsp*;
921     edStart : value := $rs ['@'] ['@'] $wsp*;
922 wakaba 1.1 tableLine : value := $rs [','] $nonRSRE* $re;
923     imageStart : value := $rs ['_'] ['_'] ['I'] ['M'] ['A'] ['G'] ['E']
924     ['_'] ['_'] $re;
925     ?default-token text : value;
926     }
927    
928     lexmode MagicParameter
929     : extends => 'WSP'
930     : standalone
931     {
932     name : value := [U+0041..U+005A U+0061..U+007A U+0030..U+0039 '-']+;
933     vi := ['='];
934     lit := ['"'] -> MagicParameterValue;
935     s : ignore := $wsp+;
936     eol := $re -> Body;
937     }
938    
939     lexmode MagicParameterValue
940     : standalone
941 wakaba 1.2 : extends => WSP
942 wakaba 1.1 {
943 wakaba 1.2 quotedPair : value := [U+005C] $nonRSRE;
944 wakaba 1.1 ?default-token text : value;
945     lit := ['"'] -> MagicParameter;
946     }
947    
948     lexmode ExternalRefBody
949     : standalone
950     {
951     lit := ['"'] -> ExternalRefQuotedStringBody;
952     externalRefEnd := ['>'] -> Body;
953     ?default-token text : value;
954     }
955     lexmode EndTagExternalRefBody
956     : standalone
957     {
958     lit := ['"'] -> EndTagExternalRefQuotedStringBody;
959     endTagExternalRefEnd := ['>'] [']'] -> Body;
960     ?default-token text : value;
961     }
962    
963     lexmode ExternalRefQuotedStringBody
964     : standalone
965 wakaba 1.2 : extends => WSP
966 wakaba 1.1 {
967     lit := ['"'] -> ExternalRefBody;
968 wakaba 1.2 quotedPair : value := [U+005C] $nonRSRE;
969 wakaba 1.1 ?default-token text : value;
970     }
971     lexmode EndTagExternalRefQuotedStringBody
972     : standalone
973 wakaba 1.2 : extends => WSP
974 wakaba 1.1 {
975     lit := ['"'] -> EndTagExternalRefBody;
976 wakaba 1.2 quotedPair : value := [U+005C] $nonRSRE;
977 wakaba 1.1 ?default-token text : value;
978     }
979    
980     lexmode FormBody
981     : standalone
982     {
983     lita := [U+0027] -> FormQuotedStringBody;
984     formEnd := [']'] [']'] -> Body;
985     ?default-token text : value;
986     }
987    
988     lexmode FormQuotedStringBody
989     : standalone
990 wakaba 1.2 : extends => WSP
991 wakaba 1.1 {
992     lita := [U+0027] -> FormBody;
993 wakaba 1.2 quotedPair : value := [U+005C] $nonRSRE;
994 wakaba 1.1 ?default-token text : value;
995     }
996    
997    
998     rule Document
999     : standalone
1000     {
1001     ~? (magicVersionS) {
1002     lang:Perl {
1003     $self->{docel}
1004     ->set_attribute_ns (<Q::sw09|>, 'sw9:Name' => 'SuikaWiki');
1005     $self->{docel}->set_attribute_ns (<Q::sw09|>, 'sw9:Version' => '0.9');
1006     }
1007     &MagicParam;
1008     } (magicVersionI) {
1009     lang:Perl {
1010     $self->{docel}
1011     ->set_attribute_ns (<Q::sw09|>, 'sw9:Name' => 'SuikaWikiImage');
1012     $self->{docel}->set_attribute_ns (<Q::sw09|>, 'sw9:Version' => '0.9');
1013     }
1014     &MagicParam;
1015     }
1016    
1017     my $parent;
1018 wakaba 1.2 lang:Perl {
1019     $parent->{block} = [$self->{doc}->document_element->body_element];
1020     $parent->{quote} = [$parent->{block}->[-1]];
1021     $parent->{section}->[1] = $parent->{block}->[-1];
1022     $parent->{edit} = [];
1023     }
1024    
1025     &Body ($parent => $parent);
1026     } // Document
1027    
1028     rule Body ($parent)
1029     : standalone
1030     {
1031     /* $parent
1032     block i For block-level elements.
1033 wakaba 1.1 section i For i-th-level sections. Null if no (i-1)-th
1034     level section.
1035     list i For i-th-level list items. Null if no i-th-level
1036     list.
1037 wakaba 1.2 text i For texts or inline-level elements
1038 wakaba 1.1 Null if no container for inlines.
1039 wakaba 1.2 quote i Contains i-th-level quotation's |bodytext| element.
1040     edit i Contains |parent| state restored when i-th-level
1041     editing element is closed.
1042     tr For |tr| elements.
1043 wakaba 1.1 */
1044     my $state;
1045     /*
1046     heading Next |eol| closes the heading.
1047 wakaba 1.2 pre In |pre| element.
1048 wakaba 1.1 section Otherwise.
1049     */
1050     lang:Perl {
1051     $state = 'section';
1052     }
1053    
1054     ~* (text) {
1055     lang:Perl ($v => $token.value) {
1056 wakaba 1.2 CORE::delete $parent->{tr};
1057     __CODE{setTextParent}__;
1058     $parent->{text}->[-1]->manakai_append_text ($v);
1059 wakaba 1.1 }
1060     } (startTag) {
1061     my $element_type;
1062     my $class_names;
1063     my $lang_tag;
1064     lang:Perl ($v => $token.value) {
1065     $v =~ /([A-Z]+)/;
1066     $element_type = $1;
1067     $class_names = '';
1068     }
1069    
1070     &_StartTag ($element_type => $element_type, $class_names => $class_names,
1071     $lang_tag => $lang_tag, $parent => $parent);
1072     } (startTagClass) {
1073     my $element_type;
1074     my $class_names;
1075     my $lang_tag;
1076     lang:Perl ($v => $token.value) {
1077     $v =~ /([A-Z]+)\(([^()]+)/;
1078     $element_type = $1;
1079     $class_names = $2;
1080     }
1081    
1082     &_StartTag ($element_type => $element_type, $class_names => $class_names,
1083     $lang_tag => $lang_tag, $parent => $parent);
1084     } (startTagClassLang) {
1085     my $element_type;
1086     my $class_names;
1087     my $lang_tag;
1088     lang:Perl ($v => $token.value) {
1089     $v =~ /([A-Z]+)\(([^()]+)\@([^\[\]]*)/;
1090     $element_type = $1;
1091     $class_names = $2;
1092     $lang_tag = $2;
1093     }
1094    
1095     &_StartTag ($element_type => $element_type, $class_names => $class_names,
1096     $lang_tag => $lang_tag, $parent => $parent);
1097     } (startTagLang) {
1098     my $element_type;
1099     my $class_names;
1100     my $lang_tag;
1101     lang:Perl ($v => $token.value) {
1102     $v =~ /([A-Z]+)\@([^\[\]]*)/;
1103     $element_type = $1;
1104     $class_names = '';
1105     $lang_tag = $2;
1106     }
1107    
1108     &_StartTag ($element_type => $element_type, $class_names => $class_names,
1109     $lang_tag => $lang_tag, $parent => $parent);
1110 wakaba 1.2 } (termStartTag) {
1111     lang:Perl {
1112     CORE::delete $parent->{tr};
1113     __CODE{setTextParent}__;
1114     my $a_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'anchor');
1115     $parent->{text}->[-1]->append_child ($a_el);
1116     push @{$parent->{text}}, $a_el;
1117     }
1118     } (midTag) {
1119     lang:Perl ($v => $token.value) {
1120     CORE::delete $parent->{tr};
1121     if (defined $parent->{text}->[0]) {
1122     my $xuri = $parent->{text}->[-1]->manakai_expanded_uri;
1123     if ($xuri eq <Q::xhtml2|rb> or $xuri eq <Q::xhtml2|rt>) {
1124     push @{$parent->{text}},
1125     $parent->{text}->[-1]->parent_node
1126     ->append_child
1127     ($self->{doc}->create_element_ns
1128     (<Q::xhtml2|>,
1129     'h2:rt'));
1130     } elsif ($xuri eq <Q::sw010|qname>) {
1131     push @{$parent->{text}},
1132     $parent->{text}->[-1]->parent_node
1133     ->append_child
1134     ($self->{doc}->create_element_ns
1135     (<Q::sw010|>,
1136     'nsuri'));
1137     } else {
1138     __CODE{setTextParent}__;
1139     $parent->{text}->[-1]->manakai_append_text ($v);
1140     }
1141     } else {
1142     __CODE{setTextParent}__;
1143     $parent->{text}->[-1]->manakai_append_text ($v);
1144     }
1145     }
1146     } (midTagLang) {
1147     lang:Perl ($v => $token.value) {
1148     CORE::delete $parent->{tr};
1149     if (defined $parent->{text}->[0]) {
1150     my $xuri = $parent->{text}->[-1]->manakai_expanded_uri;
1151     $v =~ /\@([A-Za-z0-9-]*)/;
1152     my $lang = $1;
1153     if ($xuri eq <Q::xhtml2|rb> or $xuri eq <Q::xhtml2|rt>) {
1154     push @{$parent->{text}},
1155     $parent->{text}->[-1]->parent_node
1156     ->append_child
1157     ($self->{doc}->create_element_ns
1158     (<Q::xhtml2|>,
1159     'h2:rt'));
1160     $parent->{text}->[-1]
1161     ->set_attribute_ns (<Q::xml|>, 'xml:lang', $lang);
1162     } elsif ($xuri eq <Q::sw010|qname>) {
1163     push @{$parent->{text}},
1164     $parent->{text}->[-1]->parent_node
1165     ->append_child
1166     ($self->{doc}->create_element_ns
1167     (<Q::sw010|>,
1168     'nsuri'));
1169     $parent->{text}->[-1]
1170     ->set_attribute_ns (<Q::xml|>, 'xml:lang', $lang);
1171     } else {
1172     __CODE{setTextParent}__;
1173     $parent->{text}->[-1]->manakai_append_text ($v);
1174     }
1175     } else {
1176     __CODE{setTextParent}__;
1177     $parent->{text}->[-1]->manakai_append_text ($v);
1178     }
1179     }
1180     } (endTag) {
1181     lang:Perl {
1182     my $iref;
1183     my $xref;
1184     __CODE{endTag:: $tagString => ']]'}__;
1185     }
1186     } (endTagAnchorNumberRef) {
1187     lang:Perl ($v => $token.value) {
1188     $v =~ />>([0-9]+)/;
1189     my $iref = $1;
1190     my $xref;
1191     __CODE{endTag:: $tagString => $v}__;
1192     }
1193     } (endTagExternalRefStart) {
1194     my $xref;
1195     lang:Perl {
1196     $xref = '';
1197     }
1198     ~* (text) {
1199     lang:Perl ($v => $token.value) {
1200     $xref .= $v;
1201     }
1202     } (quotedPair) {
1203     lang:Perl ($v => $token.value) {
1204     $xref .= $v;
1205     }
1206     } (lit) {
1207     lang:Perl {
1208     $xref .= '"';
1209     }
1210     }
1211     ~ (endTagExternalRefEnd) { }
1212     lang:Perl {
1213     my $iref;
1214     __CODE{endTag:: $tagString => {']<'.$xref.'>]'}}__;
1215     }
1216 wakaba 1.1 } (eol) {
1217     ~? (eol) {
1218     lang:Perl {
1219 wakaba 1.2 CORE::delete $parent->{tr};
1220     if ($state eq 'pre') {
1221     $parent->{text}->[-1]->manakai_append_text ("\x0A\x0A");
1222     } elsif ($state eq 'obspre') {
1223     $#{$parent->{block}}--;
1224     $parent->{text} = [];
1225     $state = 'section';
1226     } else {
1227     $parent->{block} = [$parent->{section}->[-1]];
1228     $parent->{quote} = [$parent->{block}->[-1]];
1229     $parent->{list} = [];
1230     $parent->{text} = [];
1231     $state = 'section';
1232     }
1233 wakaba 1.1 }
1234     } else {
1235     lang:Perl {
1236 wakaba 1.2 CORE::delete $parent->{tr};
1237 wakaba 1.1 if ($state eq 'heading') {
1238 wakaba 1.2 $parent->{text} = [];
1239 wakaba 1.1 $state = 'section';
1240 wakaba 1.2 } elsif ($state eq 'pre') {
1241     $parent->{text}->[-1]->manakai_append_text ("\x0A");
1242     } elsif (defined $parent->{text}->[0]) {
1243     $parent->{text}->[-1]->manakai_append_text ("\x0A");
1244 wakaba 1.1 }
1245     }
1246     }
1247 wakaba 1.2 } (anchorNumberDef) {
1248     lang:Perl ($v => $token.value) {
1249     CORE::delete $parent->{tr};
1250     __CODE{setTextParent}__;
1251     my $a_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'anchor-end');
1252     $a_el->set_attribute_ns (<Q::sw09|>, 'sw9:anchor',
1253     0+substr ($v, 1, length ($v) - 2));
1254     $a_el->text_content ($v);
1255     $parent->{text}->[-1]->append_child ($a_el);
1256     }
1257     } (anchorNumberRef) {
1258     lang:Perl ($v => $token.value) {
1259     CORE::delete $parent->{tr};
1260     __CODE{setTextParent}__;
1261     my $a_el = $self->{doc}
1262     ->create_element_ns (<Q::sw09|>, 'anchor-internal');
1263     $a_el->set_attribute_ns (<Q::sw09|>, 'sw9:anchor',
1264     0+substr ($v, 2));
1265     $a_el->text_content ($v);
1266     $parent->{text}->[-1]->append_child ($a_el);
1267     }
1268     } (externalRefStart) {
1269     my $xref;
1270     ~ (text) {
1271     lang:Perl ($v => $token.value) {
1272     $xref .= $v;
1273     }
1274     } (quotedPair) {
1275     lang:Perl ($v => $token.value) {
1276     $xref .= $v;
1277     }
1278     } (lit) {
1279     lang:Perl {
1280     $xref .= '"';
1281     }
1282     }
1283     ~ (externalRefEnd) { }
1284     lang:Perl {
1285     CORE::delete $parent->{tr};
1286     __CODE{setTextParent}__;
1287     my $a_el = $self->{doc}
1288     ->create_element_ns (<Q::sw09|>, 'anchor-external');
1289     my $data = $xref;
1290     my $scheme;
1291     if ($data =~ s/^([A-Z]+)://) {
1292     $scheme = $1;
1293     } else {
1294     $scheme = 'URI';
1295     }
1296     $a_el->set_attribute_ns (<Q::sw09|>, 'sw9:resScheme', $scheme);
1297     $a_el->set_attribute_ns (<Q::sw09|>, 'sw9:resParameter', $data);
1298     $a_el->text_content ($xref);
1299     $parent->{text}->[-1]->append_child ($a_el);
1300     }
1301 wakaba 1.1 } (listStart) {
1302     lang:Perl ($v => $token.value) {
1303 wakaba 1.2 CORE::delete $parent->{tr};
1304     if ($state eq 'pre' or $state eq 'obspre') {
1305     $parent->{text}->[-1]->manakai_append_text (substr $v, 1);
1306     } else {
1307     $v =~ /([-=]+)/;
1308     my $level = length ($1) - 1;
1309     my $type = substr ($1, -1) eq '-' ? 'ul' : 'ol';
1310     if (defined $parent->{list}->[$level]) {
1311     unless ($parent->{list}->[$level]->local_name eq $type) {
1312     $parent->{list}->[$level]
1313     = $parent->{list}->[$level]->parent_node
1314     ->append_child
1315     ($self->{doc}->create_element_ns
1316     (<Q::xhtml2|>, 'h2:'.$type));
1317     }
1318     } elsif (defined $parent->{list}->[0]) {
1319     my $parent_list = $parent->{list}->[-1];
1320     my $parent_lc = $parent_list->last_child;
1321     if (defined $parent_lc and
1322     $parent_lc->node_type eq <C::Node.ELEMENT_NODE>) {
1323     $parent->{list}->[$level]
1324     = $parent_lc->append_child
1325     ($self->{doc}->create_element_ns
1326 wakaba 1.1 (<Q::xhtml2|>, 'h2:'.$type));
1327 wakaba 1.2 } else {
1328     $parent->{list}->[$level]
1329     = $parent_list->append_child
1330     ($self->{doc}->create_element_ns
1331     (<Q::xhtml2|>, 'h2:li'))
1332     ->append_child
1333     ($self->{doc}->create_element_ns
1334     (<Q::xhtml2|>, 'h2:'.$type));
1335     }
1336 wakaba 1.1 } else {
1337     $parent->{list}->[$level]
1338 wakaba 1.2 = $parent->{block}->[-1]->append_child
1339     ($self->{doc}->create_element_ns
1340 wakaba 1.1 (<Q::xhtml2|>, 'h2:'.$type));
1341     }
1342 wakaba 1.2 push @{$parent->{block}},
1343     $parent->{list}->[$level]->append_child
1344     ($self->{doc}->create_element_ns
1345     (<Q::xhtml2|>, 'h2:li'));
1346     $parent->{text} = [$parent->{block}->[-1]];
1347     $state = 'section';
1348     }
1349     }
1350     } (dlistStart) {
1351     lang:Perl ($v => $token.value) {
1352     CORE::delete $parent->{tr};
1353     if ($state eq 'pre' or $state eq 'obspre') {
1354     $parent->{text}->[-1]->manakai_append_text (substr ($v, 1));
1355     } else {
1356     $v =~ /:([^:]*)/;
1357     my $dt_src = $1;
1358    
1359     my $dr_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'dr');
1360     my $dt_el = $self->{doc}->create_element_ns (<Q::xhtml2|>, 'h2:dt');
1361     my $dd_el = $self->{doc}->create_element_ns (<Q::xhtml2|>, 'h2:dd');
1362     $dr_el->append_child ($dt_el);
1363     $dr_el->append_child ($dd_el);
1364    
1365     if ($parent->{block}->[-1]->manakai_expanded_uri eq <Q::xhtml2|dd>) {
1366     $parent->{block}->[-1]->parent_node->parent_node
1367     ->append_child ($dr_el);
1368     } else {
1369     my $dl_el = $self->{doc}->create_element_ns
1370     (<Q::xhtml2|>, 'h2:dl');
1371     $dl_el->append_child ($dr_el);
1372     $parent->{block}->[-1]->append_child ($dl_el);
1373     }
1374     push @{$parent->{block}}, $dd_el;
1375     $parent->{text} = [$dd_el];
1376     $parent->{list} = [];
1377     $parent->{edit} = [];
1378     $state = 'section';
1379    
1380     my $original_pos = pos $self->{source};
1381     {
1382     local $self->{token} = [];
1383     local $self->{char} = [];
1384     local $self->{source} = $dt_src;
1385     pos ($self->{source}) = 0;
1386     local $self->{location} = {};
1387     local $self->{scanner} = $self->can ('_scan_Body');
1388     $self->_parse_Body ({
1389     block => [$dt_el],
1390     quote => [$dt_el],
1391     section => [null, $dt_el],
1392     text => [$dt_el],
1393     });
1394     }
1395     pos ($self->{source}) = $original_pos;
1396     }
1397     }
1398     } (emphasis2) {
1399     lang:Perl {
1400     CORE::delete $parent->{tr};
1401     if (defined $parent->{text}->[1] and
1402     $parent->{text}->[-1]->manakai_expanded_uri eq <Q::xhtml2|em>) {
1403     $#{$parent->{text}}--;
1404     } else {
1405     __CODE{setTextParent}__;
1406     my $em_el = $self->{doc}->create_element_ns (<Q::xhtml2|>, 'h2:em');
1407     $parent->{text}->[-1]->append_child ($em_el);
1408     push @{$parent->{text}}, $em_el;
1409     }
1410     }
1411     } (emphasis3) {
1412     lang:Perl {
1413     CORE::delete $parent->{tr};
1414     if (defined $parent->{text}->[1] and
1415     $parent->{text}->[-1]->manakai_expanded_uri
1416     eq <Q::xhtml2|strong>) {
1417     $#{$parent->{text}}--;
1418 wakaba 1.1 } else {
1419 wakaba 1.2 __CODE{setTextParent}__;
1420     my $em_el = $self->{doc}->create_element_ns
1421     (<Q::xhtml2|>, 'h2:strong');
1422     $parent->{text}->[-1]->append_child ($em_el);
1423     push @{$parent->{text}}, $em_el;
1424     }
1425     }
1426     } (quote) {
1427     lang:Perl ($v => $token.value) {
1428     CORE::delete $parent->{tr};
1429     if ($state eq 'pre' or $state eq 'obspre') {
1430     $parent->{text}->[-1]->manakai_append_text (substr ($v, 1));
1431     } else {
1432     $v =~ /(>+)/;
1433     my $level = length $1;
1434     if (defined $parent->{quote}->[$level]) {
1435     if (defined $parent->{quote}->[$level + 1]) {
1436     $#{$parent->{quote}} = $level;
1437     }
1438     } else {
1439     L: for my $i (1..$level) {
1440     next L if defined $parent->{quote}->[$i];
1441     $parent->{quote}->[$i]
1442     = $parent->{quote}->[$i - 1]
1443     ->append_child ($self->{doc}->create_element_ns
1444     (<Q::xhtml2|>, 'h2:blockquote'))
1445     ->append_child
1446     ($self->{doc}->create_element_ns
1447     (<Q::html3|>, 'h3:bodytext'));
1448     } # L
1449     }
1450     push @{$parent->{block}}, $parent->{quote}->[$level];
1451     $parent->{text} = [];
1452     $parent->{list} = [];
1453     $state = 'section';
1454 wakaba 1.1 }
1455     }
1456     } (headingStart) {
1457     lang:Perl ($v => $token.value) {
1458 wakaba 1.2 CORE::delete $parent->{tr};
1459     if ($state eq 'pre' or $state eq 'obspre') {
1460     $parent->{text}->[-1]->manakai_append_text (substr ($v, 1));
1461     } else {
1462     $v =~ /(\*+)/;
1463     my $level = length $1;
1464     if (defined $parent->{section}->[$level]) {
1465     if (defined $parent->{section}->[$level + 1]) {
1466     $#{$parent->{section}} = $level;
1467     }
1468     } else {
1469     L: for my $i (2..$level) {
1470     next L if defined $parent->{section}->[$i];
1471     $parent->{section}->[$i]
1472     = $self->{doc}->create_element_ns
1473     (<Q::xhtml2|>, 'h2:section');
1474     $parent->{section}->[$i - 1]
1475     ->append_child ($parent->{section}->[$i]);
1476     } # L
1477 wakaba 1.1 }
1478 wakaba 1.2 $parent->{section}->[$level + 1]
1479     = $self->{doc}->create_element_ns (<Q::xhtml2|>, 'h2:section');
1480     $parent->{section}->[$level]
1481     ->append_child ($parent->{section}->[$level + 1]);
1482     $parent->{block} = [$parent->{section}->[$level + 1]];
1483     $parent->{quote} = [$parent->{block}->[-1]];
1484     $parent->{text} = [$self->{doc}->create_element_ns
1485     (<Q::xhtml2|>, 'h2:h')];
1486     $parent->{block}->[-1]->append_child ($parent->{text}->[-1]);
1487     $parent->{list} = [];
1488     $state = 'heading';
1489     }
1490     }
1491     } (noteStart) {
1492     lang:Perl ($v => $token.value) {
1493     CORE::delete $parent->{tr};
1494     if ($state eq 'pre' or $state eq 'obspre') {
1495     $parent->{text}->[-1]->manakai_append_text
1496     (substr ($v, 1, length ($v) - 2) . "\x0A");
1497 wakaba 1.1 } else {
1498 wakaba 1.2 my $ed_el = $self->{doc}->create_element_ns
1499     (<Q::sw010|>, 'sw10:comment-p');
1500     $parent->{block}->[-1]->append_child ($ed_el);
1501     push @{$parent->{block}}, $ed_el;
1502     $parent->{list} = [];
1503     $parent->{quote} = [$ed_el];
1504     $parent->{text} = [$ed_el];
1505     $state = 'section';
1506     }
1507     }
1508     } (edStart) {
1509     lang:Perl ($v => $token.value) {
1510     CORE::delete $parent->{tr};
1511     if ($state eq 'pre' or $state eq 'obspre') {
1512     $parent->{text}->[-1]->manakai_append_text
1513     (substr ($v, 1, length ($v) - 2) . "\x0A");
1514     } else {
1515     my $ed_el = $self->{doc}->create_element_ns (<Q::sw010|>, 'sw10:ed');
1516     $parent->{block}->[-1]->append_child ($ed_el);
1517     push @{$parent->{block}}, $ed_el;
1518     $parent->{list} = [];
1519     $parent->{quote} = [$ed_el];
1520     $parent->{text} = [$ed_el];
1521     $state = 'section';
1522     }
1523     }
1524     } (preStartTag) {
1525     lang:Perl ($v => $token.value) {
1526     CORE::delete $parent->{tr};
1527     if ($state eq 'pre' or $state eq 'obspre') {
1528     $parent->{text}->[-1]->manakai_append_text
1529     (substr ($v, 1, length ($v) - 2) . "\x0A");
1530     } else {
1531     my $pre_el = $self->{doc}->create_element_ns
1532     (<Q::xhtml2|>, 'h2:pre');
1533     $pre_el->set_attribute_ns (<Q::xml|>, 'xml:space', 'preserve');
1534     $parent->{block}->[-1]->append_child ($pre_el);
1535     push @{$parent->{block}}, $pre_el;
1536     $parent->{text} = [$pre_el];
1537     $state = 'pre';
1538     }
1539     }
1540     } (preStartTagClass) {
1541     lang:Perl ($v => $token.value) {
1542     CORE::delete $parent->{tr};
1543     if ($state eq 'pre' or $state eq 'obspre') {
1544     $parent->{text}->[-1]->manakai_append_text
1545     (substr ($v, 1, length ($v) - 2) . "\x0A");
1546     } else {
1547     my $pre_el = $self->{doc}->create_element_ns
1548     (<Q::xhtml2|>, 'h2:pre');
1549     $pre_el->set_attribute_ns (<Q::xml|>, 'xml:space', 'preserve');
1550     $v =~ /\(([^()]*)/;
1551     $pre_el->set_attribute_ns (null, class => $1);
1552     $parent->{block}->[-1]->append_child ($pre_el);
1553     push @{$parent->{block}}, $pre_el;
1554     $parent->{text} = [$pre_el];
1555     $state = 'pre';
1556     }
1557     }
1558     } (obsPreStart) {
1559     lang:Perl ($v => $token.value) {
1560     CORE::delete $parent->{tr};
1561     unless ($state eq 'pre' or $state eq 'obspre') {
1562     my $pre_el = $self->{doc}->create_element_ns
1563     (<Q::xhtml2|>, 'h2:pre');
1564     $pre_el->set_attribute_ns (<Q::xml|>, 'xml:space', 'preserve');
1565     $parent->{block}->[-1]->append_child ($pre_el);
1566     push @{$parent->{block}}, $pre_el;
1567     $parent->{text} = [$pre_el];
1568     $state = 'obspre';
1569     }
1570     $parent->{text}->[-1]->manakai_append_text (substr ($v, 1));
1571     }
1572     } (preEndTag) {
1573     lang:Perl ($v => $token.value) {
1574     CORE::delete $parent->{tr};
1575     if ($state eq 'pre' or $state eq 'obspre') {
1576     $#{$parent->{block}}--;
1577     $parent->{text} = [];
1578     $parent->{list} = [];
1579     $parent->{quote} = [$parent->{block}->[-1]];
1580     $state = 'section';
1581     } else {
1582     __CODE{setTextParent}__;
1583     $parent->{text}->[-1]->manakai_append_text
1584     (substr ($v, 1, length ($v) - 2) . "\x0A");
1585     }
1586     }
1587     } (insStartTag) {
1588     lang:Perl ($v => $token.value) {
1589     CORE::delete $parent->{tr};
1590     if ($state eq 'pre' or $state eq 'obspre') {
1591     $parent->{text}->[-1]->manakai_append_text
1592     (substr ($v, 1, length ($v) - 2) . "\x0A");
1593     } else {
1594     my $ins_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'insert');
1595     $parent->{block}->[-1]->append_child ($ins_el);
1596     push @{$parent->{edit}}, {
1597     section => $parent->{section},
1598     block => $parent->{block},
1599     text => $parent->{text},
1600     list => $parent->{list},
1601     quote => $parent->{quote},
1602     type => 'insert',
1603     };
1604     $parent->{section} = [null, $ins_el];
1605     $parent->{block} = [$ins_el];
1606     $parent->{text} = [];
1607     $parent->{list} = [];
1608     $parent->{quote} = [$parent->{block}->[-1]];
1609     }
1610     }
1611     } (insStartTagClass) {
1612     lang:Perl ($v => $token.value) {
1613     CORE::delete $parent->{tr};
1614     if ($state eq 'pre' or $state eq 'obspre') {
1615     $parent->{text}->[-1]->manakai_append_text
1616     (substr ($v, 1, length ($v) - 2) . "\x0A");
1617     } else {
1618     my $ins_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'insert');
1619     $parent->{block}->[-1]->append_child ($ins_el);
1620     $v =~ /\(([^()]*)/;
1621     $ins_el->set_attribute_ns (null, class => $1);
1622     push @{$parent->{edit}}, {
1623     section => $parent->{section},
1624     block => $parent->{block},
1625     list => $parent->{list},
1626     quote => $parent->{quote},
1627     type => 'insert',
1628     };
1629     $parent->{section} = [null, $ins_el];
1630     $parent->{block} = [$ins_el];
1631     $parent->{text} = [];
1632     $parent->{list} = [];
1633     $parent->{quote} = [$parent->{block}->[-1]];
1634     }
1635     }
1636     } (insEndTag) {
1637     lang:Perl ($v => $token.value) {
1638     CORE::delete $parent->{tr};
1639     if ($state eq 'pre' or $state eq 'obspre') {
1640     $parent->{text}->[-1]->manakai_append_text
1641     (substr ($v, 1, length ($v) - 2) . "\x0A");
1642     } else {
1643     if (defined $parent->{edit}->[0] and
1644     $parent->{edit}->[-1]->{type} eq 'insert') {
1645     my $rp = pop @{$parent->{edit}};
1646     $parent->{$_} = $rp->{$_}
1647     for qw/section block list quote/;
1648     $parent->{text} = [];
1649     } else {
1650     $parent->{text}->[-1]->manakai_append_text
1651     (substr ($v, 1, length ($v) - 2) . "\x0A");
1652     }
1653     }
1654     }
1655     } (delStartTag) {
1656     lang:Perl ($v => $token.value) {
1657     CORE::delete $parent->{tr};
1658     if ($state eq 'pre' or $state eq 'obspre') {
1659     $parent->{text}->[-1]->manakai_append_text
1660     (substr ($v, 1, length ($v) - 2) . "\x0A");
1661     } else {
1662     my $ins_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'delete');
1663     $parent->{block}->[-1]->append_child ($ins_el);
1664     push @{$parent->{edit}}, {
1665     section => $parent->{section},
1666     block => $parent->{block},
1667     list => $parent->{list},
1668     quote => $parent->{quote},
1669     type => 'delete',
1670     };
1671     $parent->{section} = [null, $ins_el];
1672     $parent->{block} = [$ins_el];
1673     $parent->{text} = [];
1674     $parent->{list} = [];
1675     $parent->{quote} = [$parent->{block}->[-1]];
1676     }
1677     }
1678     } (delStartTagClass) {
1679     lang:Perl ($v => $token.value) {
1680     CORE::delete $parent->{tr};
1681     if ($state eq 'pre' or $state eq 'obspre') {
1682     $parent->{text}->[-1]->manakai_append_text
1683     (substr ($v, 1, length ($v) - 2) . "\x0A");
1684     } else {
1685     my $ins_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'delete');
1686     $parent->{block}->[-1]->append_child ($ins_el);
1687     $v =~ /\(([^()]*)/;
1688     $ins_el->set_attribute_ns (null, class => $1);
1689     push @{$parent->{edit}}, {
1690     section => $parent->{section},
1691     block => $parent->{block},
1692     list => $parent->{list},
1693     quote => $parent->{quote},
1694     type => 'delete',
1695     };
1696     $parent->{section} = [null, $ins_el];
1697     $parent->{block} = [$ins_el];
1698     $parent->{text} = [];
1699     $parent->{list} = [];
1700     $parent->{quote} = [$parent->{block}->[-1]];
1701     }
1702     }
1703     } (delEndTag) {
1704     lang:Perl ($v => $token.value) {
1705     CORE::delete $parent->{tr};
1706     if ($state eq 'pre' or $state eq 'obspre') {
1707     $parent->{text}->[-1]->manakai_append_text
1708     (substr ($v, 1, length ($v) - 2) . "\x0A");
1709     } else {
1710     if (defined $parent->{edit}->[0] and
1711     $parent->{edit}->[-1]->{type} eq 'delete') {
1712     my $rp = pop @{$parent->{edit}};
1713     $parent->{$_} = $rp->{$_}
1714     for qw/section block list quote/;
1715     $parent->{text} = [];
1716     } else {
1717     $parent->{text}->[-1]->manakai_append_text
1718     (substr ($v, 1, length ($v) - 2) . "\x0A");
1719     }
1720     }
1721     }
1722     } (tableLine) {
1723     lang:Perl ($v => $token.value) {
1724     if ($state eq 'pre' or $state eq 'obspre') {
1725     $parent->{text}->[-1]->manakai_append_text (substr ($v, 1));
1726     } else {
1727     my $tbody_el;
1728     if (defined $parent->{tr}) {
1729     $tbody_el = $parent->{tr};
1730     } else {
1731     my $tbl_el = $self->{doc}->create_element_ns
1732     (<Q::xhtml2|>, 'h2:table');
1733     my $tbody_el = $self->{doc}->create_element_ns
1734     (<Q::xhtml2|>, 'h2:tbody');
1735     $tbl_el->append_child ($tbody_el);
1736     $parent->{block}->[-1]->append_child ($tbl_el);
1737     $parent->{tr} = $tbody_el;
1738     }
1739    
1740     my $tr_el = $self->{doc}->create_element_ns (<Q::xhtml2|>, 'h2:tr');
1741     $parent->{tr}->append_child ($tr_el);
1742     my $src = substr ($v, 1, length ($v) - 2);
1743     my $prev_cell;
1744     C: while ($src =~ /\G,\s*/gc) {
1745     $src =~ /\G([^,"][^,]*|"(?>[^"\\]*)(?>(?>[^"\\]+|\\.)*)"\s*)/gc;
1746     my $cell = defined $1 ? $1 : '';
1747     if ($cell =~ s/^"//) {
1748     $cell =~ s/"\s*$//g;
1749     $cell =~ s/\\(.)/$1/gs;
1750     } else {
1751     $cell =~ s/\s+$//g;
1752     if ($cell eq '==') {
1753     if (ref $prev_cell) {
1754     my $colspan = $prev_cell->get_attribute_ns (null, 'colspan');
1755     $colspan = defined $colspan ? $colspan + 1 : 1;
1756     $prev_cell->set_attribute_ns (null, colspan => $colspan);
1757     next C;
1758     }
1759     }
1760     }
1761     $prev_cell = $self->{doc}->create_element_ns
1762     (<Q::xhtml2|>, 'h2:td');
1763     $tr_el->append_child ($prev_cell);
1764    
1765     my $original_pos = pos $self->{source};
1766     {
1767     local $self->{token} = [];
1768     local $self->{char} = [];
1769     local $self->{source} = $cell;
1770     pos ($self->{source}) = 0;
1771     local $self->{location} = {};
1772     local $self->{scanner} = $self->can ('_scan_Body');
1773     $self->_parse_Body ({
1774     block => [$prev_cell],
1775     quote => [$prev_cell],
1776     section => [null, $prev_cell],
1777     text => [$prev_cell],
1778     });
1779     }
1780     pos ($self->{source}) = $original_pos;
1781     }
1782     $parent->{text} = [];
1783     $state = 'section';
1784     }
1785     }
1786     } (formStart) {
1787     my $form_el;
1788     my $param;
1789     my $ref;
1790     lang:Perl ($v => $token.value) {
1791     CORE::delete $parent->{tr};
1792     $form_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'form');
1793     $v =~ /#([a-z-]+)/;
1794     $form_el->set_attribute_ns (null, ref => $ref = $1);
1795     $param = '';
1796     }
1797    
1798     ~* (text) {
1799     lang:Perl ($v => $token.value) {
1800     $param .= $v;
1801     }
1802     } (quotedPair) {
1803     lang:Perl ($v => $token.value) {
1804     $param .= $v;
1805     }
1806     } (lita) {
1807     lang:Perl ($v => $token.value) {
1808     $param .= "'";
1809     }
1810     }
1811    
1812     ~ (formEnd) { }
1813    
1814     lang:Perl {
1815     if ($param =~ s/^\(([^()]*)\)//) {
1816     $form_el->set_attribute_ns (null, id => $1);
1817     }
1818     if ($ref eq 'form' and
1819     $param =~ m{\A
1820     : ' ((?>[^\\']*)(?>(?>[^\\']+|\\.)*)) ' ## input
1821     (?> : ' ((?>[^\\']*)(?>(?>[^\\']+|\\.)*)) ' ## template
1822     (?> : ' ((?>[^\\']*)(?>(?>[^\\']+|\\.)*)) ' )? )? ## option
1823     \z}x) {
1824     my ($in, $te, $op) = ($1, defined $2 ? $2 : '',
1825     defined $3 ? $3 : '');
1826     s/\\(.)/$1/g for $in, $te, $op;
1827     $form_el->set_attribute_ns (null, input => $1);
1828     $form_el->set_attribute_ns (null, template => defined $2 ? $2 : '');
1829     $form_el->set_attribute_ns (null, option => defined $3 ? $3 : '');
1830     } else {
1831     $param =~ s/^://;
1832     $form_el->set_attribute_ns (null, parameter => $param);
1833     }
1834    
1835     if (defined $parent->{text}->[0]) {
1836     $parent->{text}->[-1]->append_child ($form_el);
1837     } else {
1838     $parent->{block}->[-1]->append_child ($form_el);
1839     }
1840     }
1841     } (magicVersionS) {
1842     lang:Perl ($v => $token.value) {
1843     CORE::delete $parent->{tr};
1844     __CODE{setTextParent}__;
1845     $parent->{text}->[-1]->manakai_append_text (substr ($v, 1));
1846     }
1847     ?lexmode Body;
1848     } (magicVersionI) {
1849     lang:Perl ($v => $token.value) {
1850     CORE::delete $parent->{tr};
1851     __CODE{setTextParent}__;
1852     $parent->{text}->[-1]->manakai_append_text ($v);
1853     }
1854     ?lexmode Body;
1855     } (entityRef) {
1856     lang:Perl ($v => $token.value) {
1857     CORE::delete $parent->{tr};
1858     my $ref_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'replace');
1859     $ref_el->set_attribute_ns
1860     (null, 'by', substr ($v, 4, length ($v) - 8));
1861     if (defined $parent->{text}->[0]) {
1862     $parent->{text}->[-1]->append_child ($ref_el);
1863     } else {
1864     $parent->{block}->[-1]->append_child ($ref_el);
1865     }
1866     }
1867     } (imageStart) {
1868     lang:Perl {
1869     my $img_el = $self->{doc}->create_element_ns (<Q::sw09|>, 'image');
1870    
1871     my $value = '';
1872     while (my $token = shift @{$self->{token}}) {
1873     $value .= $token->{value} if defined $token->{value};
1874     }
1875     $value =~ tr/\x0D//d;
1876     $img_el->manakai_append_text ($value);
1877     $value = '';
1878    
1879     while ((my $char = $self->_shift_char) >= 0) {
1880     if ($char == 0x000D) {
1881     $img_el->manakai_append_text ($value);
1882     $value = '';
1883     } else {
1884     $value .= ord $char;
1885     }
1886     }
1887     $img_el->manakai_append_text ($value);
1888    
1889     $self->{doc}->document_element->append_child ($img_el);
1890     }
1891     } (name) {
1892     lang:Perl ($v => $token.value) {
1893     CORE::delete $parent->{tr};
1894     __CODE{setTextParent}__;
1895     $parent->{text}->[-1]->manakai_append_text ($v);
1896     }
1897     } (vi) {
1898     lang:Perl ($v => $token.value) {
1899     CORE::delete $parent->{tr};
1900     __CODE{setTextParent}__;
1901     $parent->{text}->[-1]->manakai_append_text ('=');
1902     }
1903     } (lit) {
1904     lang:Perl ($v => $token.value) {
1905     CORE::delete $parent->{tr};
1906     __CODE{setTextParent}__;
1907     $parent->{text}->[-1]->manakai_append_text ($v);
1908 wakaba 1.1 }
1909     }
1910 wakaba 1.2 } // Body
1911 wakaba 1.1
1912     rule MagicParam {
1913     ~* (name) {
1914     my $param_el;
1915     my $value;
1916     lang:Perl ($v => $token.value) {
1917     $param_el = $self->{doc}->create_element_ns
1918     (<Q::sw09|>, 'parameter');
1919     $param_el->set_attribute_ns (null, 'name', $v);
1920     $value = '';
1921     }
1922    
1923     ~ (vi) { }
1924     ~ (lit) { }
1925     ~* (text) {
1926     lang:Perl ($v => $token.value) {
1927     $value .= $v;
1928     }
1929     } (quotedPair) {
1930     lang:Perl ($v => $token.value) {
1931     $value .= substr ($v, 1);
1932     }
1933     }
1934     ~ (lit) { }
1935    
1936     lang:Perl {
1937     for (split /,/, $value) {
1938     $param_el->append_child ($self->{doc}->create_element_ns
1939     (<Q::sw09|>, 'value'))
1940     ->manakai_append_text ($_);
1941     }
1942    
1943     $self->{docel}->head_element->append_child ($param_el);
1944     }
1945     }
1946    
1947     ~ (eol) { }
1948     } // MagicParam
1949    
1950     rule _StartTag ($parent, $element_type, $class_names, $lang_tag) {
1951     lang:Perl {
1952 wakaba 1.2 __CODE{setTextParent}__;
1953 wakaba 1.1 my @class_names = split /\s+/, $class_names;
1954     my $et = {
1955     ABBR => [<Q::xhtml2|>, 'abbr'],
1956     CODE => [<Q::xhtml2|>, 'code'],
1957     DEL => [<Q::xhtml2|>, 'del'],
1958     DFN => [<Q::xhtml2|>, 'dfn'],
1959     INS => [<Q::xhtml2|>, 'ins'],
1960     KBD => [<Q::xhtml2|>, 'kbd'],
1961     Q => [<Q::xhtml2|>, 'q'],
1962     RUBY => [<Q::xhtml2|>, 'ruby'],
1963     RUBYB=> [<Q::sw09|>, 'rubyb'],
1964     SAMP => [<Q::xhtml2|>, 'samp'],
1965     SUB => [<Q::xhtml2|>, 'sub'],
1966     SUP => [<Q::xhtml2|>, 'sup'],
1967     VAR => [<Q::xhtml2|>, 'var'],
1968     WEAK => [<Q::sw09|>, 'weak'],
1969     AA => [<Q::aa|>, 'aa'],
1970     CITE => [<Q::xhtml2|>, 'cite'],
1971     CSECTION => [<Q::sw010|>, 'csection'],
1972     KEY => [<Q::sw010|>, 'key'],
1973     QN => [<Q::sw010|>, 'qn'],
1974     SPAN => [<Q::xhtml2|>, 'span'],
1975     SRC => [<Q::sw010|>, 'src'],
1976     }->{$element_type};
1977     unless (defined $et) {
1978     $et = [<Q::xhtml2|>, 'code'];
1979     push @class_names, $element_type;
1980     }
1981 wakaba 1.2 my $el = $self->{doc}->create_element_ns ($et->[0], $et->[1]);
1982     $parent->{text}->[-1]->append_child ($el);
1983     $el->set_attribute_ns (null, 'class' => join ' ', @class_names)
1984 wakaba 1.1 if @class_names;
1985 wakaba 1.2 $el->set_attribute_ns (<Q::xml|>, 'xml:lang', $lang_tag)
1986 wakaba 1.1 if defined $lang_tag;
1987 wakaba 1.2
1988     if ($element_type eq 'RUBY' or $element_type eq 'RUBYB' or
1989     $element_type eq 'RUBYB') {
1990     $el = $el->append_child ($self->{doc}->create_element_ns
1991     (<Q::xhtml2|>, 'rb'));
1992     } elsif ($element_type eq 'QN') {
1993     $el = $el->append_child ($self->{doc}->create_element_ns
1994     (<Q::sw010|>, 'qname'));
1995     }
1996    
1997     push @{$parent->{text}}, $el;
1998 wakaba 1.1 }
1999     } // _StartTag
2000    
2001 wakaba 1.2 token-error default : default {
2002     //
2003     }
2004    
2005     @CODE:
2006     @@QName: setTextParent
2007 wakaba 1.1 @@PerlDef:
2008 wakaba 1.2 unless (defined $parent->{text}->[0]) {
2009     $parent->{text} = [$parent->{block}->[-1]
2010     ->append_child
2011     ($self->{doc}->create_element_ns
2012     (<Q::xhtml2|>, 'h2:p'))];
2013 wakaba 1.1 }
2014    
2015 wakaba 1.2 @CODE:
2016     @@QName: endTag
2017     @@PerlDef:
2018     if (defined $parent->{text}->[1]) {
2019     if (defined $iref) {
2020     $parent->{text}->[-1]->set_attribute_ns
2021     (<Q::sw09|>, 'sw9:anchor', 0+$iref);
2022     }
2023     if (defined $xref) {
2024     if ($xref =~ s/^([A-Z]+)://) {
2025     $parent->{text}->[-1]->set_attribute_ns
2026     (<Q::sw09|>, 'sw9:resScheme', $1);
2027     $parent->{text}->[-1]->set_attribute_ns
2028     (<Q::sw09|>, 'sw9:resParameter', $xref);
2029     } else {
2030     $parent->{text}->[-1]->set_attribute_ns
2031     (<Q::sw09|>, 'sw9:resScheme', 'URI');
2032     $parent->{text}->[-1]->set_attribute_ns
2033     (<Q::sw09|>, 'sw9:resParameter', $xref);
2034     }
2035     }
2036     $#{$parent->{text}}--;
2037     } else {
2038     __CODE{setTextParent}__;
2039     $parent->{text}->[-1]->manakai_append_text ($tagString);
2040     }
2041 wakaba 1.3
2042     @PTests:
2043     @@PTest:
2044     @@@QName: p.empty.test
2045     @@@DEnt:
2046     @@@@test:value:
2047     \
2048     @@@test:domTree:
2049     document {
2050     element {
2051     namespace-uri: 'urn:x-suika-fam-cx:markup:suikawiki:0:9:';
2052     local-name: 'document';
2053     markup-language-name: 'SuikaWiki';
2054     markup-language-version: '0.10';
2055     element {
2056     namespace-uri: 'http://www.w3.org/2002/06/xhtml2/';
2057     local-name: 'head';
2058     has-child-nodes: false;
2059     }
2060     element {
2061     namespace-uri: 'http://www.w3.org/2002/06/xhtml2/';
2062     local-name: 'body';
2063     has-child-nodes: false;
2064     }
2065     }
2066     }
2067     @@PTest:
2068     @@@QName: p.magic.sw09.test
2069     @@@DEnt:
2070     @@@@test:value:
2071     #?SuikaWiki/0.9
2072     @@@test:domTree:
2073     document {
2074     element {
2075     namespace-uri: 'urn:x-suika-fam-cx:markup:suikawiki:0:9:';
2076     local-name: 'document';
2077     markup-language-name: 'SuikaWiki';
2078     markup-language-version: '0.9';
2079     element {
2080     namespace-uri: 'http://www.w3.org/2002/06/xhtml2/';
2081     local-name: 'head';
2082     has-child-nodes: false;
2083     }
2084     element {
2085     namespace-uri: 'http://www.w3.org/2002/06/xhtml2/';
2086     local-name: 'body';
2087     has-child-nodes: false;
2088     }
2089     }
2090     }
2091     @@PTest:
2092     @@@QName: p.magic.swimg09.test
2093     @@@DEnt:
2094     @@@@test:value:
2095     #?SuikaWikiImage/0.9
2096     @@@test:domTree:
2097     document {
2098     element {
2099     namespace-uri: 'urn:x-suika-fam-cx:markup:suikawiki:0:9:';
2100     local-name: 'document';
2101     markup-language-name: 'SuikaWikiImage';
2102     markup-language-version: '0.9';
2103     element {
2104     namespace-uri: 'http://www.w3.org/2002/06/xhtml2/';
2105     local-name: 'head';
2106     has-child-nodes: false;
2107     }
2108     element {
2109     namespace-uri: 'http://www.w3.org/2002/06/xhtml2/';
2110     local-name: 'body';
2111     has-child-nodes: false;
2112     }
2113     }
2114     }
2115    
2116     @@PerlDef:
2117 wakaba 1.5 my $impl = $Message::DOM::ImplementationRegistry->get_dom_implementation ({
2118 wakaba 1.3 'Core' => '3.0',
2119     'XML' => '3.0',
2120     });
2121    
2122     for my $test_data (@$TestData) {
2123     my $parser = <Class::ManakaiSWDMLParser>->new ($impl);
2124    
2125     $test->start_new_test ($test_data->{uri});
2126     my $doc_ent = $test_data->{entity}->{$test_data->{root_uri}};
2127     my $not_ok;
2128    
2129     ## -- DOM Configuration Parameters
2130    
2131     my $pcfg = $parser->dom_config;
2132     for (keys %{$test_data->{dom_config}}) {
2133     $pcfg->set_parameter ($_ => $test_data->{dom_config}->{$_});
2134     }
2135    
2136     # $pcfg->set_parameter ('error-handler' => sub ($$) {
2137     # my (undef, $err) = @_;
2138     # my $err_type = $err->type;
2139     # if ($test_data->{dom_error}->{$err_type}) {
2140     # $test->assert_error_equals
2141     # (actual_value => $err,
2142     # expected_hash => shift @{$test_data->{dom_error}
2143     # ->{$err_type}});
2144     # } else { # Uncatched error
2145     # warn $err;
2146     # unless ($err->severity == <C::c|DOMError.SEVERITY_WARNING>) {
2147     # $test->failure_comment ('Unexpected error |'.$err->type.'|');
2148     # $not_ok = true;
2149     # }
2150     # }
2151     # return true; # continue as far as possible
2152     # });
2153    
2154     ## -- Test and Result
2155    
2156     my $doc;
2157     try {
2158     $doc = $parser->parse_string ($doc_ent->{<Q::test|value>});
2159     $test->assert_dom_tree_equals
2160     (actual_value => $doc,
2161     expected_hash => $test_data->{dom_tree});
2162     for (values %{$test_data->{dom_error}||{}}) {
2163     if (@$_) {
2164     $test->failure_comment
2165     (@$_.' |DOMError|s of type |'.
2166     $_->[0]->{type}->{value}.'| are not reported');
2167     $not_ok = true;
2168     }
2169     }
2170     $not_ok ? $test->not_ok : $test->ok;
2171     undef $doc;
2172     } catch Message::Util::IF::DTException with {
2173     require Message::DOM::SimpleLS;
2174     my $ls = Message::DOM::SimpleLS::ManakaiDOMSimpleXMLSerializer->new;
2175     print STDERR $ls->write_to_string ($doc);
2176     } otherwise {
2177     my $err = shift;
2178     warn $err;
2179     $test->not_ok;
2180     };
2181     }
2182     ##SWDMLParser
2183 wakaba 1.1

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24