creole-0.5.0/0000755000004100000410000000000012055507032013014 5ustar www-datawww-datacreole-0.5.0/.travis.yml0000644000004100000410000000011712055507032015124 0ustar www-datawww-datarvm: - 1.8.7 - 1.9.3 - ruby-head - jruby - rbx-18mode - rbx-19mode creole-0.5.0/test/0000755000004100000410000000000012055507032013773 5ustar www-datawww-datacreole-0.5.0/test/parser_test.rb0000644000004100000410000007176212055507032016670 0ustar www-datawww-datarequire 'creole' class Bacon::Context def tc(html, creole, options = {}) Creole.creolize(creole, options).should.equal html end def tce(html, creole) tc(html, creole, :extensions => true) end end describe Creole::Parser do it 'should parse bold' do # Creole1.0: Bold can be used inside paragraphs tc "

This is bold

", "This **is** bold" tc "

This is bold and boldish

", "This **is** bold and **bold**ish" # Creole1.0: Bold can be used inside list items tc "", "* This is **bold**" # Creole1.0: Bold can be used inside table cells tc("
This is bold
", "|This is **bold**|") # Creole1.0: Links can appear inside bold text: tc("

A bold link: http://wikicreole.org/ nice!

", "A bold link: **http://wikicreole.org/ nice!**") # Creole1.0: Bold will end at the end of paragraph tc "

This is bold

", "This **is bold" # Creole1.0: Bold will end at the end of list items tc("", "* Item **bold\n* Item normal") # Creole1.0: Bold will end at the end of table cells tc("
Item boldAnother bold
", "|Item **bold|Another **bold") # Creole1.0: Bold should not cross paragraphs tc("

This is

bold maybe

", "This **is\n\nbold** maybe") # Creole1.0-Implied: Bold should be able to cross lines tc "

This is bold

", "This **is\nbold**" end it 'should parse italic' do # Creole1.0: Italic can be used inside paragraphs tc("

This is italic

", "This //is// italic") tc("

This is italic and italicish

", "This //is// italic and //italic//ish") # Creole1.0: Italic can be used inside list items tc "", "* This is //italic//" # Creole1.0: Italic can be used inside table cells tc("
This is italic
", "|This is //italic//|") # Creole1.0: Links can appear inside italic text: tc("

A italic link: http://wikicreole.org/ nice!

", "A italic link: //http://wikicreole.org/ nice!//") # Creole1.0: Italic will end at the end of paragraph tc "

This is italic

", "This //is italic" # Creole1.0: Italic will end at the end of list items tc("", "* Item //italic\n* Item normal") # Creole1.0: Italic will end at the end of table cells tc("
Item italicAnother italic
", "|Item //italic|Another //italic") # Creole1.0: Italic should not cross paragraphs tc("

This is

italic maybe

", "This //is\n\nitalic// maybe") # Creole1.0-Implied: Italic should be able to cross lines tc "

This is italic

", "This //is\nitalic//" end it 'should parse bold italics' do # Creole1.0: By example tc "

bold italics

", "**//bold italics//**" # Creole1.0: By example tc "

bold italics

", "//**bold italics**//" # Creole1.0: By example tc "

This is also good.

", "//This is **also** good.//" end it 'should parse headings' do # Creole1.0: Only three differed sized levels of heading are required. tc "

Heading 1

", "= Heading 1 =" tc "

Heading 2

", "== Heading 2 ==" tc "

Heading 3

", "=== Heading 3 ===" # WARNING: Optional feature, not specified in creole 1.0 tc "

Heading 4

", "==== Heading 4 ====" tc "
Heading 5
", "===== Heading 5 =====" tc "
Heading 6
", "====== Heading 6 ======" # Creole1.0: Closing (right-side) equal signs are optional tc "

Heading 1

", "=Heading 1" tc "

Heading 2

", "== Heading 2" tc "

Heading 3

", " === Heading 3" # Creole1.0: Closing (right-side) equal signs don't need to be balanced and don't impact the kind of heading generated tc "

Heading 1

", "=Heading 1 ===" tc "

Heading 2

", "== Heading 2 =" tc "

Heading 3

", " === Heading 3 ===========" # Creole1.0: Whitespace is allowed before the left-side equal signs. tc "

Heading 1

", " \t= Heading 1 =" tc "

Heading 2

", " \t== Heading 2 ==" # Creole1.0: Only white-space characters are permitted after the closing equal signs. tc "

Heading 1

", " = Heading 1 = " tc "

Heading 2

", " == Heading 2 == \t " # WARNING: !!Creole1.0 doesn't specify if text after closing equal signs # !!becomes part of the heading or invalidates the entire heading. # tc "

== Heading 2 == foo

", " == Heading 2 == foo" tc "

Heading 2 == foo

", " == Heading 2 == foo" # Creole1.0-Implied: Line must start with equal sign tc "

foo = Heading 1 =

