texta 0.1.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.
Files changed (6) hide show
  1. data/Manifest +4 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +18 -0
  4. data/lib/texta.rb +176 -0
  5. data/texta.gemspec +39 -0
  6. metadata +94 -0
data/Manifest ADDED
@@ -0,0 +1,4 @@
1
+ README.rdoc
2
+ Rakefile
3
+ lib/texta.rb
4
+ Manifest
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ Texta
2
+ =====
3
+
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('texta', '0.1.0') do |p|
6
+ p.description = "texta: heuristic text formatting"
7
+ p.url = "http://github.com/pboy/texta"
8
+ p.author = "pboy"
9
+ p.email = "eno-pboy@open-lab.org"
10
+ p.ignore_pattern = ["tmp/*", "script/*"]
11
+ p.runtime_dependencies = %w(nokogiri htmlentities rdiscount)
12
+ end
13
+
14
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
15
+
16
+ task :default do
17
+ require "test/test.rb"
18
+ end
data/lib/texta.rb ADDED
@@ -0,0 +1,176 @@
1
+ require "rubygems"
2
+ require "nokogiri"
3
+ require "htmlentities"
4
+ require "rdiscount"
5
+
6
+ module Texta
7
+ def self.init
8
+ String.send :include, self
9
+ end
10
+
11
+ def self.is_html?(text)
12
+ text =~ /<(ul|p|br|li|b|i)\b(.*?)>/
13
+ end
14
+
15
+ def texta(mode = :text)
16
+ Texta.send mode, self
17
+ end
18
+
19
+ def self.html(str)
20
+ str = ::HTMLEntities.new.encode text(str), :named
21
+ RDiscount.new(str).to_html
22
+ end
23
+
24
+ def self.text(str)
25
+ return str unless is_html?(str)
26
+ T.new(str)
27
+ end
28
+
29
+ class T < String
30
+ def initialize(html)
31
+ body = Nokogiri.HTML(html).css("body").first
32
+ super children(body).join("\n")
33
+ end
34
+
35
+ def children(node)
36
+ nodes = node.children.map do |n|
37
+ process(n)
38
+ end.compact
39
+ end
40
+
41
+ def process(node)
42
+ case node.name
43
+ when *%w(i b li)
44
+ children(node).join(" ")
45
+ when /h([1-2])/
46
+ char = $1 == "1" ? "=" : "-"
47
+ s = children(node).join(" ")
48
+ "#{s}\n" + char * [ [s.length, 6].min, 32 ].max + "\n\n"
49
+ when /h([1-6])/
50
+ "#" * $1.to_i + " " + children(node).join(" ") + "\n\n"
51
+ when "text"
52
+ s = node.to_s.gsub(/(^\s+)|(\s+$)/, "")
53
+ s == "" ? nil : s
54
+ when "p"
55
+ children(node).join(" ") + "\n"
56
+ when "ul"
57
+ children(node).map { |s| "- #{s}\n" }.join + "\n"
58
+ else
59
+ invalid_argument!("node #{node.name}")
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ class String
66
+ include Texta
67
+ end
68
+
69
+ module Texta::Etest
70
+ def assert_equal_xml(x1, x2)
71
+ return if x1.gsub(/\s/, "") == x2.gsub(/\s/, "")
72
+ assert_equal(x1 ,x2)
73
+ end
74
+
75
+ def assert_testa(input, text, html)
76
+ assert_equal text || input, input.texta(:text)
77
+ assert_equal_xml html, input.texta(:html)
78
+ end
79
+
80
+ # Tests are "<input>, "<text>", "<output>""
81
+ def test_plain_text
82
+ input = "XYZ"
83
+ text = "XYZ"
84
+ html = "<p>XYZ</p>"
85
+
86
+ assert_testa input, text, html
87
+ end
88
+
89
+ def test_entities
90
+ input = "ÄÖÜäöü"
91
+ html = "html"
92
+ # input = "ÄÖÜäöü" #{ }"ÄÖÜäöü"
93
+ html = "<p>&Auml;&Ouml;&Uuml;&auml;&ouml;&uuml;</p>"
94
+
95
+ assert_testa input, nil, html #{}"ÄÖÜäöü", html
96
+ end
97
+
98
+ def _test_list
99
+ input = <<TXT
100
+ Information
101
+
102
+ - Full-HD
103
+ - Auflösung: 1920 x 1080
104
+ - Format: 16:9
105
+
106
+ Die Ware wird originalverpackt und mit dem vom Hersteller beschriebenen Zubehör an Sie ausgeliefert.
107
+ TXT
108
+
109
+ text = <<TEXT
110
+ Information
111
+
112
+ - Full-HD
113
+ - Auflösung: 1920 x 1080
114
+ - Format: 16:9
115
+
116
+ Die Ware wird originalverpackt und mit dem vom Hersteller beschriebenen Zubehör an Sie ausgeliefert.
117
+ TEXT
118
+
119
+ html = <<HTML
120
+ <p>Information</p>
121
+ <ul>
122
+ <li>Full-HD</li>
123
+ <li>Aufl&ouml;sung: 1920 x 1080</li>
124
+ <li>Format: 16:9</li>
125
+ </ul>
126
+ <p>
127
+ Die Ware wird originalverpackt und mit dem vom Hersteller beschriebenen Zubeh&ouml;r an Sie ausgeliefert.
128
+ </p>
129
+ HTML
130
+
131
+ assert_testa input, text, html
132
+ end
133
+
134
+ def test_string_module
135
+ assert_equal "a chd d\n", "a <b>chd</b> d".texta(:text)
136
+ end
137
+
138
+ def test_invalid_option
139
+ assert_raise(NoMethodError) {
140
+ "ss".texta(:x)
141
+ }
142
+ end
143
+
144
+ def test_t1
145
+ input = <<HTML
146
+ <p>
147
+ Read this book!
148
+ </p>
149
+ <ul>
150
+ <li>All you ever wanted to know about html!</li>
151
+ <li>and even more</li>
152
+ <li>at your fingertips</li>
153
+ </ul>
154
+ HTML
155
+
156
+ text = <<TEXT
157
+ Read this book!
158
+
159
+ - All you ever wanted to know about html!
160
+ - and even more
161
+ - at your fingertips
162
+
163
+ TEXT
164
+
165
+ html = <<HTML
166
+ <p>Read this book!</p>
167
+ <ul>
168
+ <li>All you ever wanted to know about html!</li>
169
+ <li>and even more</li>
170
+ <li>at your fingertips</li>
171
+ </ul>
172
+ HTML
173
+
174
+ assert_testa input, text, html
175
+ end
176
+ end
data/texta.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{texta}
5
+ s.version = "0.1.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["pboy"]
9
+ s.date = %q{2009-12-17}
10
+ s.description = %q{texta: heuristic text formatting}
11
+ s.email = %q{eno-pboy@open-lab.org}
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/texta.rb"]
13
+ s.files = ["README.rdoc", "Rakefile", "lib/texta.rb", "Manifest", "texta.gemspec"]
14
+ s.homepage = %q{http://github.com/pboy/texta}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Texta", "--main", "README.mdown"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{texta}
18
+ s.rubygems_version = %q{1.3.5}
19
+ s.summary = %q{texta: heuristic text formatting}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
27
+ s.add_runtime_dependency(%q<htmlentities>, [">= 0"])
28
+ s.add_runtime_dependency(%q<rdiscount>, [">= 0"])
29
+ else
30
+ s.add_dependency(%q<nokogiri>, [">= 0"])
31
+ s.add_dependency(%q<htmlentities>, [">= 0"])
32
+ s.add_dependency(%q<rdiscount>, [">= 0"])
33
+ end
34
+ else
35
+ s.add_dependency(%q<nokogiri>, [">= 0"])
36
+ s.add_dependency(%q<htmlentities>, [">= 0"])
37
+ s.add_dependency(%q<rdiscount>, [">= 0"])
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: texta
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - pboy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-17 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: htmlentities
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rdiscount
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ description: "texta: heuristic text formatting"
46
+ email: eno-pboy@open-lab.org
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files:
52
+ - README.rdoc
53
+ - lib/texta.rb
54
+ files:
55
+ - README.rdoc
56
+ - Rakefile
57
+ - lib/texta.rb
58
+ - Manifest
59
+ - texta.gemspec
60
+ has_rdoc: true
61
+ homepage: http://github.com/pboy/texta
62
+ licenses: []
63
+
64
+ post_install_message:
65
+ rdoc_options:
66
+ - --line-numbers
67
+ - --inline-source
68
+ - --title
69
+ - Texta
70
+ - --main
71
+ - README.mdown
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ version:
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: "1.2"
85
+ version:
86
+ requirements: []
87
+
88
+ rubyforge_project: texta
89
+ rubygems_version: 1.3.5
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: "texta: heuristic text formatting"
93
+ test_files: []
94
+