"Hannes Hirzel"<[email protected]> wrote:
> I worked through it and understood it. I adapted the class names so
> that it runs in the current Squeak 4.2 out of the box. In addition I
> edited it slightly. I think it could be added as to the PEGParser
> class. Maybe somebody else like to check it in addition ....

Yes, wrote it with the intent to eventually turn it into documentation for the 
Parsing package. On VW side we keep these in package comments, that's the most 
obvious location for it IMO. I'm not convinced that using a class comment on 
Squeak/Pharo side is a good choice. I would have difficulty myself to pick the 
class for it, so the chances that a new user will find it are even lower. I'm 
intrigued by the help facilities that were mentioned on Pharo side quite a bit 
recently. Is that something people hope to turn into the primary resource for 
these things ? Sounds like it would be quite easy to package it as that. The 
package comment are already written using the google wiki syntax, so that they 
can be directly posted to the google project site. So the help facilities 
allowing wiki syntax sound particularly attractive. Is this something that 
could work on Squeak side too, or do we need to do something different there ? 
In the meantime I intend to at least keep the google project pages up to date.

> Additional example: Wiki text parsing
>
> In the previous mail you mentioned that you'll add the fileout of the class
>
>    PEGWikiGenerator

Ah, I got caught up in the arithmetic example and forgot the attachments. They 
are attached now. Sorry about that.

Thanks for the edited version of the example. I'll work on it some more and 
turn it into a doc page on the site. If we figure out how to package it in 
Squeak and Pharo so that people can find it easily, I'd be happy to add all the 
documentation we have on the site.

Cheers,

Martin
PEGActor subclass: #PEGWikiGenerator
        instanceVariableNames: ''
        classVariableNames: 'Anchor Break Division Heading1 Heading2 Heading3 
Heading4 Href ListItem OrderedList Paragraph Preformatted Span Style Table 
TableBody TableData TableHead TableHeading TableRow UnorderedList '
        poolDictionaries: ''
        category: ''!

PEGWikiGenerator class
        instanceVariableNames: ''!

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!


!PEGWikiGenerator class methodsFor: 'utilities' stamp: ' 22/1/11 17:38'!

docsCSS

        ^'<style type="text/css">
                table {border-collapse: separate;}
                th {border: 1px solid black; padding: 3px; text-align: center;}
                td {border: 1px solid black; padding: 3px; text-align: left;}
        </style>'!

generateHtmlDocsInto: directory
        "Convert package comments into a set of web pages and put the files 
