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 +20 -0
- data/lib/markabb/classes/callback.rb +13 -0
- data/lib/markabb/classes/tag.rb +30 -6
- data/lib/markabb/config.rb +1 -0
- data/lib/markabb/highlighters/coderay.rb +17 -0
- data/lib/markabb/tags/formatting.rb +10 -10
- data/lib/markabb/tags/image.rb +1 -1
- data/lib/markabb/tags/link.rb +1 -1
- data/lib/markabb/tags/list.rb +16 -3
- data/lib/markabb/tags/table.rb +6 -6
- data/lib/markabb/version.rb +1 -1
- data/lib/markabb.rb +5 -0
- data/markabb.gemspec +3 -0
- data/spec/highlighters/coderay_spec.rb +16 -0
- data/spec/highlighters/raw_spec.rb +1 -0
- data/spec/markabb_callback_spec.rb +32 -0
- data/spec/markabb_tags_spec.rb +15 -1
- data/spec/spec_helper.rb +13 -1
- data/spec/tags/list_spec.rb +8 -0
- metadata +34 -3
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
|
data/lib/markabb/classes/tag.rb
CHANGED
@@ -39,20 +39,40 @@ module Markabb
|
|
39
39
|
|
40
40
|
# Creates the Markabb::Tag object
|
41
41
|
def initialize(matcher, replace)
|
42
|
-
|
43
|
-
|
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
|
-
|
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
|
data/lib/markabb/config.rb
CHANGED
@@ -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(
|
2
|
-
Markabb.register_tag :italic, Markabb::Tag.new(
|
3
|
-
Markabb.register_tag :underline, Markabb::Tag.new(
|
4
|
-
Markabb.register_tag :center, Markabb::Tag.new(
|
5
|
-
Markabb.register_tag :left, Markabb::Tag.new(
|
6
|
-
Markabb.register_tag :right, Markabb::Tag.new(
|
7
|
-
Markabb.register_tag :heading_1, Markabb::Tag.new(
|
8
|
-
Markabb.register_tag :heading_2, Markabb::Tag.new(
|
9
|
-
Markabb.register_tag :heading_3, Markabb::Tag.new(
|
10
|
-
Markabb.register_tag :heading_4, Markabb::Tag.new(
|
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
|
data/lib/markabb/tags/image.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
Markabb.register_tag :image, Markabb::Tag.new(
|
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
|
data/lib/markabb/tags/link.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
Markabb.register_tag :url, Markabb::Tag.new(
|
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
|
data/lib/markabb/tags/list.rb
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
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
|
data/lib/markabb/tags/table.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
Markabb.register_tag :table, Markabb::Tag.new(
|
2
|
-
Markabb.register_tag :table_tr, Markabb::Tag.new(
|
3
|
-
Markabb.register_tag :table_td, Markabb::Tag.new(
|
4
|
-
Markabb.register_tag :table_header, Markabb::Tag.new(
|
5
|
-
Markabb.register_tag :table_row, Markabb::Tag.new(
|
6
|
-
Markabb.register_tag :table_cell, Markabb::Tag.new(
|
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
|
data/lib/markabb/version.rb
CHANGED
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
@@ -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
|
@@ -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
|
data/spec/markabb_tags_spec.rb
CHANGED
@@ -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/, '
|
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 [b]bold[/b] 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(/
|
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
|
data/spec/tags/list_spec.rb
CHANGED
@@ -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
|
-
|
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-
|
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
|