markabb 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/benchmark ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby -wKU
2
+ require 'benchmark'
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+ require 'markabb'
5
+ puts "Benchmarking Markabb"
6
+
7
+ Markabb.configure do |c|
8
+ end
9
+
10
+ simple_string = "[b]Bold[/b]"
11
+ multi_format = "[b]bold [i]italic[/i][/b][u]underline[/u]"
12
+
13
+ Benchmark.bm do |x|
14
+ x.report("1 string:") { simple_string.markabb }
15
+ x.report("100 strings:") { 100.times do simple_string.markabb end }
16
+ x.report("1 multi format:") { multi_format.markabb }
17
+ x.report("100 multi formats:") { 100.times do multi_format.markabb end }
18
+ x.report("1000 string parses") { 500.times do multi_format.markabb
19
+ simple_string.markabb end }
20
+ end
@@ -0,0 +1,13 @@
1
+ module Markabb
2
+ # Class for callbacks, all callbacks should be an instance of this.
3
+ class Callback
4
+ def initialize(proc)
5
+ @proc = proc
6
+ end
7
+
8
+ # Passes all the options found in the gsub from the tag (see Markabb::Tag) to the Proc
9
+ def run(ar)
10
+ @proc.call *ar
11
+ end
12
+ end
13
+ end
@@ -39,20 +39,40 @@ module Markabb
39
39
 
40
40
  # Creates the Markabb::Tag object
41
41
  def initialize(matcher, replace)
42
- @matcher = matcher
43
- @replace = replace
42
+ if matcher.is_a? String
43
+ @matcher = generate_matcher(matcher)
44
+ elsif matcher.is_a? Regexp
45
+ @matcher = matcher
46
+ else
47
+ raise 'matcher is not valid'
48
+ end
49
+ if replace.is_a? String
50
+ @replace = replace
51
+ elsif replace.is_a? Markabb::Callback
52
+ @replace = false
53
+ @callback = replace
54
+ else
55
+ raise 'Replace is not valid'
56
+ end
44
57
  end
45
58
 
46
59
  # Runs the tag on the input string
47
60
  #
48
61
  # Takes the target string and a Markabb::Config object
49
62
  def run(s, config)
50
- s.gsub(@matcher, generate_replacement(@replace, config))
63
+ if @replace
64
+ return s.gsub(@matcher, generate_replacement(@replace, config))
65
+ elsif @callback
66
+ return run_callback(s)
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def run_callback(s)
73
+ s.gsub(@matcher) { |match| @callback.run(match.scan(@matcher).first) }
51
74
  end
52
75
 
53
- # Generates the replacement string
54
- #
55
- # Takes the replacement string and a config object
56
76
  def generate_replacement(replace, config)
57
77
  if replace.scan(/config\[:(.*?)\]/) != [] then
58
78
  return replace.gsub(/config\[(.*?)\]/, config[$1.to_sym])
@@ -60,5 +80,9 @@ module Markabb
60
80
  return replace
61
81
  end
62
82
  end