into @directory.
        "
        "
                self generateHtmlDocsInto: Kernel.ObjectMemory imageDirectory
        "

        ((Registry bundleNamed: 'XtreamsDevelopment') leafItems
                reject: [:p | '*-Tests' match: p name])
                collect:
                        [:p |
                        | body file |
                        body := self process: p comment reading.
                        file := directory / (p name , '.html').
                        file exists ifTrue: [file delete].
                        (file writing encoding: #ascii)
                                write: '<html>';
                                cr;
                                write: '<head>';
                                cr;
                                write: '<title>';
                                write: p name;
                                write: '</title>';
                                cr;
                                write: self docsCSS;
                                cr;
                                write: '</head>';
                                cr;
                                write: '<body>';
                                cr;
                                write: body printString;
                                cr;
                                write: '</body>';
                                cr;
                                write: '</html>';
                                close]!

generateWikiDocsInto: directory
        "Save package comments into a set of wiki pages for the project site 
wiki. Put the files into @directory.
        "
        "
                self generateWikiDocsInto: Kernel.ObjectMemory imageDirectory
        "
        "
                self generateWikiDocsInto: (OS.Filename fromComponents: 
('$(HOME)/st/xtreams/wiki' tokensBasedOn: $/)) asFilename
        "

        ((Registry bundleNamed: 'XtreamsDevelopment') leafItems
                reject:
                        [:p |
                        #('*-Tests' '*-Xperiments' '*-Support')
                                anySatisfy: [:pattern | pattern match: p name]])
                collect:
                        [:p |
                        | file |
                        file := p name
                                copyFrom: 'Xtreams-' size + 1
                                to: p name size.
                        file := directory / (file , '.wiki').
                        file exists ifTrue: [file delete].
                        (file writing encoding: #ascii)
                                write: p comment;
                                close]!

process: input
        "Convert input into an xhtml XML document.
        "
        "       input   <ReadStream>    text with wiki markup
                ^               <XML.Element>
        "
        "
                self process: 'Single paragraph with *bold* and _italic_ text 
and a [link]' reading
        "
        "
                | package div file |
                package := Store.Registry packageNamed: 'Xtreams-Core'.
                div := self process: package comment reading.
                file := '/dev/shm/', package name, '.html'.
                file asFilename writing write: '<html><body>'; write: div 
printString; write: '</body></html>'; close.
                ExternalWebBrowser open: 'file://', file
        "

        ^self parser
                parse: 'Page'
                stream: input
                actor: self new! !

!PEGWikiGenerator class methodsFor: 'accessing' stamp: ' 22/1/11 17:38'!

parser

        ^Parser parserPEG
                parse: 'Grammar'
                stream: Parser grammarWiki reading
                actor: ParserParser new! !

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!


PEGWikiGenerator comment:
'This actor is used to convert text with wiki mark-up into an XML document with 
xhtml tags.

Shared Variables
        Anchor  <NodeTag>
        Break   <NodeTag>
        Division        <NodeTag>
        Heading1        <NodeTag>
        Heading2        <NodeTag>
        Heading3        <NodeTag>
        Heading4        <NodeTag>
        Href    <NodeTag>
        ListItem        <NodeTag>
        OrderedList     <NodeTag>
        Paragraph       <NodeTag>
        Preformatted    <NodeTag>
        Span    <NodeTag>
        Style   <NodeTag>
        Table   <NodeTag>
        TableBody       <NodeTag>
        TableData       <NodeTag>
        TableHead       <NodeTag>
        TableHeading    <NodeTag>
        TableRow        <NodeTag>
        UnorderedList   <NodeTag>

'!

!PEGWikiGenerator methodsFor: 'Lexical' stamp: ' 22/1/11 17:38'!

Bold: flow

        <action: 'Bold' arguments: #(2)>
        ^Element
                tag: Span
                attributes:
                        (Array with: (Attribute name: Style value: 
'font-weight: bold'))
                elements: flow!

Character: character

        <action: 'Character'>
        ^Text text: (String with: character)!

Escape: escape

        <action: 'Escape'>
        ^escape first!

Italic: flow

        <action: 'Italic' arguments: #(2)>
        ^Element
                tag: Span
                attributes:
                        (Array with: (Attribute name: Style value: 'font-style: 
italic'))
                elements: flow!

LineCharacter: character

        <action: 'LineCharacter'>
        ^Text text: (String with: character)!

Link: address

        <action: 'LinkShort' arguments: #(2)>
        ^Element
                tag: Anchor
                attributes:
                        (Array
                                with:
                                        (Attribute
                                                name: Href
                                                value: address , '.html'))
                elements: (Array with: (Text text: address))!

Link: flow address: address

        <action: 'LinkFull' arguments: #(2 3)>
        ^Element
                tag: Anchor
                attributes: (Array with: (Attribute name: Href value: address))
                elements: flow!

Underline: flow

        <action: 'Underline' arguments: #(2)>
        ^Element
                tag: Span
                attributes:
                        (Array with: (Attribute name: Style value: 
'text-decoration: underline'))
                elements: flow! !

!PEGWikiGenerator methodsFor: 'Structural' stamp: ' 22/1/11 17:38'!

Empty

        <action: 'Empty' arguments: #()>
        ^Text text: ''  "^Element tag: break"!

Heading1: flow

        <action: 'Heading1' arguments: #(3)>
        ^Element tag: Heading1 elements: flow!

Heading2: flow

        <action: 'Heading2' arguments: #(3)>
        ^Element tag: Heading2 elements: flow!

Heading3: flow

        <action: 'Heading3' arguments: #(3)>
        ^Element tag: Heading3 elements: flow!

Heading4: flow

        <action: 'Heading4' arguments: #(3)>
        ^Element tag: Heading4 elements: flow!

ListItem: bullets flow: flow

        <action: 'Bullet1' arguments: #(2 3)>
        <action: 'Bullet2' arguments: #(2 3)>
        <action: 'Bullet3' arguments: #(2 3)>
        <action: 'Hash1' arguments: #(2 3)>
        <action: 'Hash2' arguments: #(2 3)>
        <action: 'Hash3' arguments: #(2 3)>

        ^Element tag: ListItem elements: flow!

OrderedList: bullets

        <action: 'OrderedList'>
        ^Element tag: OrderedList elements: bullets!

OrderedListN: bullets

        <action: 'OrderedList2'>
        <action: 'OrderedList3'>

        ^Element
                tag: ListItem
                elements: (Array with: (Element tag: OrderedList elements: 
bullets))!

Page: lines

        <action: 'Page'>
        ^Element tag: Division elements: lines!

Paragraph: flow

        <action: 'Paragraph'>
        ^Element tag: Paragraph elements: flow!

Preformatted: text

        <action: 'Preformatted' arguments: #(2)>
        <action: 'Code' arguments: #(2)>

        ^Element
                tag: Preformatted
                elements: (Array with: (Text text: text))!

Table: header rows: rows

        <action: 'Table' arguments: #(1 2)>
        ^Element
                tag: Table
                elements:
                        (Array
                                with:
                                        (Element
                                                tag: TableHead
                                                elements: (Array with: header))
                                with: (Element tag: TableBody elements: rows))!

TableCell: flow

        <action: 'Cell'>
        ^Element tag: TableData elements: flow!

TableHeadingCell: flow

        <action: 'HeadingCell'>
        ^Element tag: TableHeading elements: flow!

TableRow: cells

        <action: 'TableRow' arguments: #(3)>
        <action: 'HeadingRow' arguments: #(3)>

        ^Element tag: TableRow elements: cells!

UnorderedList: bullets

        <action: 'UnorderedList'>
        ^Element tag: UnorderedList elements: bullets!

UnorderedListN: bullets

        <action: 'UnorderedList2'>
        <action: 'UnorderedList3'>

        ^Element
                tag: ListItem
                elements: (Array with: (Element tag: UnorderedList elements: 
bullets))! !
PEG.WikiGenerator defineSharedVariable: #Anchor
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''a'''!

PEG.WikiGenerator defineSharedVariable: #Break
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''br'''!

PEG.WikiGenerator defineSharedVariable: #Division
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''div'''!

PEG.WikiGenerator defineSharedVariable: #Heading1
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''h1'''!

PEG.WikiGenerator defineSharedVariable: #Heading2
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''h2'''!

PEG.WikiGenerator defineSharedVariable: #Heading3
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''h3'''!

PEG.WikiGenerator defineSharedVariable: #Heading4
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''h4'''!

PEG.WikiGenerator defineSharedVariable: #Href
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''href'''!

PEG.WikiGenerator defineSharedVariable: #ListItem
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''li'''!

PEG.WikiGenerator defineSharedVariable: #OrderedList
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''ol'''!

PEG.WikiGenerator defineSharedVariable: #Paragraph
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''p'''!

PEG.WikiGenerator defineSharedVariable: #Preformatted
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''pre'''!

PEG.WikiGenerator defineSharedVariable: #Span
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''span'''!

PEG.WikiGenerator defineSharedVariable: #Style
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''style'''!

PEG.WikiGenerator defineSharedVariable: #Table
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''table'''!

PEG.WikiGenerator defineSharedVariable: #TableBody
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''tableBody'''!

PEG.WikiGenerator defineSharedVariable: #TableData
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''td'''!

PEG.WikiGenerator defineSharedVariable: #TableHead
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''tableHead'''!

PEG.WikiGenerator defineSharedVariable: #TableHeading
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''th'''!

PEG.WikiGenerator defineSharedVariable: #TableRow
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''tr'''!

PEG.WikiGenerator defineSharedVariable: #UnorderedList
        private: false
        constant: false
        category: 'xhtml tags'
        initializer: 'XML.NodeTag new qualifier: '''' ns: 
''http://www.w3.org/1999/xhtml'' type: ''ul'''!

Reply via email to