", "foo = Heading 1 =" end it 'should parse links' do # Creole1.0: Links tc "

link

", "[[link]]" # Creole1.0: Links can appear in paragraphs (i.e. inline item) tc "

Hello, world

", "Hello, [[world]]" # Creole1.0: Named links tc "

Go to my page

", "[[MyBigPage|Go to my page]]" # Creole1.0: URLs tc "

http://www.wikicreole.org/

", "[[http://www.wikicreole.org/]]" # Creole1.0: Single punctuation characters at the end of URLs # should not be considered a part of the URL. [',','.','?','!',':',';','\'','"'].each do |punct| esc_punct = CGI::escapeHTML(punct) tc "

http://www.wikicreole.org/#{esc_punct}

", "http://www.wikicreole.org/#{punct}" end # Creole1.0: Nameds URLs (by example) tc("

Visit the WikiCreole website

", "[[http://www.wikicreole.org/|Visit the WikiCreole website]]") # WRNING: Parsing markup within a link is optional tc "

Weird Stuff

", "[[Weird Stuff|**Weird** //Stuff//]]" tc("

", "[[http://example.org/|{{image.jpg}}]]") # Inside bold tc "

link

", "**[[link]]**" # Whitespace inside [[ ]] should be ignored tc("

link

", "[[ link ]]") tc("

link me

", "[[ link me ]]") tc("

dot.com

", "[[ http://dot.com/ \t| \t dot.com ]]") tc("

dot.com

", "[[ http://dot.com/ | dot.com ]]") end it 'should parse freestanding urls' do # Creole1.0: Free-standing URL's should be turned into links tc "

http://www.wikicreole.org/

", "http://www.wikicreole.org/" # URL ending in . tc "

Text http://wikicreole.org. other text

", "Text http://wikicreole.org. other text" # URL ending in ), tc "

Text (http://wikicreole.org), other text

", "Text (http://wikicreole.org), other text" # URL ending in ). tc "

Text (http://wikicreole.org). other text

", "Text (http://wikicreole.org). other text" # URL ending in ). tc "

Text (http://wikicreole.org).

", "Text (http://wikicreole.org)." # URL ending in ) tc "

Text (http://wikicreole.org)

", "Text (http://wikicreole.org)" end it 'should parse paragraphs' do # Creole1.0: One or more blank lines end paragraphs. tc "

This is my text.

This is more text.

", "This is\nmy text.\n\nThis is\nmore text." tc "

This is my text.

This is more text.

", "This is\nmy text.\n\n\nThis is\nmore text." tc "

This is my text.

This is more text.

", "This is\nmy text.\n\n\n\nThis is\nmore text." # Creole1.0: A list end paragraphs too. tc "

Hello

", "Hello\n* Item\n" # Creole1.0: A table end paragraphs too. tc "

Hello

Cell
", "Hello\n|Cell|" # Creole1.0: A nowiki end paragraphs too. tc "

Hello

nowiki
", "Hello\n{{{\nnowiki\n}}}\n" # WARNING: A heading ends a paragraph (not specced) tc "

Hello

Heading

", "Hello\n= Heading =\n" end it 'should parse linebreaks' do # Creole1.0: \\ (wiki-style) for line breaks. tc "

This is the first line,
and this is the second.

", "This is the first line,\\\\and this is the second." end it 'should parse unordered_lists' do # Creole1.0: List items begin with a * at the beginning of a line. # Creole1.0: An item ends at the next * tc "", "* Item 1\n *Item 2\n *\t\tItem 3\n" # Creole1.0: Whitespace is optional before and after the *. tc("", " * Item 1\n*Item 2\n \t*\t\tItem 3\n") # Creole1.0: A space is required if if the list element starts with bold text. tc("", "***Item 1") tc("", "* **Item 1") # Creole1.0: An item ends at blank line tc("

Par

", "* Item\n\nPar\n") # Creole1.0: An item ends at a heading tc("

Heading

", "* Item\n= Heading =\n") # Creole1.0: An item ends at a table tc("
Cell
", "* Item\n|Cell|\n") # Creole1.0: An item ends at a nowiki block tc("
Code
", "* Item\n{{{\nCode\n}}}\n") # Creole1.0: An item can span multiple lines tc("", "* The quick\nbrown fox\n\tjumps over\nlazy dog.\n*Humpty Dumpty\nsat\t\non a wall.") # Creole1.0: An item can contain line breaks tc("", "* The quick brown\\\\fox jumps over lazy dog.") # Creole1.0: Nested tc "", "* Item 1\n **Item 2\n *\t\tItem 3\n" # Creole1.0: Nested up to 5 levels tc("", "*Item 1\n**Item 2\n***Item 3\n****Item 4\n*****Item 5\n") # Creole1.0: ** immediatly following a list element will be treated as a nested unordered element. tc("", "*Hello,\nWorld!\n**Not bold\n") # Creole1.0: ** immediatly following a list element will be treated as a nested unordered element. tc("
  1. Hello, World!
", "#Hello,\nWorld!\n**Not bold\n") # Creole1.0: [...] otherwise it will be treated as the beginning of bold text. tc("

Not bold

", "*Hello,\nWorld!\n\n**Not bold\n") end it 'should parse ordered lists' do # Creole1.0: List items begin with a * at the beginning of a line. # Creole1.0: An item ends at the next * tc "
  1. Item 1
  2. Item 2
  3. Item 3
", "# Item 1\n #Item 2\n #\t\tItem 3\n" # Creole1.0: Whitespace is optional before and after the #. tc("
  1. Item 1
  2. Item 2
  3. Item 3
", " # Item 1\n#Item 2\n \t#\t\tItem 3\n") # Creole1.0: A space is required if if the list element starts with bold text. tc("
      1. Item 1
", "###Item 1") tc("
  1. Item 1
", "# **Item 1") # Creole1.0: An item ends at blank line tc("
  1. Item

Par

", "# Item\n\nPar\n") # Creole1.0: An item ends at a heading tc("
  1. Item

Heading

", "# Item\n= Heading =\n") # Creole1.0: An item ends at a table tc("
  1. Item
Cell
", "# Item\n|Cell|\n") # Creole1.0: An item ends at a nowiki block tc("
  1. Item
Code
", "# Item\n{{{\nCode\n}}}\n") # Creole1.0: An item can span multiple lines tc("
  1. The quick brown fox jumps over lazy dog.
  2. Humpty Dumpty sat on a wall.
", "# The quick\nbrown fox\n\tjumps over\nlazy dog.\n#Humpty Dumpty\nsat\t\non a wall.") # Creole1.0: An item can contain line breaks tc("
  1. The quick brown
    fox jumps over lazy dog.
", "# The quick brown\\\\fox jumps over lazy dog.") # Creole1.0: Nested tc "
  1. Item 1
    1. Item 2
  2. Item 3
", "# Item 1\n ##Item 2\n #\t\tItem 3\n" # Creole1.0: Nested up to 5 levels tc("
  1. Item 1
    1. Item 2
      1. Item 3
        1. Item 4
          1. Item 5
", "#Item 1\n##Item 2\n###Item 3\n####Item 4\n#####Item 5\n") # Creole1.0_Infered: The two-bullet rule only applies to **. tc("
    1. Item
", "##Item") end it 'should parse ordered lists #2' do tc "
  1. Item 1
  2. Item 2
  3. Item 3
", "# Item 1\n #Item 2\n #\t\tItem 3\n" # Nested tc "
  1. Item 1
    1. Item 2
  2. Item 3
", "# Item 1\n ##Item 2\n #\t\tItem 3\n" # Multiline tc "
  1. Item 1 on multiple lines
", "# Item 1\non multiple lines" end it 'should parse ambiguious mixed lists' do # ol following ul tc("
  1. oitem
", "*uitem\n#oitem\n") # ul following ol tc("
  1. uitem
", "#uitem\n*oitem\n") # 2ol following ul tc("", "*uitem\n##oitem\n") # 2ul following ol tc("
  1. uitem
", "#uitem\n**oitem\n") # 3ol following 3ul tc("", "***uitem\n###oitem\n") # 2ul following 2ol tc("
    1. uitem
", "##uitem\n**oitem\n") # ol following 2ol tc("
    1. oitem1
  1. oitem2
", "##oitem1\n#oitem2\n") # ul following 2ol tc("
    1. oitem1
", "##oitem1\n*oitem2\n") end it 'should parse ambiguious italics and url' do # Uncommon URL schemes should not be parsed as URLs tc("

This is what can go wrong:this should be an italic text.

", "This is what can go wrong://this should be an italic text//.") # A link inside italic text tc("

How about a link, like http://example.org, in italic text?

", "How about //a link, like http://example.org, in italic// text?") # Another test from Creole Wiki tc("

Formatted fruits, for example:apples, oranges, pears ...

", "Formatted fruits, for example://apples//, oranges, **pears** ...") end it 'should parse ambiguious bold and lists' do tc "

bold text

", "** bold text **" tc "

bold text

", " ** bold text **" end it 'should parse nowiki' do # ... works as block tc "
Hello
", "{{{\nHello\n}}}\n" # ... works inline tc "

Hello world.

", "Hello {{{world}}}." tc "

Hello world.

", "{{{Hello}}} {{{world}}}." # Creole1.0: No wiki markup is interpreted inbetween tc "
**Hello**
", "{{{\n**Hello**\n}}}\n" # Creole1.0: Leading whitespaces are not permitted tc("

{{{ Hello }}}

", " {{{\nHello\n}}}") tc("

{{{ Hello }}}

", "{{{\nHello\n }}}") # Assumed: Should preserve whitespace tc("
 \t Hello, \t \n \t World \t 
", "{{{\n \t Hello, \t \n \t World \t \n}}}\n") # In preformatted blocks ... one leading space is removed tc("
nowikiblock\n}}}
", "{{{\nnowikiblock\n }}}\n}}}\n") # In inline nowiki, any trailing closing brace is included in the span tc("

this is nowiki}

", "this is {{{nowiki}}}}") tc("

this is nowiki}}

", "this is {{{nowiki}}}}}") tc("

this is nowiki}}}

", "this is {{{nowiki}}}}}}") tc("

this is nowiki}}}}

