xan_markup 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c9cac59c7bc0bd578dac5751d30f416645cb220
4
- data.tar.gz: 4739e35d7e01e3db54049dde6c250490413b0547
3
+ metadata.gz: a72eecb5af9f00619a86b37553acd6c702ef520c
4
+ data.tar.gz: 78e0840af089ad5b0799e7f4432b6f48e03bab43
5
5
  SHA512:
6
- metadata.gz: 52c8ac1ebd69f0097755bd6151f2ea049d18fc8bf7ba008e2ff7544c4eda8f287d1c0c7aefe615588a595bfb0e61c7328d660ba3996d06da855a8fd746cc2811
7
- data.tar.gz: e9b0a6c7ec66882f2f585673ffa70c3ac232a8bc51cc20f80e77ea65ed28d78616f07ad21b9017ec1503535f948e3cb4f2a79a7c4f10e4e5c692f839c2ae9fc1
6
+ metadata.gz: 3d6a8f37316b8c6a8f8896f750bad74f10e6216d698f39a5a0fc3422f898cb13e88edbc3e32c82c340858375617a2f92171a988f286d12575951ee57b5345961
7
+ data.tar.gz: e9a75d1328b21364b5a9a8fa93c4effc1a59ae1b926e5b13ac45b0ce56e2ba01bb426bbfacf8a4a21b8c2671bf70f0127bf23878b7cdf3b20d278be0107f5848
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.2.0
@@ -0,0 +1,17 @@
1
+ module XanMarkup
2
+ class Caller
3
+ def initialize(context)
4
+ @context = context
5
+ end
6
+
7
+ def call
8
+ ->(tag) do
9
+ if @context.respond_to?(tag.method)
10
+ @context.send(tag.method, tag.args)
11
+ else
12
+ "missing tag: #{tag.name}"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,24 +1,10 @@
1
+ require 'xan_markup/markupizer'
2
+ require 'xan_markup/caller'
3
+
1
4
  module XanMarkup
