markabb 0.0.2 → 1.0.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.
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