pink_shirt 0.0.1 → 0.0.2
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/changelog +4 -0
- data/lib/pink_shirt/attributes.rb +28 -24
- data/lib/pink_shirt/entities.rb +11 -13
- data/lib/pink_shirt/output.rb +14 -12
- data/lib/pink_shirt/sax/acronym.rb +3 -0
- data/lib/pink_shirt/sax/base.rb +1 -0
- data/lib/pink_shirt/sax/basic.rb +1 -1
- data/lib/pink_shirt/sax/block_level.rb +1 -0
- data/lib/pink_shirt/sax/boiler_plate.rb +1 -0
- data/lib/pink_shirt/sax/images.rb +2 -0
- data/lib/pink_shirt/sax/links.rb +2 -0
- data/lib/pink_shirt/sax/lists.rb +2 -0
- data/lib/pink_shirt/sax/preformatted.rb +3 -2
- data/lib/pink_shirt/sax/script.rb +2 -0
- data/lib/pink_shirt/version.rb +1 -1
- data/lib/pink_shirt.rb +8 -9
- data/pink_shirt.gemspec +1 -1
- data/spec/textile-spec/phrase_modifiers.yaml +14 -14
- metadata +10 -8
data/changelog
ADDED
@@ -1,33 +1,34 @@
|
|
1
1
|
class PinkShirt
|
2
|
-
# Attributes
|
3
|
-
#
|
2
|
+
# = Attributes
|
3
|
+
#
|
4
4
|
# the sax parser passes an array of attributes along with each tag
|
5
5
|
# attrs = ['href', 'http://www.example.com', 'style', 'background-color: snake;']
|
6
6
|
#
|
7
7
|
# Textile displays attributes in a certain way
|
8
8
|
#
|
9
|
-
# USAGE
|
10
|
-
#
|
9
|
+
# = USAGE
|
10
|
+
#
|
11
11
|
# Attributes.new(attrs).write
|
12
12
|
#
|
13
|
+
#
|
14
|
+
# * colspan=2 => \2
|
15
|
+
# * rowspan=3 => /3
|
16
|
+
# * style='padding-left:1em' => (
|
17
|
+
# * style='padding-right:2em' => ))
|
18
|
+
# * style='text-align:right' => >
|
19
|
+
# * style='text-align:left' => <
|
20
|
+
# * style='text-align:center' => =
|
21
|
+
# * style='text-align:justify'=> <>
|
22
|
+
# * class = 'panthers' => (panthers)
|
23
|
+
# * id = 'banner' => (#banner)
|
24
|
+
# * class='this' id='that' => (this#that)
|
25
|
+
# * lang='fr' => [fr]
|
26
|
+
# * style='color:red' => {color:red}
|
27
|
+
#
|
13
28
|
#
|
14
|
-
# colspan=2 => \2
|
15
|
-
# rowspan=3 => /3
|
16
|
-
# style='padding-left:1em' => (
|
17
|
-
# style='padding-right:2em' => ))
|
18
|
-
# style='text-align:right' => >
|
19
|
-
# style='text-align:left' => <
|
20
|
-
# style='text-align:center' => =
|
21
|
-
# style='text-align:justify'=> <>
|
22
|
-
# class = 'panthers' => (panthers)
|
23
|
-
# id = 'banner' => (#banner)
|
24
|
-
# class='this' id='that' => (this#that)
|
25
|
-
# lang='fr' => [fr]
|
26
|
-
# style='color:red' => {color:red}
|
27
|
-
|
28
|
-
|
29
29
|
class Attributes
|
30
|
-
|
30
|
+
# @param attrs [Array] formatted [key, value, key, value]
|
31
|
+
#
|
31
32
|
def initialize(attrs)
|
32
33
|
@attrs = attrs
|
33
34
|
@attrs_hash = Hash[attrs]
|
@@ -44,7 +45,6 @@ class PinkShirt
|
|
44
45
|
@styles_hash ||= {}
|
45
46
|
end
|
46
47
|
|
47
|
-
|
48
48
|
def write
|
49
49
|
add = []
|
50
50
|
add << colspan
|
@@ -56,11 +56,13 @@ class PinkShirt
|
|
56
56
|
add << lang
|
57
57
|
out = add.join
|
58
58
|
return nil if out == ""
|
59
|
+
|
59
60
|
out
|
60
61
|
end
|
61
62
|
|
62
63
|
def parse_styles
|
63
64
|
return nil unless attrs['style']
|
65
|
+
|
64
66
|
rules_list = attrs['style'].split(";").map{|rule|
|
65
67
|
rule.split(":")
|
66
68
|
}
|
@@ -89,13 +91,12 @@ class PinkShirt
|
|
89
91
|
end
|
90
92
|
|
91
93
|
nudges << text_align
|
92
|
-
|
93
94
|
nudges
|
94
95
|
end
|
95
96
|
|
96
97
|
def steal_padding
|
97
|
-
|
98
98
|
return nil unless attrs['style']
|
99
|
+
|
99
100
|
left = case styles.delete('padding-left')
|
100
101
|
when '1em'; "(" ;
|
101
102
|
when '2em'; "((";
|
@@ -111,11 +112,11 @@ class PinkShirt
|
|
111
112
|
end
|
112
113
|
|
113
114
|
padding = "#{left}#{right}"
|
114
|
-
|
115
115
|
end
|
116
116
|
|
117
117
|
def colspan
|
118
118
|
return nil unless attrs['colspan']
|
119
|
+
|
119
120
|
width = attrs['colspan']
|
120
121
|
colspan = ""
|
121
122
|
colspan << "\\" #literal backslash
|
@@ -125,6 +126,7 @@ class PinkShirt
|
|
125
126
|
|
126
127
|
def rowspan
|
127
128
|
return nil unless attrs['rowspan']
|
129
|
+
|
128
130
|
height = attrs['rowspan']
|
129
131
|
colspan = '/' + "#{height}" if height
|
130
132
|
end
|
@@ -142,6 +144,7 @@ class PinkShirt
|
|
142
144
|
klass = attrs['class']
|
143
145
|
id = attrs['id']
|
144
146
|
return nil unless klass || id
|
147
|
+
|
145
148
|
output = ""
|
146
149
|
output += "("
|
147
150
|
output += klass if klass
|
@@ -160,6 +163,7 @@ class PinkShirt
|
|
160
163
|
|
161
164
|
def lang
|
162
165
|
return nil unless attrs.include?('lang')
|
166
|
+
|
163
167
|
output = ""
|
164
168
|
output += "["
|
165
169
|
output += attrs['lang']
|
data/lib/pink_shirt/entities.rb
CHANGED
@@ -1,26 +1,24 @@
|
|
1
1
|
class PinkShirt
|
2
2
|
# Gets rid of smart quotes, dashes and some pesky unicode
|
3
|
-
# Usage
|
4
|
-
#
|
5
|
-
# Entities.sanitize(input)
|
3
|
+
# = Usage
|
4
|
+
# Entities.sanitize(input)
|
6
5
|
#
|
7
6
|
class Entities
|
8
7
|
REPLACEMENTS = {
|
9
|
-
8217 => "'",
|
10
|
-
8216 => "'",
|
11
|
-
8220 => '"',
|
12
|
-
8221 => '"',
|
13
|
-
8211 => "-",
|
14
|
-
8212 => "--",
|
8
|
+
8217 => "'", #single quote
|
9
|
+
8216 => "'", #left single quote
|
10
|
+
8220 => '"', #right double quote
|
11
|
+
8221 => '"', #left double quote
|
12
|
+
8211 => "-", #endash
|
13
|
+
8212 => "--", #emdash
|
15
14
|
8230 => "...", #ellipsis
|
16
|
-
215 => "x",
|
17
|
-
8242 => "'",
|
15
|
+
215 => "x", #times
|
16
|
+
8242 => "'", #inch
|
18
17
|
174 => "(r)", #registered trademark
|
19
|
-
8482 => "(tm)"
|
18
|
+
8482 => "(tm)",# trademark
|
20
19
|
169 => "(c)", #copyright
|
21
20
|
}
|
22
21
|
|
23
|
-
|
24
22
|
def self.sanitize(string)
|
25
23
|
string_chars = string.unpack("U*")
|
26
24
|
string_chars.map! {|x| REPLACEMENTS[x] ? REPLACEMENTS[x].unpack('U*') : x}
|
data/lib/pink_shirt/output.rb
CHANGED
@@ -1,21 +1,23 @@
|
|
1
1
|
class PinkShirt
|
2
|
-
|
2
|
+
|
3
|
+
##
|
3
4
|
# Nokogiri::Sax builds output as a long stream.
|
4
5
|
# Output collects all the writes as an array, and then joins them when required
|
5
6
|
# you can also lock it for writing.
|
6
7
|
#
|
7
|
-
# Usage
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
8
|
+
# = Usage
|
9
|
+
#
|
10
|
+
# stream = Output.new
|
11
|
+
# stream << 'goods... '
|
12
|
+
# stream.inspect #=> ['goods... ']
|
13
|
+
# stream.lock('suspicious tag')
|
14
|
+
# stream << 'bad stuff'
|
15
|
+
# stream.inspect #=> ['goods... ']
|
16
|
+
# stream.unlock
|
17
|
+
# stream << 'good again'
|
18
|
+
# stream.inspect #=> ['goods... ', 'good again']
|
18
19
|
#
|
20
|
+
|
19
21
|
class Output
|
20
22
|
def initialize
|
21
23
|
@contents = []
|
@@ -1,13 +1,16 @@
|
|
1
1
|
class PinkShirt
|
2
2
|
class SAX::Acronym < SAX::Base
|
3
3
|
TAGS = %(acronym)
|
4
|
+
|
4
5
|
def initialize(*args)
|
5
6
|
@current_acronym = []
|
6
7
|
super
|
7
8
|
end
|
9
|
+
|
8
10
|
def start_acronym attrs
|
9
11
|
@current_acronym << attrs['title']
|
10
12
|
end
|
13
|
+
|
11
14
|
def end_acronym
|
12
15
|
@output << "(#{@current_acronym.pop})"
|
13
16
|
end
|
data/lib/pink_shirt/sax/base.rb
CHANGED
data/lib/pink_shirt/sax/basic.rb
CHANGED
@@ -2,6 +2,7 @@ class PinkShirt
|
|
2
2
|
class SAX::Basic < SAX::Base
|
3
3
|
TAGS = %w(strong b em i cite del ins sub sup span code)
|
4
4
|
attr_accessor :nospan
|
5
|
+
|
5
6
|
def start_strong attrs
|
6
7
|
@output << "*"
|
7
8
|
@output << add_attributes(attrs) if add_attributes(attrs)
|
@@ -11,7 +12,6 @@ class PinkShirt
|
|
11
12
|
|
12
13
|
def end_strong
|
13
14
|
@output << "*"
|
14
|
-
|
15
15
|
end
|
16
16
|
|
17
17
|
def start_b attrs
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class PinkShirt
|
2
2
|
class SAX::Images < SAX::Base
|
3
3
|
TAGS = %(img)
|
4
|
+
|
4
5
|
def start_img attrs
|
5
6
|
title = attrs['alt'] || attrs['title']
|
6
7
|
title = nil if title == "" || title == " "
|
@@ -10,6 +11,7 @@ class PinkShirt
|
|
10
11
|
image += "!"
|
11
12
|
@output << image
|
12
13
|
end
|
14
|
+
|
13
15
|
def end_img
|
14
16
|
|
15
17
|
end
|
data/lib/pink_shirt/sax/links.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
class PinkShirt
|
2
2
|
class SAX::Links < SAX::Base
|
3
3
|
TAGS = %(a)
|
4
|
+
|
4
5
|
def start_a attrs
|
5
6
|
@link_info = attrs
|
6
7
|
link = ""
|
@@ -8,6 +9,7 @@ class PinkShirt
|
|
8
9
|
link += "(#{attrs['class']}). " if attrs['class']
|
9
10
|
@output << link
|
10
11
|
end
|
12
|
+
|
11
13
|
def end_a
|
12
14
|
link = ""
|
13
15
|
link += " (#{@link_info['title']})" if @link_info['title']
|
data/lib/pink_shirt/sax/lists.rb
CHANGED
data/lib/pink_shirt/version.rb
CHANGED
data/lib/pink_shirt.rb
CHANGED
@@ -4,24 +4,23 @@ require 'nokogiri'
|
|
4
4
|
# PinkShirt Undoes RedCloth
|
5
5
|
#
|
6
6
|
#
|
7
|
-
# Usage
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# PinkShirt.new('stuff').to_textile
|
7
|
+
# = Usage
|
8
|
+
# html = "stuff <b>goood</b> stuff"
|
9
|
+
# PinkShirt.new('stuff').to_textile
|
11
10
|
#
|
12
|
-
# Internals
|
13
|
-
#
|
11
|
+
# = Internals
|
12
|
+
#
|
14
13
|
# PinkShirt uses a sax parser built on nokogiri
|
15
|
-
|
16
|
-
|
14
|
+
#
|
17
15
|
class PinkShirt
|
18
|
-
|
16
|
+
# @param html [String]
|
19
17
|
def initialize(html)
|
20
18
|
@html = html
|
21
19
|
@sax_syntax = PinkShirt::SAX.new
|
22
20
|
@parser = Nokogiri::HTML::SAX::Parser.new(@sax_syntax)
|
23
21
|
end
|
24
22
|
|
23
|
+
# renders to textile
|
25
24
|
def to_textile
|
26
25
|
@parser.parse(@html)do |config|
|
27
26
|
config.replace_entities = false
|
data/pink_shirt.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["graemeworthy@gmail.com"]
|
10
10
|
s.homepage = ""
|
11
11
|
s.summary = %q{An Html to Textile Converter}
|
12
|
-
s.description = %q{Converts Html to Textile, or as some say 'html2textile', it's built on nokogiri
|
12
|
+
s.description = %q{Converts Html to Textile, or as some say 'html2textile', it's built on nokogiri}
|
13
13
|
|
14
14
|
s.rubyforge_project = "pink_shirt"
|
15
15
|
|
@@ -10,22 +10,22 @@ Stress emphasis:
|
|
10
10
|
text is typically styled as __italics__.
|
11
11
|
input: You didn't actually _believe_ her, did you?
|
12
12
|
output: <p>You didn’t actually <em>believe</em> her, did you?</p>
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
Stylistic offset in links:
|
14
|
+
Stylistic offset in links:
|
15
|
+
desc: To stylistically differentiate a word or phrase from the surrounding text
|
16
|
+
*without conveying any extra importance*, place two asterisks on either side. Uses
|
17
|
+
are key words in a document abstract, product names in a review, or other
|
18
|
+
spans of text whose typical typographic presentation is boldened.
|
19
|
+
input: |-
|
20
|
+
Search results for **Textile**:
|
21
21
|
|
22
|
-
|
22
|
+
h4. "**Textile** (markup language) - Wikipedia":http://en.wikipedia.org/wiki/Textile_(markup_language)
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
**Textile** is a lightweight markup language originally developed by Dean Allen and billed as a "humane Web text generator". **Textile** converts its marked-up text ...
|
25
|
+
output: |-
|
26
|
+
<p>Search results for <b>Textile</b>:</p>
|
27
|
+
<h4><a href="http://en.wikipedia.org/wiki/Textile_(markup_language)"><b>Textile</b> (markup language) – Wikipedia</a></h4>
|
28
|
+
<p><b>Textile</b> is a lightweight markup language originally developed by Dean Allen and billed as a “humane Web text generator”. <b>Textile</b> converts its marked-up text …</p>
|
29
29
|
Stylistic offset:
|
30
30
|
Stylistic offset:
|
31
31
|
desc: To stylistically differentiate a word or phrase from the surrounding text
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pink_shirt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-02-27 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: RedCloth
|
16
|
-
requirement: &
|
16
|
+
requirement: &70218567294800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70218567294800
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70218567294300 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70218567294300
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: nokogiri
|
38
|
-
requirement: &
|
38
|
+
requirement: &70218567293720 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,9 +43,9 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70218567293720
|
47
47
|
description: Converts Html to Textile, or as some say 'html2textile', it's built on
|
48
|
-
nokogiri
|
48
|
+
nokogiri
|
49
49
|
email:
|
50
50
|
- graemeworthy@gmail.com
|
51
51
|
executables: []
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- Gemfile
|
57
57
|
- Rakefile
|
58
58
|
- Readme.txt
|
59
|
+
- changelog
|
59
60
|
- lib/pink_shirt.rb
|
60
61
|
- lib/pink_shirt/attributes.rb
|
61
62
|
- lib/pink_shirt/entities.rb
|
@@ -128,3 +129,4 @@ test_files:
|
|
128
129
|
- spec/textile-spec/paragraph_text.yaml
|
129
130
|
- spec/textile-spec/phrase_modifiers.yaml
|
130
131
|
- spec/textile_spec.rb
|
132
|
+
has_rdoc:
|