2
- MarkupSyntax = /\{\{ ?(.*?) ?\}\}/
3
- QuotedString = /"[^"]+"|'[^']+'/
4
- QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/
5
- TagAttributes = /(\w+)\s*\=\s*(#{QuotedFragment})/
6
- CleanAttributeValue = /^("|')|("|')$/
7
5
  module Helper
8
6
  def markupize(content)
9
- content.to_s.dup.to_str.gsub(MarkupSyntax) do |markup|
10
- args = {}
11
- tag = $1.split.first
12
- method = "markup_#{tag}"
13
- $1.scan(TagAttributes) do |key, value|
14
- args[key.to_sym] = value.gsub(CleanAttributeValue, "")
15
- end
16
- if respond_to?(method)
17
- (args.empty? ? send(method) : send(method, args)).to_s
18
- else
19
- "missing tag: #{tag}"
20
- end
21
- end
7
+ Markupizer.new(content).markupize &Caller.new(self).call
22
8
  end
23
9
  end
24
10
  end
@@ -0,0 +1,23 @@
1
+ require 'xan_markup/tag'
2
+
3
+ module XanMarkup
4
+ class Markupizer
5
+ MarkupSyntax = /\{\{ ?(.*?) ?\}\}/
6
+
7
+ def initialize(content)
8
+ @content = content.to_s.dup.to_str
9
+ end
10
+
11
+ def tags
12
+ @content.scan(MarkupSyntax).map do |markup|
13
+ Tag.new(markup.first)
14
+ end
15
+ end
16
+
17
+ def markupize
18
+ @content.gsub(MarkupSyntax) do |markup|
19
+ yield Tag.new($1)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module XanMarkup
2
+ class Tag
3
+ QuotedString = /"[^"]+"|'[^']+'/
4
+ QuotedFragment = /#{QuotedString}|(?:[^\s,\|'"]|#{QuotedString})+/
5
+ TagArgs = /(\w+)\s*\=\s*(#{QuotedFragment})/
6
+ CleanArgValue = /^("|')|("|')$/
7
+
8
+ def initialize(tag)
9
+ @tag = tag
10
+ end
11
+
12
+ def name
13
+ @tag.split.first
14
+ end
15
+
16
+ def args
17
+ {}.tap { |args| @tag.scan(TagArgs) { |key, value| args[key.to_sym] = value.gsub(CleanArgValue, "") } }
18
+ end
19
+
20
+ def args?
21
+ args.size > 0
22
+ end
23
+
24
+ def method
25
+ "markup_#{name}"
26
+ end
27
+ end
28
+ end
@@ -1,9 +1,5 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- class XanMarkup::HelperTest
4
- include XanMarkup::Helper
5
- end
6
-
7
3
  class SafeBuffer < String
8
4
  def gsub(*args, &block)
9
5
  super
@@ -14,65 +10,81 @@ class SafeBuffer < String
14
10
 
15
11
  end
16
12
 
17
- describe XanMarkup::Helper do
18
- let(:helper) { XanMarkup::HelperTest.new }
13
+ module XanMarkup
19
14
 
20
- it "It should call property method when found tag" do
21
- helper.should_receive(:markup_test)
22
- helper.markupize("this is markup {{test}} tag")
15
+ class TestHelper
16
+ include Helper
23
17
  end
24
18
 
25
- it "It should property parse one parameter" do
26
- helper.should_receive(:markup_test).with(:name => "xan")
27
- helper.markupize('this is markup {{test name="xan"}} tag')
28
- end
29
19
 
30
- it "It should property parse two parameters" do
31
- helper.should_receive(:markup_test).with(:name => "xan", :next => "b")
32
- helper.markupize('this is markup {{test name="xan" next="b"}} tag')
33
- end
20
+ describe Helper do
21
+ let(:helper) { TestHelper.new }
34
22
 
35
- it "It should allow use single quotes too" do
36
- helper.should_receive(:markup_test).with(:name => "xan")
37
- helper.markupize("this is markup {{test name='xan'}} tag")
38
- end
23
+ it "should call property method when found tag" do
24
+ helper.should_receive(:markup_test)
25
+ helper.markupize("this is markup {{test}} tag")
26
+ end
39
27
 
40
- it "It should allow skip quotes too" do
41
- helper.should_receive(:markup_test).with(:name => "xan")
42
- helper.markupize("this is markup {{test name=xan}} tag")
43
- end
28
+ it "should not raise exception if tag is not defined" do
29
+ expect { helper.markupize("this is {{undefined}} tag")}.to_not raise_error(NoMethodError)
30
+ end
44
31
 
45
- it "It should parse two tags property" do
46
- helper.should_receive(:markup_test).twice
47
- helper.markupize("this is markup {{test}} {{test}} tag")
48
- end
32
+ it "should return text that tag is not defined" do
33
+ helper.markupize("this is markup {{ test }} tag").should include("missing tag: test")
34
+ end
49
35
 
50
- it "It should allow white space at beggining and end tag" do
51
- helper.should_receive(:markup_test)
52
- helper.markupize("this is markup {{ test }} tag")
36
+ it "should replace tag with content returned by markup markupizer" do
37
+ helper.stub(:markup_best_language).and_return("Ruby")
38
+ helper.markupize("Best language is: {{ best_language }}").should include("Ruby")
39
+ end
53
40
  end
54
41
 
55
- it "should not raise exception if tag is not defined" do
56
- expect { helper.markupize("this is markup {{ test }} tag") }.to_not raise_error(NoMethodError)
57
- end
58
42
 
59
- it "should return text that tag is not defined" do
60
- helper.markupize("this is markup {{ test }} tag").should include("missing tag: test")
61
- end
43
+ describe Markupizer do
62
44
 
63
- it "should replace tag with content returned by markup helper" do
64
- helper.stub(:markup_best_language).and_return("Ruby")
65
- helper.markupize("Best language is: {{ best_language }}").should include("Ruby")
66
- end
45
+ it "should replace content with data returned from block" do
46
+ markupizer = Markupizer.new("this is markup {{test}} tag")
47
+ markupizer.markupize {|tag| "SUPER" }.should include("SUPER")
48
+ end
67
49
 
50
+ it "should return two tags (whitespaces allowed)" do
51
+ markupizer = Markupizer.new('this is {{awesome}} markup {{test}}')
52
+ markupizer.should have(2).tags
53
+ end
68
54
 
69
- it "should works with classes that inherance from string" do
70
- helper.should_receive(:markup_test)
71
- helper.markupize SafeBuffer.new("{{test}}")
72
- end
55
+ it "should return tag even when whitespace inside tag is used" do
56
+ markupizer = Markupizer.new('this is markup {{ test }} tag')
57
+ markupizer.should have(1).tags
58
+ end
59
+
60
+ it "should give tag object with proper name" do
61
+ markupizer = Markupizer.new('this is markup {{test name="xan"}} tag')
62
+ markupizer.tags.first.name.should == "test"
63
+ end
64
+
65
+ it "should give tag object with proper args" do
66
+ markupizer = Markupizer.new('this is markup {{test name="xan"}}')
67
+ markupizer.tags.first.args.should == {name: "xan"}
68
+ end
73
69
 
70
+ it "should give tag args when using single quotes" do
71
+ markupizer = Markupizer.new("this is markup {{test name='xan'}} tag")
72
+ markupizer.tags.first.args.should == {name: "xan"}
73
+ end
74
74
 
75
+ it "should give tag args when quotes are skipped" do
76
+ markupizer = Markupizer.new("this is markup {{test name=xan}} tag")
77
+ markupizer.tags.first.args.should == {name: "xan"}
78
+ end
75
79
 
76
80
 
77
81
 
82
+
83
+ it "should works with classes that inherance from string" do
84
+ markupizer = Markupizer.new SafeBuffer.new("{{test}}")
85
+ markupizer.should have(1).tags
86
+ end
87
+
88
+
89
+ end
78
90
  end
data/xan_markup.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "xan_markup"
8
- s.version = "0.1.2"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Grzegorz Derebecki"]
12
- s.date = "2013-03-19"
12
+ s.date = "2013-05-20"
13
13
  s.description = "Simple tag parser"
14
14
  s.email = "grzegorz.derebecki@fdb.pl"
15
15
  s.extra_rdoc_files = [
@@ -26,7 +26,10 @@ Gem::Specification.new do |s|
26
26
  "Rakefile",
27
27
  "VERSION",
28
28
  "lib/xan_markup.rb",
29
+ "lib/xan_markup/caller.rb",
29
30
  "lib/xan_markup/helper.rb",
31
+ "lib/xan_markup/markupizer.rb",
32
+ "lib/xan_markup/tag.rb",
30
33
  "spec/spec_helper.rb",
31
34
  "spec/xan_markup/helper_spec.rb",
32
35
  "xan_markup.gemspec"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xan_markup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grzegorz Derebecki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-19 00:00:00.000000000 Z
11
+ date: 2013-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -83,7 +83,10 @@ files:
83
83
  - Rakefile
84
84
  - VERSION
85
85
  - lib/xan_markup.rb
86
+ - lib/xan_markup/caller.rb
86
87
  - lib/xan_markup/helper.rb
88
+ - lib/xan_markup/markupizer.rb
89
+ - lib/xan_markup/tag.rb
87
90
  - spec/spec_helper.rb
88
91
  - spec/xan_markup/helper_spec.rb
89
92
  - xan_markup.gemspec