83
+
84
+ def generate_matcher(tag)
85
+ /\[#{tag}\](.*?)\[\/#{tag}\]/
86
+ end
63
87
  end
64
88
  end
@@ -43,6 +43,7 @@ module Markabb
43
43
  self[:image_alt] ||= "Posted Image"
44
44
  self[:table_width] ||= "100%"
45
45
  self[:syntax_highlighter] ||= :raw
46
+ self[:coderay_options] ||= {}
46
47
  end
47
48
  end
48
49
  end
@@ -0,0 +1,17 @@
1
+ module Markabb
2
+ module Highlighters
3
+ # Markabb Syntax Highlighter for CodeRay
4
+ #
5
+ # See http://http://coderay.rubychan.de/ for CodeRay
6
+ class Coderay < Markabb::SyntaxHighlighter
7
+ # Takes the language and string as an option and passes config from Markabb for coderay
8
+ #
9
+ # See http://coderay.rubychan.de/ for CodeRays configuration options
10
+ def parse(lang, s)
11
+ "[nobbc]" + ::CodeRay.scan(s, lang).div(Markabb.config.coderay_options) + "[/nobbc]"
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ Markabb.register_highlighter(:coderay, Markabb::Highlighters::Coderay)
@@ -1,10 +1,10 @@
1
- Markabb.register_tag :bold, Markabb::Tag.new(/\[b\](.*?)\[\/b\]/, '<b>\1</b>'), :formatting
2
- Markabb.register_tag :italic, Markabb::Tag.new(/\[i\](.*?)\[\/i\]/, '<i>\1</i>'), :formatting
3
- Markabb.register_tag :underline, Markabb::Tag.new(/\[u\](.*?)\[\/u\]/, '<u>\1</u>'), :formatting
4
- Markabb.register_tag :center, Markabb::Tag.new(/\[center\](.*?)\[\/center\]/, '<center>\1</center>'), :formatting
5
- Markabb.register_tag :left, Markabb::Tag.new(/\[left\](.*?)\[\/left\]/, '<left>\1</left>'), :formatting
6
- Markabb.register_tag :right, Markabb::Tag.new(/\[right\](.*?)\[\/right\]/, '<right>\1</right>'), :formatting
7
- Markabb.register_tag :heading_1, Markabb::Tag.new(/\[h1\](.*?)\[\/h1\]/, '<h1>\1</h1>'), :formatting
8
- Markabb.register_tag :heading_2, Markabb::Tag.new(/\[h2\](.*?)\[\/h2\]/, '<h2>\1</h2>'), :formatting
9
- Markabb.register_tag :heading_3, Markabb::Tag.new(/\[h3\](.*?)\[\/h3\]/, '<h3>\1</h3>'), :formatting
10
- Markabb.register_tag :heading_4, Markabb::Tag.new(/\[h4\](.*?)\[\/h4\]/, '<h4>\1</h4>'), :formatting
1
+ Markabb.register_tag :bold, Markabb::Tag.new('b', '<b>\1</b>'), :formatting
2
+ Markabb.register_tag :italic, Markabb::Tag.new('i', '<i>\1</i>'), :formatting
3
+ Markabb.register_tag :underline, Markabb::Tag.new('u', '<u>\1</u>'), :formatting
4
+ Markabb.register_tag :center, Markabb::Tag.new('center', '<center>\1</center>'), :formatting
5
+ Markabb.register_tag :left, Markabb::Tag.new('left', '<left>\1</left>'), :formatting
6
+ Markabb.register_tag :right, Markabb::Tag.new('right', '<right>\1</right>'), :formatting
7
+ Markabb.register_tag :heading_1, Markabb::Tag.new('h1', '<h1>\1</h1>'), :formatting
8
+ Markabb.register_tag :heading_2, Markabb::Tag.new('h2', '<h2>\1</h2>'), :formatting
9
+ Markabb.register_tag :heading_3, Markabb::Tag.new('h3', '<h3>\1</h3>'), :formatting
10
+ Markabb.register_tag :heading_4, Markabb::Tag.new('h4', '<h4>\1</h4>'), :formatting
@@ -1,2 +1,2 @@
1
- Markabb.register_tag :image, Markabb::Tag.new(/\[img\](.*?)\[\/img\]/, '<img src="\1" alt="config[:image_alt]" />'), :image
1
+ Markabb.register_tag :image, Markabb::Tag.new('img', '<img src="\1" alt="config[:image_alt]" />'), :image
2
2
  Markabb.register_tag :image_with_alt, Markabb::Tag.new(/\[img alt=(.*?)\](.*?)\[\/img\]/, '<img src="\2" alt="\1" />'), :image
@@ -1,2 +1,2 @@
1
- Markabb.register_tag :url, Markabb::Tag.new(/\[url\](.*?)\[\/url\]/, '<a href="\1" target="config[:url_target]">\1</a>'), :link
1
+ Markabb.register_tag :url, Markabb::Tag.new('url', '<a href="\1" target="config[:url_target]">\1</a>'), :link
2
2
  Markabb.register_tag :url_with_title, Markabb::Tag.new(/\[url=(.*?)\](.*?)\[\/url\]/, '<a href="\1" target="config[:url_target]">\2</a>'), :link
@@ -1,3 +1,16 @@
1
- Markabb.register_tag :un_ordered, Markabb::Tag.new(/\[ul\](.*?)\[\/ul\]/, '<ul>\1</ul>'), :list
2
- Markabb.register_tag :ordered, Markabb::Tag.new(/\[ol\](.*?)\[\/ol\]/, '<ol>\1</ol>'), :list
3
- Markabb.register_tag :list_item, Markabb::Tag.new(/\[li\](.*?)\[\/li\]/, '<li>\1</li>'), :list
1
+ list_callback = Markabb::Callback.new(Proc.new { |s|
2
+ if s =~ /\[\*\]/
3
+ tag = "ul"
4
+ elsif s =~ /\[#\]/
5
+ tag = "ol"
6
+ end
7
+
8
+ items = s.gsub(/\[list\]/, '').gsub(/\[\/list\]/, '').gsub(/\[(\*|#)\](.*?)(\[|<|$)/, '<li>\2</li>\3').gsub(/<\/li><br \/><li>/, '</li><li>')
9
+
10
+ "<#{tag}>#{items}</#{tag}>"
11
+ })
12
+
13
+ Markabb.register_tag :un_ordered, Markabb::Tag.new('ul', '<ul>\1</ul>'), :lists
14
+ Markabb.register_tag :ordered, Markabb::Tag.new('ol', '<ol>\1</ol>'), :lists
15
+ Markabb.register_tag :list_item, Markabb::Tag.new('li', '<li>\1</li>'), :lists
16
+ Markabb.register_tag :smart_list, Markabb::Tag.new(/\[list\](.*?)\[\/list\]/, list_callback), :lists
@@ -1,6 +1,6 @@
1
- Markabb.register_tag :table, Markabb::Tag.new(/\[table\](.*?)\[\/table\]/, '<table width="config[:table_width]">\1</table>'), :table
2
- Markabb.register_tag :table_tr, Markabb::Tag.new(/\[tr\](.*?)\[\/tr\]/, '<tr>\1</tr>'), :table
3
- Markabb.register_tag :table_td, Markabb::Tag.new(/\[td\](.*?)\[\/td\]/, '<td>\1</td>'), :table
4
- Markabb.register_tag :table_header, Markabb::Tag.new(/\[th\](.*?)\[\/th\]/, '<th>\1</th>'), :table
5
- Markabb.register_tag :table_row, Markabb::Tag.new(/\[row\](.*?)\[\/row\]/, '<tr>\1</tr>'), :table
6
- Markabb.register_tag :table_cell, Markabb::Tag.new(/\[cell\](.*?)\[\/cell\]/, '<td>\1</td>'), :table
1
+ Markabb.register_tag :table, Markabb::Tag.new('table', '<table width="config[:table_width]">\1</table>'), :table
2
+ Markabb.register_tag :table_tr, Markabb::Tag.new('tr', '<tr>\1</tr>'), :table
3
+ Markabb.register_tag :table_td, Markabb::Tag.new('td', '<td>\1</td>'), :table
4
+ Markabb.register_tag :table_header, Markabb::Tag.new('th', '<th>\1</th>'), :table
5
+ Markabb.register_tag :table_row, Markabb::Tag.new('row', '<tr>\1</tr>'), :table
6
+ Markabb.register_tag :table_cell, Markabb::Tag.new('cell', '<td>\1</td>'), :table
@@ -1,4 +1,4 @@
1
1
  module Markabb
2
2
  # Markabbs Version Number
3
- VERSION = "0.0.2"
3
+ VERSION = "1.0.0"
4
4
  end
data/lib/markabb.rb CHANGED
@@ -1,13 +1,18 @@
1
+ # Gems
2
+ require 'rubygems'
3
+ require 'coderay'
1
4
  # Top Level Requires
2
5
  require "markabb/config"
3
6
  require "markabb/parse"
4
7
  require "markabb/version"
5
8
  # Clases
9
+ require "markabb/classes/callback"
6
10
  require "markabb/classes/parser"
7
11
  require "markabb/classes/tag"
8
12
  require "markabb/classes/string"
9
13
  require "markabb/classes/syntax_highlighter"
10
14
  # Highlighters
15
+ require "markabb/highlighters/coderay"
11
16
  require "markabb/highlighters/raw"
12
17
 
13
18
  # Main Markabb Module, all code is a sub of this
data/markabb.gemspec CHANGED
@@ -17,4 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.require_paths = ["lib"]
18
18
 
19
19
  s.add_development_dependency "rspec"
20
+ s.add_development_dependency "yard"
21
+
22
+ s.add_runtime_dependency "coderay"
20
23
  end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Markabb::Highlighters::Coderay do
4
+ it "should be selectable" do
5
+ default_config
6
+ Markabb.config.syntax_highlighter = :coderay
7
+ "[code lang=ruby]:foo => 'bar'[/code]".markabb
8
+ end
9
+
10
+ it "should allow you configure coderay" do
11
+ default_config
12
+ Markabb.config.syntax_highlighter = :coderay
13
+ Markabb.config.coderay_options = {:line_numbers => :inline}
14
+ "[code lang=ruby]:foo => 'bar'[/code]".markabb.should =~ /"#n1"/
15
+ end
16
+ end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe Markabb::Highlighters::Raw do
4
4
  it "should be able to parse a code tag" do
5
+ default_config
5
6
  "[code lang=ruby]def foo(bar)
6
7
  return bar
7
8
  end[/code]".markabb.should eq "<code>def foo(bar)<br /> return bar<br /> end</code>"
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Markabb::Callback do
4
+ it "should take a proc" do
5
+ cb = Markabb::Callback.new(Proc.new { })
6
+ end
7
+
8
+ it "should take an argument and pass it to the proc" do
9
+ sample_callback.run("this").should eq "THIS"
10
+ end
11
+
12
+ it "should allow callbacks to be called from Markabb::Tag" do
13
+ Markabb.register_tag :upcase, Markabb::Tag.new('up', sample_callback)
14
+ "[up]this[/up]".markabb.should eq "THIS"
15
+ Markabb.remove_tag :upcase
16
+ end
17
+
18
+ it "should only parse the contents of the tag" do
19
+ Markabb.register_tag :upcase, Markabb::Tag.new('up', sample_callback)
20
+ "[up]this[/up] that [up]foo[/up]".markabb.should eq "THIS that FOO"
21
+ Markabb.remove_tag :upcase
22
+ end
23
+
24
+ it "should work with multi input procs" do
25
+ callback = Markabb::Callback.new(Proc.new { |foo, bar|
26
+ "Foo: #{foo}, Bar: #{bar}"
27
+ })
28
+ Markabb.register_tag :foobar, Markabb::Tag.new(/\[foo=(.*?)\](.*?)\[\/foo\]/, callback)
29
+ "[foo=this]that[/foo]".markabb.should eq "Foo: this, Bar: that"
30
+ Markabb.remove_tag :foobar
31
+ end
32
+ end
@@ -6,7 +6,7 @@ describe Markabb::Tag do
6
6
  end
7
7
 
8
8
  it "should allow tag registration" do
9
- Markabb.register_tag :foo, Markabb::Tag.new(/foo/, 'bar')
9
+ Markabb.register_tag :foo, Markabb::Tag.new(/foo/, 'foo')
10
10
  Markabb::Tags[:foo].should be_a Markabb::Tag
11
11
  end
12
12
 
@@ -31,4 +31,18 @@ describe Markabb::Tag do
31
31
  default_config
32
32
  "blah [nobbc][b]bold[/b][/nobbc] blah".markabb.should eq "blah &#91;b&#93bold&#91;/b&#93 blah"
33
33
  end
34
+
35
+ it "should support simple tag creators" do
36
+ tag = Markabb::Tag.new('bi', '<b><i>\1</i></b>')
37
+ end
38
+
39
+ it "should have a working simple tag" do
40
+ default_config
41
+ tag = Markabb::Tag.new('bi', '<b><i>\1</i></b>')
42
+ tag.run("[bi]test[/bi]", Markabb.config).should eq "<b><i>test</i></b>"
43
+ end
44
+
45
+ it "should raise an exception if a bad matcher is given" do
46
+ lambda { Markabb::Tag.new(7, '<b><i>\1</i></b>') }.should raise_exception
47
+ end
34
48
  end
data/spec/spec_helper.rb CHANGED
@@ -15,5 +15,17 @@ def default_config
15
15
  end
16
16
 
17
17
  def sample_tag
18
- Markabb.register_tag :test, Markabb::Tag.new(/foo/, 'bar'), :group
18
+ Markabb.register_tag :test, Markabb::Tag.new(/123/, '456'), :group
19
+ end
20
+
21
+ def sample_proc
22
+ Proc.new { |s| upcase(s) }
23
+ end
24
+
25
+ def sample_callback
26
+ Markabb::Callback.new(sample_proc)
27
+ end
28
+
29
+ def upcase(s)
30
+ s.upcase
19
31
  end
@@ -6,4 +6,12 @@ describe "List Tags" do
6
6
  it_should_apply_formatting ['un_ordered', 'ul'],
7
7
  ['ordered', 'ol'],
8
8
  ['list_item', 'li']
9
+
10
+ it "should use ul with smart list *" do
11
+ "[list][*]foo\n[*]bar[/list]".markabb.should eq "<ul><li>foo</li><li>bar</li></ul>"
12
+ end
13
+
14
+ it "should use ol with smart list #" do
15
+ "[list][#]foo\n[/list]".markabb.should eq "<ol><li>foo</li></ol>"
16
+ end
9
17
  end
metadata CHANGED
@@ -3,10 +3,10 @@ name: markabb
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
+ - 1
6
7
  - 0
7
8
  - 0
8
- - 2
9
- version: 0.0.2
9
+ version: 1.0.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Adam "Arcath" Laycock
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-07-06 00:00:00 +01:00
17
+ date: 2012-07-12 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -29,6 +29,30 @@ dependencies:
29
29
  version: "0"
30
30
  type: :development
31
31
  version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: yard
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :development
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: coderay
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :runtime
55
+ version_requirements: *id003
32
56
  description: Provides BBCode for Ruby and Rails
33
57
  email:
34
58
  - gems@arcath.net
@@ -44,12 +68,15 @@ files:
44
68
  - Gemfile
45
69
  - Rakefile
46
70
  - Readme.md
71
+ - benchmark
47
72
  - lib/markabb.rb
73
+ - lib/markabb/classes/callback.rb
48
74
  - lib/markabb/classes/parser.rb
49
75
  - lib/markabb/classes/string.rb
50
76
  - lib/markabb/classes/syntax_highlighter.rb
51
77
  - lib/markabb/classes/tag.rb
52
78
  - lib/markabb/config.rb
79
+ - lib/markabb/highlighters/coderay.rb
53
80
  - lib/markabb/highlighters/raw.rb
54
81
  - lib/markabb/parse.rb
55
82
  - lib/markabb/tags/formatting.rb
@@ -60,8 +87,10 @@ files:
60
87
  - lib/markabb/tags/table.rb
61
88
  - lib/markabb/version.rb
62
89
  - markabb.gemspec
90
+ - spec/highlighters/coderay_spec.rb
63
91
  - spec/highlighters/raw_spec.rb
64
92
  - spec/macros/formatting_macros.rb
93
+ - spec/markabb_callback_spec.rb
65
94
  - spec/markabb_parse_spec.rb
66
95
  - spec/markabb_spec.rb
67
96
  - spec/markabb_string_spec.rb
@@ -104,8 +133,10 @@ signing_key:
104
133
  specification_version: 3
105
134
  summary: Provides BBCode for Ruby and Rails
106
135
  test_files:
136
+ - spec/highlighters/coderay_spec.rb
107
137
  - spec/highlighters/raw_spec.rb
108
138
  - spec/macros/formatting_macros.rb
139
+ - spec/markabb_callback_spec.rb
109
140
  - spec/markabb_parse_spec.rb
110
141
  - spec/markabb_spec.rb
111
142
  - spec/markabb_string_spec.rb