rubyyot-flannel 0.0.1
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/.document +5 -0
- data/.gitignore +6 -0
- data/LICENSE +20 -0
- data/README.rdoc +7 -0
- data/Rakefile +67 -0
- data/VERSION.yml +4 -0
- data/features/external_link.feature +9 -0
- data/features/fixtures/external_link.flannel +3 -0
- data/features/fixtures/external_link.out +3 -0
- data/features/fixtures/list.flannel +3 -0
- data/features/fixtures/list.out +3 -0
- data/features/fixtures/paragraph.flannel +6 -0
- data/features/fixtures/paragraph.out +5 -0
- data/features/fixtures/preformatted.flannel +15 -0
- data/features/fixtures/preformatted.out +12 -0
- data/features/fixtures/wiki_links.flannel +2 -0
- data/features/fixtures/wiki_links.out +2 -0
- data/features/fixtures/wiki_links_for_lambda.out +2 -0
- data/features/fixtures/wiki_links_for_lamdba.flannel +2 -0
- data/features/list.feature +9 -0
- data/features/paragraph.feature +9 -0
- data/features/preformatted_text.feature +9 -0
- data/features/step_definitions/flannel_steps.rb +20 -0
- data/features/support/env.rb +6 -0
- data/features/wiki_links.feature +15 -0
- data/lib/cutting_board.rb +16 -0
- data/lib/flannel.rb +8 -0
- data/lib/shears.rb +83 -0
- data/lib/square.rb +90 -0
- data/lib/stripe.rb +67 -0
- data/lib/wrappable.rb +17 -0
- data/test/cutting_board_test.rb +54 -0
- data/test/flannel_test.rb +8 -0
- data/test/shears_test.rb +43 -0
- data/test/square_test.rb +103 -0
- data/test/stripe_test.rb +102 -0
- data/test/test_helper.rb +10 -0
- metadata +104 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Jamal Hansen
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "flannel"
|
9
|
+
gem.summary = %Q{A soft comfortable worn in markup language for Ruby}
|
10
|
+
gem.email = "jamal.hansen@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/rubyyot/flannel"
|
12
|
+
gem.authors = ["Jamal Hansen"]
|
13
|
+
gem.rubyforge_project = "flannel"
|
14
|
+
gem.add_development_dependency 'technicalpickles-shoulda'
|
15
|
+
|
16
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
17
|
+
end
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'rake/testtask'
|
23
|
+
Rake::TestTask.new(:test) do |test|
|
24
|
+
test.libs << 'lib' << 'test'
|
25
|
+
test.pattern = 'test/**/*_test.rb'
|
26
|
+
test.verbose = true
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
require 'rcov/rcovtask'
|
31
|
+
Rcov::RcovTask.new do |test|
|
32
|
+
test.libs << 'test'
|
33
|
+
test.pattern = 'test/**/*_test.rb'
|
34
|
+
test.verbose = true
|
35
|
+
end
|
36
|
+
rescue LoadError
|
37
|
+
task :rcov do
|
38
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
begin
|
43
|
+
require 'cucumber/rake/task'
|
44
|
+
Cucumber::Rake::Task.new(:features)
|
45
|
+
rescue LoadError
|
46
|
+
task :features do
|
47
|
+
abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
task :default => :test
|
52
|
+
|
53
|
+
require 'rake/rdoctask'
|
54
|
+
Rake::RDocTask.new do |rdoc|
|
55
|
+
if File.exist?('VERSION.yml')
|
56
|
+
config = YAML.load(File.read('VERSION.yml'))
|
57
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
58
|
+
else
|
59
|
+
version = ""
|
60
|
+
end
|
61
|
+
|
62
|
+
rdoc.rdoc_dir = 'rdoc'
|
63
|
+
rdoc.title = "flannel #{version}"
|
64
|
+
rdoc.rdoc_files.include('README*')
|
65
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
66
|
+
end
|
67
|
+
|
data/VERSION.yml
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
Lorem ipsum [dolor sit amet|http://www.example.com], consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
|
+
Proin malesuada, nunc vel [porttitor|www.example.com] [ commodo | http://www.example.com | nunc ], justo. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
3
|
+
Proin malesuada, nunc vel [ porttitor | http://www.example.com ] commodo, justo.
|
@@ -0,0 +1,3 @@
|
|
1
|
+
<p>Lorem ipsum <a href="http://www.example.com" target="_blank">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
|
+
Proin malesuada, nunc vel <a href="http://www.example.com" target="_blank">porttitor</a> <a href="http://www.example.com" title="nunc" target="_blank">commodo</a>, justo. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
3
|
+
Proin malesuada, nunc vel <a href="http://www.example.com" target="_blank">porttitor</a> commodo, justo.</p>
|
@@ -0,0 +1,2 @@
|
|
1
|
+
<p>Lorem ipsum <a href="http://www.example.com/foo/dolor-sit-amet">dolor sit amet</a>, consectetur adipiscing elit. Nam ac magna augue, a pretium magna. Aliquam erat volutpat.
|
2
|
+
Proin malesuada, nunc vel <a href="http://www.example.com/foo/porttitor">porttitor</a> commodo, justo.</p>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: Preformatted text conversion
|
2
|
+
In order to create preformatted text
|
3
|
+
A user of Flannel
|
4
|
+
Will quilt preformatted text markup
|
5
|
+
|
6
|
+
Scenario: Preformatting text
|
7
|
+
Given input of "preformatted" text
|
8
|
+
When I quilt it with flannel
|
9
|
+
Then valid html should be produced
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
Given /^input of "([^\"]*)" text$/ do |feature|
|
3
|
+
flannel_filename = File.join("features", "fixtures", "#{feature}.flannel")
|
4
|
+
out_filename = File.join("features", "fixtures", "#{feature}.out")
|
5
|
+
@before = File.read(flannel_filename)
|
6
|
+
@after = File.read(out_filename)
|
7
|
+
@wiki_link = nil
|
8
|
+
end
|
9
|
+
|
10
|
+
When /^I quilt it with flannel$/ do
|
11
|
+
@output = Flannel.quilt @before, :wiki_link => @wiki_link
|
12
|
+
end
|
13
|
+
|
14
|
+
Then /^valid html should be produced$/ do
|
15
|
+
assert_equal @after, @output
|
16
|
+
end
|
17
|
+
|
18
|
+
Given /^a formatter of '([^\"']*)'$/ do |formatter|
|
19
|
+
@wiki_link = lambda { |keyword| eval formatter }
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: Paragraphs
|
2
|
+
In order to create wiki links
|
3
|
+
A user of Flannel
|
4
|
+
Will use wiki links
|
5
|
+
|
6
|
+
Scenario: Creating wiki links
|
7
|
+
Given input of "wiki_links" text
|
8
|
+
When I quilt it with flannel
|
9
|
+
Then valid html should be produced
|
10
|
+
|
11
|
+
Scenario: Creating wiki links with a custom url
|
12
|
+
Given input of "wiki_links" text
|
13
|
+
And a formatter of 'http://www.example.com/foo/#{keyword}'
|
14
|
+
When I quilt it with flannel
|
15
|
+
Then valid html should be produced
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'shears'
|
2
|
+
|
3
|
+
|
4
|
+
module Flannel
|
5
|
+
class CuttingBoard
|
6
|
+
def initialize params={}
|
7
|
+
@wiki_link= params[:wiki_link]
|
8
|
+
end
|
9
|
+
|
10
|
+
def cut markup
|
11
|
+
shears = Flannel::Shears.new
|
12
|
+
squares = shears.cut markup
|
13
|
+
squares.map { |square| square.to_h }.join("\n\n")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/flannel.rb
ADDED
data/lib/shears.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'square'
|
2
|
+
require 'stripe'
|
3
|
+
|
4
|
+
module Flannel
|
5
|
+
class Shears
|
6
|
+
def cut markup
|
7
|
+
@squares = []
|
8
|
+
@square = Flannel::Square.new
|
9
|
+
@end_preformat = false
|
10
|
+
|
11
|
+
markup.split("\n").each { |line| cut_into_squares line }
|
12
|
+
|
13
|
+
@squares << @square
|
14
|
+
end
|
15
|
+
|
16
|
+
def cut_into_squares line
|
17
|
+
if need_new_square? line
|
18
|
+
shift_square
|
19
|
+
else
|
20
|
+
add line
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def shift_square
|
25
|
+
@squares << @square unless @square.blank?
|
26
|
+
@square = Flannel::Square.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def need_new_square? line
|
30
|
+
@square.style == :preformatted ? @end_preformat : empty?(line.strip)
|
31
|
+
end
|
32
|
+
|
33
|
+
def add line
|
34
|
+
@preformatted_marker_line = false
|
35
|
+
line = strip_markers line
|
36
|
+
line = remove_hanging_preformatted_lines line
|
37
|
+
|
38
|
+
@square << line unless line.nil?
|
39
|
+
end
|
40
|
+
|
41
|
+
def remove_hanging_preformatted_lines line
|
42
|
+
if @preformatted_marker_line
|
43
|
+
@end_preformat = @square.populated?
|
44
|
+
if line.strip == ""
|
45
|
+
return nil
|
46
|
+
end
|
47
|
+
else
|
48
|
+
@end_preformat = false
|
49
|
+
end
|
50
|
+
line
|
51
|
+
end
|
52
|
+
|
53
|
+
def strip_markers line
|
54
|
+
parts = line.match(/^([=_*]+)(.*)/)
|
55
|
+
|
56
|
+
if parts
|
57
|
+
set_style parts[1]
|
58
|
+
line = parts[2]
|
59
|
+
end
|
60
|
+
line
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_style marker
|
64
|
+
if marker
|
65
|
+
case marker[0]
|
66
|
+
when 61 # equals (header)
|
67
|
+
style = "header_#{marker.length}"
|
68
|
+
@square.style = style.to_sym
|
69
|
+
when 95 # underscore (preformatted)
|
70
|
+
@square.style = :preformatted
|
71
|
+
@preformatted_marker_line = true
|
72
|
+
when 42 # star (list)
|
73
|
+
@square.style = :list
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def empty? str
|
79
|
+
str.nil? || str == ""
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/lib/square.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'wrappable'
|
2
|
+
|
3
|
+
module Flannel
|
4
|
+
class Square
|
5
|
+
include Flannel::Wrappable
|
6
|
+
attr_accessor :style
|
7
|
+
|
8
|
+
def initialize params={}
|
9
|
+
@tags ={:preformatted => "pre", :list => "ul", :header_1 => "h1", :header_2 => "h2", :header_3 => "h3", :header_4 => "h4", :header_5 => "h5", :header_6 => "h6"}
|
10
|
+
@stripes = []
|
11
|
+
@style = :paragraph
|
12
|
+
end
|
13
|
+
|
14
|
+
def << text
|
15
|
+
text = text.strip unless @style == :preformatted
|
16
|
+
@stripes << Flannel::Stripe.stitch(text, :style=>@style)
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
@stripes.map { |stripe| stripe.weave }.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
def blank?
|
24
|
+
(@stripes.length == 0 || all_stripes_blank)
|
25
|
+
end
|
26
|
+
|
27
|
+
def populated?
|
28
|
+
!blank?
|
29
|
+
end
|
30
|
+
|
31
|
+
def all_stripes_blank
|
32
|
+
@stripes.each do |stripe|
|
33
|
+
return false if !stripe.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
return true
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_h
|
40
|
+
@post_wrap = nil
|
41
|
+
lines = @stripes.map { |stripe| stripe.to_h }
|
42
|
+
|
43
|
+
quilt lines
|
44
|
+
end
|
45
|
+
|
46
|
+
def quilt lines
|
47
|
+
output = lines.join("\n")
|
48
|
+
output = convert_external_links output
|
49
|
+
return wrap(output, find_tag)
|
50
|
+
end
|
51
|
+
|
52
|
+
def preformatted
|
53
|
+
@style == :preformatted
|
54
|
+
end
|
55
|
+
|
56
|
+
def convert_external_links text
|
57
|
+
return text if preformatted
|
58
|
+
text.gsub(/\[([^\|]*\|[^\]]*)\]/) { |match| build_external_link match }
|
59
|
+
end
|
60
|
+
|
61
|
+
def build_external_link match
|
62
|
+
text, url, title = match[1..-2].split("|", 3)
|
63
|
+
|
64
|
+
url = format_link url.strip
|
65
|
+
text.strip!
|
66
|
+
title.strip! if title
|
67
|
+
|
68
|
+
if title
|
69
|
+
%{<a href="#{url}" title="#{title}" target="_blank">#{text}</a>}
|
70
|
+
else
|
71
|
+
%{<a href="#{url}" target="_blank">#{text}</a>}
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def format_link url
|
76
|
+
return url if /:\/\// =~ url
|
77
|
+
"http://#{url}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def find_tag
|
81
|
+
if @style && @tags.has_key?(@style)
|
82
|
+
tag = @tags[@style]
|
83
|
+
else
|
84
|
+
tag = "p"
|
85
|
+
end
|
86
|
+
tag
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
data/lib/stripe.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'wrappable'
|
2
|
+
|
3
|
+
module Flannel
|
4
|
+
class Stripe
|
5
|
+
include Wrappable
|
6
|
+
attr_reader :weave
|
7
|
+
|
8
|
+
def self.stitch weave="", params={}
|
9
|
+
Flannel::Stripe.new weave, params
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize weave="", params={}
|
13
|
+
@weave = weave
|
14
|
+
@wiki_link = params[:wiki_link]
|
15
|
+
@style = params[:style]
|
16
|
+
end
|
17
|
+
|
18
|
+
def wiki_link topic
|
19
|
+
if @wiki_link
|
20
|
+
@wiki_link.call(permalink topic)
|
21
|
+
else
|
22
|
+
permalink topic[1..-2]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def permalink topic
|
27
|
+
require 'iconv'
|
28
|
+
# thanks to ismasan http://snippets.dzone.com/posts/show/4457
|
29
|
+
(Iconv.new('US-ASCII//TRANSLIT', 'utf-8').iconv topic).gsub(/[^\w\s\-]/,'').gsub(/[^\w]|[\_]/,' ').split.join('-').downcase
|
30
|
+
end
|
31
|
+
|
32
|
+
def empty?
|
33
|
+
@weave == nil || @weave.strip == ""
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_wiki_links
|
37
|
+
return @weave if preformatted
|
38
|
+
@weave.gsub(/-\w(.*)\w>/) { |match| %{<a href="#{wiki_link match}">#{match[1..-2]}</a>}}
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_h
|
42
|
+
text = build_wiki_links
|
43
|
+
markup text
|
44
|
+
end
|
45
|
+
|
46
|
+
def preformatted
|
47
|
+
@style == :preformatted
|
48
|
+
end
|
49
|
+
|
50
|
+
def list
|
51
|
+
@style == :list
|
52
|
+
end
|
53
|
+
|
54
|
+
def markup text
|
55
|
+
return html_escape text if preformatted
|
56
|
+
|
57
|
+
tag = "li" if list
|
58
|
+
wrap(text, tag)
|
59
|
+
end
|
60
|
+
|
61
|
+
def html_escape text
|
62
|
+
require 'cgi'
|
63
|
+
|
64
|
+
CGI::escapeHTML(text)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/wrappable.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Flannel
|
2
|
+
module Wrappable
|
3
|
+
def wrap content, tag
|
4
|
+
if empty_string?(content) || empty_string?(tag)
|
5
|
+
return content
|
6
|
+
end
|
7
|
+
|
8
|
+
content.strip! unless tag == "pre"
|
9
|
+
|
10
|
+
"<#{tag}>#{content}</#{tag}>"
|
11
|
+
end
|
12
|
+
|
13
|
+
def empty_string? str
|
14
|
+
str.nil? || str.strip == ""
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CuttingBoardTest < Test::Unit::TestCase
|
4
|
+
context "basic behavior" do
|
5
|
+
setup do
|
6
|
+
@board = Flannel::CuttingBoard.new
|
7
|
+
end
|
8
|
+
|
9
|
+
should "strip and convert underscores to pre tags" do
|
10
|
+
markup = "_foo\n\n bar\n_"
|
11
|
+
assert_equal "<pre>foo\n\n bar</pre>", @board.cut(markup)
|
12
|
+
end
|
13
|
+
|
14
|
+
should "preformat text when both start and end line have the markers" do
|
15
|
+
markup = "_foo\n\n_ bar"
|
16
|
+
assert_equal "<pre>foo\n\n bar</pre>", @board.cut(markup)
|
17
|
+
end
|
18
|
+
|
19
|
+
should "not replace in preformatted text" do
|
20
|
+
markup = "_4 - 2 > 2 - 2\n_"
|
21
|
+
assert_equal '<pre>4 - 2 > 2 - 2</pre>', @board.cut(markup)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "When block starts with one or more equals signs, it" do
|
26
|
+
setup do
|
27
|
+
@board = Flannel::CuttingBoard.new
|
28
|
+
end
|
29
|
+
|
30
|
+
should "convert one equals to a header one" do
|
31
|
+
markup = "= Some header"
|
32
|
+
result = "<h1>Some header</h1>"
|
33
|
+
|
34
|
+
assert_equal result, @board.cut(markup)
|
35
|
+
end
|
36
|
+
|
37
|
+
should "convert two equals to a header two" do
|
38
|
+
markup = "== Some header"
|
39
|
+
result = "<h2>Some header</h2>"
|
40
|
+
|
41
|
+
assert_equal result, @board.cut(markup)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "When block starts with a star, it" do
|
46
|
+
should "tell square that it's a list, so that it will be wrapped in ul tags" do
|
47
|
+
board = Flannel::CuttingBoard.new
|
48
|
+
markup = "* Yadda"
|
49
|
+
result = "<ul><li>Yadda</li></ul>"
|
50
|
+
|
51
|
+
assert_equal result, board.cut(markup)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/test/shears_test.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ShearsTest < Test::Unit::TestCase
|
4
|
+
context "basic behavior" do
|
5
|
+
setup do
|
6
|
+
@shears = Flannel::Shears.new
|
7
|
+
end
|
8
|
+
|
9
|
+
should "split a flannel document into squares based on blank lines" do
|
10
|
+
markup = "foo\n\nbar"
|
11
|
+
|
12
|
+
squares = @shears.cut markup
|
13
|
+
assert_equal 2, squares.length
|
14
|
+
assert_equal "foo", squares[0].to_s
|
15
|
+
assert_equal "bar", squares[1].to_s
|
16
|
+
end
|
17
|
+
|
18
|
+
should "not split preformatted text based on blank lines" do
|
19
|
+
markup = "_foo\n\nbar\n_"
|
20
|
+
|
21
|
+
squares = @shears.cut markup
|
22
|
+
assert_equal 1, squares.length
|
23
|
+
assert_equal :preformatted, squares[0].style
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
should "separate preformatted blocks" do
|
28
|
+
markup = "_foo\n_\n\n_bar\n_"
|
29
|
+
|
30
|
+
squares = @shears.cut markup
|
31
|
+
assert_equal 2, squares.length
|
32
|
+
assert_equal :preformatted, squares[0].style
|
33
|
+
assert_equal :preformatted, squares[1].style
|
34
|
+
end
|
35
|
+
|
36
|
+
should "strip preformatted markers when found" do
|
37
|
+
markup = "_foo\n\nbar\n_"
|
38
|
+
|
39
|
+
squares = @shears.cut markup
|
40
|
+
assert_equal "foo\n\nbar", squares[0].to_s
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/test/square_test.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'stripe'
|
3
|
+
|
4
|
+
class SquareTest < Test::Unit::TestCase
|
5
|
+
context "basic behavior" do
|
6
|
+
setup do
|
7
|
+
@square = Flannel::Square.new
|
8
|
+
end
|
9
|
+
|
10
|
+
should "accept strings with <<" do
|
11
|
+
@square << "foo"
|
12
|
+
assert_equal "foo", @square.to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
should "be blank when there are no stripes" do
|
16
|
+
assert @square.blank?
|
17
|
+
@square << "foo"
|
18
|
+
assert !@square.blank?
|
19
|
+
end
|
20
|
+
|
21
|
+
should "be blank when the first stripe is an empty string" do
|
22
|
+
@square << ""
|
23
|
+
assert @square.blank?
|
24
|
+
end
|
25
|
+
|
26
|
+
should "be blank when the first stripe is whitespace" do
|
27
|
+
@square << " "
|
28
|
+
assert @square.blank?
|
29
|
+
end
|
30
|
+
|
31
|
+
should "be blank when the all stripes are empty strings" do
|
32
|
+
@square << ""
|
33
|
+
@square << ""
|
34
|
+
@square << ""
|
35
|
+
assert @square.blank?
|
36
|
+
end
|
37
|
+
|
38
|
+
should "be blank when the all stripes are whitespace" do
|
39
|
+
@square << " "
|
40
|
+
@square << " "
|
41
|
+
@square << ""
|
42
|
+
assert @square.blank?
|
43
|
+
end
|
44
|
+
|
45
|
+
should "not be blank when a stripe is not blank" do
|
46
|
+
@square << " "
|
47
|
+
@square << " "
|
48
|
+
@square << "foo"
|
49
|
+
assert !@square.blank?
|
50
|
+
end
|
51
|
+
|
52
|
+
should "return html" do
|
53
|
+
@square << "foo"
|
54
|
+
assert_equal "<p>foo</p>", @square.to_h
|
55
|
+
end
|
56
|
+
|
57
|
+
should "accept a style" do
|
58
|
+
@square.style = :preformatted
|
59
|
+
assert_equal :preformatted, @square.style
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "style" do
|
64
|
+
should "accept an optional style parameter" do
|
65
|
+
square = Flannel::Square.new
|
66
|
+
square.style = :foo
|
67
|
+
end
|
68
|
+
|
69
|
+
should "wrap in pre tags when preformatted" do
|
70
|
+
square = Flannel::Square.new
|
71
|
+
square.style = :preformatted
|
72
|
+
square << "foo"
|
73
|
+
assert_equal "<pre>foo</pre>", square.to_h
|
74
|
+
end
|
75
|
+
|
76
|
+
should "wrap in ul tags when unordered_list" do
|
77
|
+
square = Flannel::Square.new
|
78
|
+
square.style = :list
|
79
|
+
square << "foo"
|
80
|
+
assert_equal "<ul><li>foo</li></ul>", square.to_h
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "external links" do
|
85
|
+
should "convert [|] pattern to an external link" do
|
86
|
+
square = Flannel::Square.new
|
87
|
+
square << "yadda [yadda|http://example.com] yadda"
|
88
|
+
assert_equal '<p>yadda <a href="http://example.com" target="_blank">yadda</a> yadda</p>', square.to_h
|
89
|
+
end
|
90
|
+
|
91
|
+
should "add http:// to external links" do
|
92
|
+
square = Flannel::Square.new
|
93
|
+
square << "yadda [yadda|example.com] yadda"
|
94
|
+
assert_equal '<p>yadda <a href="http://example.com" target="_blank">yadda</a> yadda</p>', square.to_h
|
95
|
+
end
|
96
|
+
|
97
|
+
should "add create title if provided to external links" do
|
98
|
+
square = Flannel::Square.new
|
99
|
+
square << "yadda [yadda|example.com|My title] yadda"
|
100
|
+
assert_equal '<p>yadda <a href="http://example.com" title="My title" target="_blank">yadda</a> yadda</p>', square.to_h
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/test/stripe_test.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'stripe'
|
3
|
+
|
4
|
+
class StripeTest < Test::Unit::TestCase
|
5
|
+
context "basic operations" do
|
6
|
+
setup do
|
7
|
+
@stripe = Flannel::Stripe.stitch "foo"
|
8
|
+
end
|
9
|
+
|
10
|
+
should "be of of kind Flannel::Stripe" do
|
11
|
+
assert Flannel::Stripe, @stripe.class
|
12
|
+
end
|
13
|
+
|
14
|
+
should "create instance with stitch" do
|
15
|
+
assert_equal "foo", @stripe.weave
|
16
|
+
end
|
17
|
+
|
18
|
+
should "return html fragment with to_h" do
|
19
|
+
assert_equal "foo", @stripe.to_h
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "building wiki links" do
|
24
|
+
setup do
|
25
|
+
wiki_link = lambda { |keyword| "http://www.example.com/foo/#{keyword}"}
|
26
|
+
@stripe = Flannel::Stripe.stitch "the -roof is on fire>", :wiki_link => wiki_link
|
27
|
+
end
|
28
|
+
|
29
|
+
should "build wiki links based on a lambda" do
|
30
|
+
assert_equal "http://www.example.com/foo/cheese", @stripe.wiki_link("cheese")
|
31
|
+
end
|
32
|
+
|
33
|
+
should "find and replace wiki link markup" do
|
34
|
+
assert_equal 'the <a href="http://www.example.com/foo/roof-is-on-fire">roof is on fire</a>', @stripe.to_h
|
35
|
+
end
|
36
|
+
|
37
|
+
should "permalink topics when making wiki links" do
|
38
|
+
assert_equal "http://www.example.com/foo/cheese-tastes-good", @stripe.wiki_link("cheese tastes good")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "no lambda is provided" do
|
43
|
+
setup do
|
44
|
+
@stripe = Flannel::Stripe.stitch "baz"
|
45
|
+
end
|
46
|
+
|
47
|
+
should "output the wiki text" do
|
48
|
+
assert_equal "cheese", @stripe.wiki_link("-cheese>")
|
49
|
+
end
|
50
|
+
|
51
|
+
should "prermalink the wiki text" do
|
52
|
+
assert_equal "cheese-is-good", @stripe.wiki_link("-cheese is good>")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "replacing wiki links" do
|
57
|
+
should "replace surrounded by - and > with a wiki link" do
|
58
|
+
stripe = Flannel::Stripe.stitch("red, -green>, refactor")
|
59
|
+
assert_equal 'red, <a href="green">green</a>, refactor', stripe.to_h
|
60
|
+
end
|
61
|
+
|
62
|
+
should "not replace surrounded by - and > with a wiki link if spaced" do
|
63
|
+
stripe = Flannel::Stripe.stitch("red, - green >, refactor")
|
64
|
+
assert_equal 'red, - green >, refactor', stripe.to_h
|
65
|
+
end
|
66
|
+
|
67
|
+
should "not replace surrounded by - and > with a wiki link if spaced on right" do
|
68
|
+
stripe = Flannel::Stripe.stitch("red, -green >, refactor")
|
69
|
+
assert_equal 'red, -green >, refactor', stripe.to_h
|
70
|
+
end
|
71
|
+
|
72
|
+
should "not replace surrounded by - and > with a wiki link if spaced on left" do
|
73
|
+
stripe = Flannel::Stripe.stitch("red, - green>, refactor")
|
74
|
+
assert_equal 'red, - green>, refactor', stripe.to_h
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "preformatted text" do
|
79
|
+
should "html escape preformatted text" do
|
80
|
+
stripe = Flannel::Stripe.stitch "<p>& foo</p>", :style => :preformatted
|
81
|
+
assert_equal "<p>& foo</p>", stripe.to_h
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
context "making permalinks" do
|
86
|
+
setup do
|
87
|
+
@stripe = Flannel::Stripe.stitch ""
|
88
|
+
end
|
89
|
+
|
90
|
+
should "replace spaces with dashes" do
|
91
|
+
assert_equal "get-the-box", @stripe.permalink("get the box")
|
92
|
+
end
|
93
|
+
|
94
|
+
should "replace multiple spaces with single dashes" do
|
95
|
+
assert_equal "get-the-box", @stripe.permalink("get the box")
|
96
|
+
end
|
97
|
+
|
98
|
+
should "replace odd characters with dashes" do
|
99
|
+
assert_equal "get-the-box", @stripe.permalink("get the @#)(* box")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubyyot-flannel
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jamal Hansen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-07-09 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: technicalpickles-shoulda
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: jamal.hansen@gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- LICENSE
|
33
|
+
- README.rdoc
|
34
|
+
files:
|
35
|
+
- .document
|
36
|
+
- .gitignore
|
37
|
+
- LICENSE
|
38
|
+
- README.rdoc
|
39
|
+
- Rakefile
|
40
|
+
- VERSION.yml
|
41
|
+
- features/external_link.feature
|
42
|
+
- features/fixtures/external_link.flannel
|
43
|
+
- features/fixtures/external_link.out
|
44
|
+
- features/fixtures/list.flannel
|
45
|
+
- features/fixtures/list.out
|
46
|
+
- features/fixtures/paragraph.flannel
|
47
|
+
- features/fixtures/paragraph.out
|
48
|
+
- features/fixtures/preformatted.flannel
|
49
|
+
- features/fixtures/preformatted.out
|
50
|
+
- features/fixtures/wiki_links.flannel
|
51
|
+
- features/fixtures/wiki_links.out
|
52
|
+
- features/fixtures/wiki_links_for_lambda.out
|
53
|
+
- features/fixtures/wiki_links_for_lamdba.flannel
|
54
|
+
- features/list.feature
|
55
|
+
- features/paragraph.feature
|
56
|
+
- features/preformatted_text.feature
|
57
|
+
- features/step_definitions/flannel_steps.rb
|
58
|
+
- features/support/env.rb
|
59
|
+
- features/wiki_links.feature
|
60
|
+
- lib/cutting_board.rb
|
61
|
+
- lib/flannel.rb
|
62
|
+
- lib/shears.rb
|
63
|
+
- lib/square.rb
|
64
|
+
- lib/stripe.rb
|
65
|
+
- lib/wrappable.rb
|
66
|
+
- test/cutting_board_test.rb
|
67
|
+
- test/flannel_test.rb
|
68
|
+
- test/shears_test.rb
|
69
|
+
- test/square_test.rb
|
70
|
+
- test/stripe_test.rb
|
71
|
+
- test/test_helper.rb
|
72
|
+
has_rdoc: true
|
73
|
+
homepage: http://github.com/rubyyot/flannel
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options:
|
76
|
+
- --charset=UTF-8
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "0"
|
84
|
+
version:
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
91
|
+
requirements: []
|
92
|
+
|
93
|
+
rubyforge_project: flannel
|
94
|
+
rubygems_version: 1.2.0
|
95
|
+
signing_key:
|
96
|
+
specification_version: 2
|
97
|
+
summary: A soft comfortable worn in markup language for Ruby
|
98
|
+
test_files:
|
99
|
+
- test/shears_test.rb
|
100
|
+
- test/stripe_test.rb
|
101
|
+
- test/test_helper.rb
|
102
|
+
- test/cutting_board_test.rb
|
103
|
+
- test/square_test.rb
|
104
|
+
- test/flannel_test.rb
|