diff --git a/bristlecode.rb b/bristlecode.rb index 34670a7..e734e6c 100644 --- a/bristlecode.rb +++ b/bristlecode.rb @@ -15,11 +15,11 @@ module Bristlecode rule(:bold_open) { str('[b]') | str('[B]') } rule(:bold_close) { str('[/b]') | str('[/B]') | eof } - rule(:bold) { bold_open >> children.as(:bold) >> bold_close } + rule(:bold) { bold_open >> children.as(:bold) >> bold_close >> space? } rule(:italic_open) { str('[i]') | str('[I]') } rule(:italic_close) { str('[/i]') | str('[/I]') | eof } - rule(:italic) { italic_open >> children.as(:italic) >> italic_close } + rule(:italic) { italic_open >> children.as(:italic) >> italic_close >> space? } rule(:eof) { any.absent? } rule(:tag) { bold | italic } @@ -29,8 +29,8 @@ module Bristlecode rule(:tag_delim) { tag_open | tag_close } rule(:text) { (tag_delim.absent? >> any).repeat(1).as(:text) } - rule(:children) { space? >> elem.repeat } - rule(:doc) { space? >> elem.repeat.as(:doc) } + rule(:children) { space? >> elem.repeat >> space? } + rule(:doc) { space? >> elem.repeat.as(:doc) >> space? } root(:doc) end @@ -55,7 +55,7 @@ module Bristlecode class Text def initialize(text) - @text = text + @text = text.to_str.strip end def to_html diff --git a/spec/bristlecode/parser_spec.rb b/spec/bristlecode/parser_spec.rb index 2317ea4..0ddccc9 100644 --- a/spec/bristlecode/parser_spec.rb +++ b/spec/bristlecode/parser_spec.rb @@ -2,6 +2,51 @@ require 'parslet/rig/rspec' require_relative '../../bristlecode.rb' module Bristlecode + + describe '.to_html' do + + def to_html(text) + Bristlecode.to_html(text) + end + + it 'leaves an empty string unchanged' do + expect(to_html("")).to eq("") + end + + it 'handles empty documents' do + expect(to_html(" \t \n \n \t")).to eq("") + end + + it 'handles plain text just fine' do + expect(to_html("plaintext")).to eq("plaintext") + end + + it 'can bold stuff' do + expect(to_html("[b]bold[/b]")).to eq("bold") + end + + it 'can italic stuff' do + expect(to_html("[i]italic[/i]")).to eq("italic") + end + + it 'can nest tags' do + doc = '[b] bold [i] italic [/i] bold [/b]' + expected = 'bolditalicbold' + out = to_html(doc) + expect(out).to eq(expected) + + doc = '[i] italic [b] bold [/b] italic [/i]' + expected = 'italicbolditalic' + out = to_html(doc) + expect(out).to eq(expected) + end + + it 'auto-closes tags at eof' do + expect(to_html("[b]bold")).to eq("bold") + expect(to_html("[i]italic")).to eq("italic") + end + end + describe Parser do let(:parser) { Parser.new }