", "this is {{{nowiki}}}}}}}") end it 'should escape html' do # Special HTML chars should be escaped tc("

<b>not bold</b>

", "not bold") # Image tags should be escape tc("

\""tag"\"/

", "{{image.jpg|\"tag\"}}") # Malicious links should not be converted. tc("

Click

", "[[javascript:alert(\"Boo!\")|Click]]") end it 'should support character escape' do tc "

** Not Bold **

", "~** Not Bold ~**" tc "

// Not Italic //

", "~// Not Italic ~//" tc "

* Not Bullet

", "~* Not Bullet" # Following char is not a blank (space or line feed) tc "

Hello ~ world

", "Hello ~ world\n" tc "

Hello ~ world

", "Hello ~\nworld\n" # Not escaping inside URLs (Creole1.0 not clear on this) tc "

http://example.org/~user/

", "http://example.org/~user/" # Escaping links tc "

http://www.wikicreole.org/

", "~http://www.wikicreole.org/" end it 'should parse horizontal rule' do # Creole: Four hyphens make a horizontal rule tc "
", "----" # Creole1.0: Whitespace around them is allowed tc "
", " ----" tc "
", "---- " tc "
", " ---- " tc "
", " \t ---- \t " # Creole1.0: Nothing else than hyphens and whitespace is "allowed" tc "

foo ----

", "foo ----\n" tc "

---- foo

", "---- foo\n" # Creole1.0: [...] no whitespace is allowed between them tc "

-- --

", " -- -- " tc "

-- --

", " --\t-- " end it 'should parse table' do tc "
Hello, World!
", "|Hello, World!|" # Multiple columns tc "
c1c2c3
", "|c1|c2|c3|" # Multiple rows tc "
c11c12
c21c22
", "|c11|c12|\n|c21|c22|\n" # End pipe is optional tc "
c1c2c3
", "|c1|c2|c3" # Empty cells tc "
c1c3
", "|c1||c3" # Escaping cell separator tc "
c1|c2c3
", "|c1~|c2|c3" # Escape in last cell + empty cell tc "
c1c2|
", "|c1|c2~|" tc "
c1c2|
", "|c1|c2~||" tc "
c1c2|
", "|c1|c2~|||" # Equal sign after pipe make a header tc "
Header
", "|=Header|" tc "
c1Link text\"Image
", "|c1|[[Link|Link text]]|{{Image|Image text}}|" end it 'should parse following table' do # table followed by heading tc("
table

heading

", "|table|\n=heading=\n") tc("
table

heading

", "|table|\n\n=heading=\n") # table followed by paragraph tc("
table

par

", "|table|\npar\n") tc("
table

par

", "|table|\n\npar\n") # table followed by unordered list tc("
table
", "|table|\n*item\n") tc("
table
", "|table|\n\n*item\n") # table followed by ordered list tc("
table
  1. item
", "|table|\n#item\n") tc("
table
  1. item
", "|table|\n\n#item\n") # table followed by horizontal rule tc("
table

", "|table|\n----\n") tc("
table

", "|table|\n\n----\n") # table followed by nowiki block tc("
table
pre
", "|table|\n{{{\npre\n}}}\n") tc("
table
pre
", "|table|\n\n{{{\npre\n}}}\n") # table followed by table tc("
table
table
", "|table|\n|table|\n") tc("
table
table
", "|table|\n\n|table|\n") end it 'should parse following heading' do # heading tc("

heading1

heading2

", "=heading1=\n=heading2\n") tc("

heading1

heading2

", "=heading1=\n\n=heading2\n") # paragraph tc("

heading

par

", "=heading=\npar\n") tc("

heading

par

", "=heading=\n\npar\n") # unordered list tc("

heading

", "=heading=\n*item\n") tc("

heading

", "=heading=\n\n*item\n") # ordered list tc("

heading

  1. item
", "=heading=\n#item\n") tc("

heading

  1. item
", "=heading=\n\n#item\n") # horizontal rule tc("

heading


", "=heading=\n----\n") tc("

heading


", "=heading=\n\n----\n") # nowiki block tc("

heading

nowiki
", "=heading=\n{{{\nnowiki\n}}}\n") tc("

heading

nowiki
", "=heading=\n\n{{{\nnowiki\n}}}\n") # table tc("

heading

table
", "=heading=\n|table|\n") tc("

heading

table
", "=heading=\n\n|table|\n") end it 'should parse following paragraph' do # heading tc("

par

heading

", "par\n=heading=") tc("

par

heading

", "par\n\n=heading=") # paragraph tc("

par par

", "par\npar\n") tc("

par

par

", "par\n\npar\n") # unordered tc("

par

", "par\n*item") tc("

par

", "par\n\n*item") # ordered tc("

par

  1. item
", "par\n#item\n") tc("

par

  1. item
", "par\n\n#item\n") # horizontal tc("

par


", "par\n----\n") tc("

par


", "par\n\n----\n") # nowiki tc("

par

nowiki
", "par\n{{{\nnowiki\n}}}\n") tc("

par

nowiki
", "par\n\n{{{\nnowiki\n}}}\n") # table tc("

par

table
", "par\n|table|\n") tc("

par

table
", "par\n\n|table|\n") end it 'should parse following unordered list' do # heading tc("

heading

", "*item\n=heading=") tc("

heading

", "*item\n\n=heading=") # paragraph tc("", "*item\npar\n") # items may span multiple lines tc("

par

", "*item\n\npar\n") # unordered tc("", "*item\n*item\n") tc("", "*item\n\n*item\n") # ordered tc("
  1. item
", "*item\n#item\n") tc("
  1. item
", "*item\n\n#item\n") # horizontal rule tc("
", "*item\n----\n") tc("
", "*item\n\n----\n") # nowiki tc("
nowiki
", "*item\n{{{\nnowiki\n}}}\n") tc("
nowiki
", "*item\n\n{{{\nnowiki\n}}}\n") # table tc("
table
", "*item\n|table|\n") tc("
table
", "*item\n\n|table|\n") end it 'should parse following ordered list' do # heading tc("
  1. item

heading

", "#item\n=heading=") tc("
  1. item

heading

", "#item\n\n=heading=") # paragraph tc("
  1. item par
", "#item\npar\n") # items may span multiple lines tc("
  1. item

par

", "#item\n\npar\n") # unordered tc("
  1. item
", "#item\n*item\n") tc("
  1. item
", "#item\n\n*item\n") # ordered tc("
  1. item
  2. item
", "#item\n#item\n") tc("
  1. item
  1. item
", "#item\n\n#item\n") # horizontal role tc("
  1. item

", "#item\n----\n") tc("
  1. item

", "#item\n\n----\n") # nowiki tc("
  1. item
nowiki
", "#item\n{{{\nnowiki\n}}}\n") tc("
  1. item
nowiki
", "#item\n\n{{{\nnowiki\n}}}\n") # table tc("
  1. item
table
", "#item\n|table|\n") tc("
  1. item
table
", "#item\n\n|table|\n") end it 'should parse following horizontal rule' do # heading tc("

heading

", "----\n=heading=") tc("

heading

", "----\n\n=heading=") # paragraph tc("

par

", "----\npar\n") tc("

par

", "----\n\npar\n") # unordered tc("
", "----\n*item") tc("
", "----\n*item") # ordered tc("
  1. item
", "----\n#item") tc("
  1. item
", "----\n#item") # horizontal tc("

", "----\n----\n") tc("

", "----\n\n----\n") # nowiki tc("
nowiki
", "----\n{{{\nnowiki\n}}}\n") tc("
nowiki
", "----\n\n{{{\nnowiki\n}}}\n") # table tc("
table
", "----\n|table|\n") tc("
table
", "----\n\n|table|\n") end it 'should parse following nowiki block' do # heading tc("
nowiki

heading

", "{{{\nnowiki\n}}}\n=heading=") tc("
nowiki

heading

", "{{{\nnowiki\n}}}\n\n=heading=") # paragraph tc("
nowiki

par

", "{{{\nnowiki\n}}}\npar") tc("
nowiki

par

", "{{{\nnowiki\n}}}\n\npar") # unordered tc("
nowiki
", "{{{\nnowiki\n}}}\n*item\n") tc("
nowiki
", "{{{\nnowiki\n}}}\n\n*item\n") # ordered tc("
nowiki
  1. item
", "{{{\nnowiki\n}}}\n#item\n") tc("
nowiki
  1. item
", "{{{\nnowiki\n}}}\n\n#item\n") # horizontal tc("
nowiki

", "{{{\nnowiki\n}}}\n----\n") tc("
nowiki

", "{{{\nnowiki\n}}}\n\n----\n") # nowiki tc("
nowiki
nowiki
", "{{{\nnowiki\n}}}\n{{{\nnowiki\n}}}\n") tc("
nowiki
nowiki
", "{{{\nnowiki\n}}}\n\n{{{\nnowiki\n}}}\n") # table tc("
nowiki
table
", "{{{\nnowiki\n}}}\n|table|\n") tc("
nowiki
table
", "{{{\nnowiki\n}}}\n\n|table|\n") end it 'should parse image' do tc("

", "{{image.jpg}}") tc("

\"tag\"/

", "{{image.jpg|tag}}") tc("

", "{{http://example.org/image.jpg}}") end it 'should parse bold combo' do tc("

bold and

table

end

", "**bold and\n|table|\nend**") end it 'should support extensions' do tc("

This is not __underlined__

", "This is not __underlined__") tce("

This is underlined

", "This is __underlined__") tce("

This is deleted

", "This is --deleted--") tce("

This is inserted

", "This is ++inserted++") tce("

This is super

", "This is ^^super^^") tce("

This is sub

", "This is ~~sub~~") tce("

®

", "(R)") tce("

®

", "(r)") tce("

©

", "(C)") tce("

©

", "(c)") end it 'should support no_escape' do tc("

a/b/c

", "[[a/b/c]]") tc("

a/b/c

", "[[a/b/c]]", :no_escape => true) end end creole-0.5.0/README.creole0000644000004100000410000000155712055507032015154 0ustar www-datawww-data= Creole Creole is a Creole-to-HTML converter for Creole, the lightweight markup language (http://wikicreole.org/). Github uses this converter to render *.creole files. Project page on github: * http://github.com/larsch/creole Project page on rubyforge: * http://creole.rubyforge.org/ * http://rubyforge.org/projects/creole/ RDOC: * http://rdoc.info/projects/larsch/creole == INSTALLATION {{{ gem install creole }}} == SYNOPSIS {{{ require 'creole' html = Creole.creolize('== Creole text') }}} == BUGS If you found a bug, please report it at the Creole project's tracker on GitHub: http://github.com/larsch/creole/issues == AUTHORS * Lars Christensen (larsch) * Daniel Mendler (minad) == LICENSE Creole is Copyright (c) 2008 Lars Christensen. It is free software, and may be redistributed under the terms specified in the README file of the Ruby distribution. creole-0.5.0/Rakefile0000644000004100000410000000024012055507032014455 0ustar www-datawww-datatask :default => :test desc 'Run tests with bacon' task :test => FileList['test/*_test.rb'] do |t| sh "bacon -q -Ilib:test #{t.prerequisites.join(' ')}" end creole-0.5.0/creole.gemspec0000644000004100000410000000146112055507032015634 0ustar www-datawww-data# -*- encoding: utf-8 -*- require File.dirname(__FILE__) + '/lib/creole/version' require 'date' Gem::Specification.new do |s| s.name = 'creole' s.version = Creole::VERSION s.date = Date.today.to_s s.authors = ['Lars Christensen', 'Daniel Mendler'] s.email = ['larsch@belunktum.dk', 'mail@daniel-mendler.de'] s.summary = 'Lightweight markup language' s.description = 'Creole is a lightweight markup language (http://wikicreole.org/).' s.extra_rdoc_files = %w(README.creole) s.rubyforge_project = s.name s.files = `git ls-files`.split("\n") s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.require_paths = %w(lib) s.homepage = 'http://github.com/minad/creole' s.add_development_dependency('bacon') s.add_development_dependency('rake') end creole-0.5.0/metadata.yml0000644000004100000410000000335712055507032015327 0ustar www-datawww-data--- !ruby/object:Gem::Specification name: creole version: !ruby/object:Gem::Version version: 0.5.0 prerelease: platform: ruby authors: - Lars Christensen - Daniel Mendler autorequire: bindir: bin cert_chain: [] date: 2012-10-29 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: bacon requirement: &7674580 !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: *7674580 - !ruby/object:Gem::Dependency name: rake requirement: &7674100 !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: *7674100 description: Creole is a lightweight markup language (http://wikicreole.org/). email: - larsch@belunktum.dk - mail@daniel-mendler.de executables: [] extensions: [] extra_rdoc_files: - README.creole files: - .gitignore - .travis.yml - CHANGES - Gemfile - README.creole - Rakefile - creole.gemspec - lib/creole.rb - lib/creole/parser.rb - lib/creole/version.rb - test/parser_test.rb homepage: http://github.com/minad/creole licenses: [] post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement none: false requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: creole rubygems_version: 1.8.15 signing_key: specification_version: 3 summary: Lightweight markup language test_files: [] creole-0.5.0/Gemfile0000644000004100000410000000003212055507032014302 0ustar www-datawww-datasource :rubygems gemspec creole-0.5.0/CHANGES0000644000004100000410000000014612055507032014010 0ustar www-datawww-data0.5.0 * Remove methods make_*_anchor * Add method make_headline * Parse tags inside link text creole-0.5.0/.gitignore0000644000004100000410000000000412055507032014776 0ustar www-datawww-datadoc creole-0.5.0/lib/0000755000004100000410000000000012055507032013562 5ustar www-datawww-datacreole-0.5.0/lib/creole.rb0000644000004100000410000000066112055507032015363 0ustar www-datawww-datarequire 'creole/parser' require 'creole/version' module Creole # Convert the argument in Creole format to HTML and return the # result. Example: # # Creole.creolize("**Hello //World//**") # #=> "

Hello World

" # # This is an alias for calling Creole#parse: # Creole.new(text).to_html def self.creolize(text, options = {}) Parser.new(text, options).to_html end end creole-0.5.0/lib/creole/0000755000004100000410000000000012055507032015033 5ustar www-datawww-datacreole-0.5.0/lib/creole/version.rb0000644000004100000410000000004612055507032017045 0ustar www-datawww-datamodule Creole VERSION = '0.5.0' end creole-0.5.0/lib/creole/parser.rb0000644000004100000410000002530512055507032016661 0ustar www-datawww-datarequire 'cgi' require 'uri' # :main: Creole # The Creole parses and translates Creole formatted text into # XHTML. Creole is a lightweight markup syntax similar to what many # WikiWikiWebs use. Example syntax: # # = Heading 1 = # == Heading 2 == # === Heading 3 === # **Bold text** # //Italic text// # [[Links]] # |=Table|=Heading| # |Table |Cells | # {{image.png}} # # The simplest interface is Creole.creolize. The default handling of # links allow explicit local links using the [[link]] syntax. External # links will only be allowed if specified using http(s) and ftp(s) # schemes. If special link handling is needed, such as inter-wiki or # hierachical local links, you must inherit Creole::CreoleParser and # override make_local_link. # # You can customize the created image markup by overriding # make_image. # Main Creole parser class. Call CreoleParser#parse to parse Creole # formatted text. # # This class is not reentrant. A separate instance is needed for # each thread that needs to convert Creole to HTML. # # Inherit this to provide custom handling of links. The overrideable # methods are: make_local_link module Creole class Parser # Allowed url schemes # Examples: http https ftp ftps attr_accessor :allowed_schemes # Non-standard wiki text extensions enabled? # E.g. underlined, deleted text etc attr_writer :extensions def extensions?; @extensions; end # Disable url escaping for local links # Escaping: [[/Test]] --> %2FTest # No escaping: [[/Test]] --> Test attr_writer :no_escape def no_escape?; @no_escape; end # Create a new CreoleParser instance. def initialize(text, options = {}) @allowed_schemes = %w(http https ftp ftps) @text = text @extensions = @no_escape = nil options.each_pair {|k,v| send("#{k}=", v) } end # Convert CCreole text to HTML and return # the result. The resulting HTML does not contain and # tags. # # Example: # # parser = CreoleParser.new("**Hello //World//**", :extensions => true) # parser.to_html # #=> "

Hello World

" def to_html @out = '' @p = false @stack = [] parse_block(@text) @out end protected # Escape any characters with special meaning in HTML using HTML # entities. def escape_html(string) CGI::escapeHTML(string) end # Escape any characters with special meaning in URLs using URL # encoding. def escape_url(string) CGI::escape(string) end def start_tag(tag) @stack.push(tag) @out << '<' << tag << '>' end def end_tag @out << '' end def toggle_tag(tag, match) if @stack.include?(tag) if @stack.last == tag end_tag else @out << escape_html(match) end else start_tag(tag) end end def end_paragraph end_tag while !@stack.empty? @p = false end def start_paragraph if @p @out << ' ' if @out[-1] != ?\s else end_paragraph start_tag('p') @p = true end end # Translate an explicit local link to a desired URL that is # properly URL-escaped. The default behaviour is to convert local # links directly, escaping any characters that have special # meaning in URLs. Relative URLs in local links are not handled. # # Examples: # # make_local_link("LocalLink") #=> "LocalLink" # make_local_link("/Foo/Bar") #=> "%2FFoo%2FBar" # # Must ensure that the result is properly URL-escaped. The caller # will handle HTML escaping as necessary. HTML links will not be # inserted if the function returns nil. # # Example custom behaviour: # # make_local_link("LocalLink") #=> "/LocalLink" # make_local_link("Wikipedia:Bread") #=> "http://en.wikipedia.org/wiki/Bread" def make_local_link(link) #:doc: no_escape? ? link : escape_url(link) end # Sanatize a direct url (e.g. http://wikipedia.org/). The default # behaviour returns the original link as-is. # # Must ensure that the result is properly URL-escaped. The caller # will handle HTML escaping as necessary. Links will not be # converted to HTML links if the function returns link. # # Custom versions of this function in inherited classes can # implement specific link handling behaviour, such as redirection # to intermediate pages (for example, for notifing the user that # he is leaving the site). def make_direct_link(url) #:doc: url end # Sanatize and prefix image URLs. When images are encountered in # Creole text, this function is called to obtain the actual URL of # the image. The default behaviour is to return the image link # as-is. No image tags are inserted if the function returns nil. # # Custom version of the method can be used to sanatize URLs # (e.g. remove query-parts), inhibit off-site images, or add a # base URL, for example: # # def make_image_link(url) # URI.join("http://mywiki.org/images/", url) # end def make_image_link(url) #:doc: url end # Create image markup. This # method can be overridden to generate custom # markup, for example to add html additional attributes or # to put divs around the imgs. def make_image(uri, alt) if alt '' << escape_html(alt) << '' else '' end end def make_headline(level, text) "" << escape_html(text) << "" end def make_explicit_link(link) begin uri = URI.parse(link) return uri.to_s if uri.scheme && @allowed_schemes.include?(uri.scheme) rescue URI::InvalidURIError end make_local_link(link) end def parse_inline(str) until str.empty? case str when /\A(\~)?((https?|ftps?):\/\/\S+?)(?=([\,.?!:;"'\)]+)?(\s|$))/ str = $' if $1 @out << escape_html($2) else if uri = make_direct_link($2) @out << '' << escape_html($2) << '' else @out << escape_html($&) end end when /\A\[\[\s*([^|]*?)\s*(\|\s*(.*?))?\s*\]\]/m str = $' link, content = $1, $3 if uri = make_explicit_link(link) @out << '' if content until content.empty? content = parse_inline_tag(content) end else @out << escape_html(link) end @out << '' else @out << escape_html($&) end else str = parse_inline_tag(str) end end end def parse_inline_tag(str) case str when /\A\{\{\{(.*?\}*)\}\}\}/ @out << '' << escape_html($1) << '' when /\A\{\{\s*(.*?)\s*(\|\s*(.*?)\s*)?\}\}/ if uri = make_image_link($1) @out << make_image(uri, $3) else @out << escape_html($&) end when /\A([:alpha:]|[:digit:])+/ @out << $& when /\A\s+/ @out << ' ' if @out[-1] != ?\s when /\A\*\*/ toggle_tag 'strong', $& when /\A\/\// toggle_tag 'em', $& when /\A\\\\/ @out << '
' else if @extensions case str when /\A__/ toggle_tag 'u', $& when /\A\-\-/ toggle_tag 'del', $& when /\A\+\+/ toggle_tag 'ins', $& when /\A\^\^/ toggle_tag 'sup', $& when /\A\~\~/ toggle_tag 'sub', $& when /\A\(R\)/i @out << '®' when /\A\(C\)/i @out << '©' when /\A~([^\s])/ @out << escape_html($1) when /./ @out << escape_html($&) end else case str when /\A~([^\s])/ @out << escape_html($1) when /./ @out << escape_html($&) end end end return $' end def parse_table_row(str) @out << '' str.scan(/\s*\|(=)?\s*((\[\[.*?\]\]|\{\{.*?\}\}|[^|~]|~.)*)(?=\||$)/) do if !$2.empty? || !$'.empty? @out << ($1 ? '' : '') parse_inline($2) if $2 end_tag while @stack.last != 'table' @out << ($1 ? '' : '') end end @out << '' end def make_nowikiblock(input) input.gsub(/^ (?=\}\}\})/, '') end def ulol?(x); x == 'ul' || x == 'ol'; end def parse_block(str) until str.empty? case str when /\A\{\{\{\r?\n(.*?)\r?\n\}\}\}/m end_paragraph nowikiblock = make_nowikiblock($1) @out << '
' << escape_html(nowikiblock) << '
' when /\A\s*-{4,}\s*$/ end_paragraph @out << '
' when /\A\s*(={1,6})\s*(.*?)\s*=*\s*$(\r?\n)?/ end_paragraph level = $1.size @out << make_headline(level, $2) when /\A[ \t]*\|.*$(\r?\n)?/ if !@stack.include?('table') end_paragraph start_tag('table') end parse_table_row($&) when /\A\s*$(\r?\n)?/ end_paragraph when /\A(\s*([*#]+)\s*(.*?))$(\r?\n)?/ line, bullet, item = $1, $2, $3 tag = (bullet[0,1] == '*' ? 'ul' : 'ol') if bullet[0,1] == '#' || bullet.size != 2 || @stack.find {|x| ulol?(x) } count = @stack.select { |x| ulol?(x) }.size while !@stack.empty? && count > bullet.size count -= 1 if ulol?(@stack.last) end_tag end end_tag while !@stack.empty? && @stack.last != 'li' if @stack.last == 'li' && count == bullet.size end_tag if @stack.last != tag end_tag count -= 1 end end while count < bullet.size start_tag tag count += 1 start_tag 'li' if count < bullet.size end @p = true start_tag('li') parse_inline(item) else start_paragraph parse_inline(line) end when /\A([ \t]*\S+.*?)$(\r?\n)?/ start_paragraph parse_inline($1) else raise "Parse error at #{str[0,30].inspect}" end #p [$&, $'] str = $' end end_paragraph @out end end end