texttube 5.1.1 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d2fd3b516b75ad314db454507278459173618f6e
4
+ data.tar.gz: 33b727194070771ecb3e32517204f376c1ec468c
5
+ SHA512:
6
+ metadata.gz: 114c1141b316a4e5ad05f92487ceb4a014fb542794fe150d348c1bb9527e9c90e11f86db33bc44889495a34396999be68999c99ea116675c310bd1ed89224384
7
+ data.tar.gz: 6216d74f04173b226bcebaa5de1ba673e09d52822ffba0e4c09f2ece08c2c1c40365191f5837fc08369bab7a754b1004b14255b8785a39fbba1e841184a49067
data/.gitignore CHANGED
@@ -20,3 +20,6 @@ Gemfile.lock
20
20
  bin/
21
21
  vendor/
22
22
  coverage/
23
+ docs/
24
+ .yardoc/
25
+ .bundle/
data/CHANGES.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # CH CH CH CHANGES! #
2
2
 
3
+ ## Friday the 17th of October 2014, v6.0.0 ##
4
+
5
+ * Moved extra filters into TextTubeBaby to make the library lighter and easier to install.
6
+ * Updated specs to check core lib now filter specs have gone.
7
+
8
+ ----
9
+
10
+
3
11
  ## Wednesday the 30th of July 2014, v5.1.1 ##
4
12
 
5
13
  * Updated info in the README about Spiffing CSS website, since it's gone.
data/Gemfile CHANGED
@@ -21,4 +21,5 @@ group :test do
21
21
  gem "maruku"
22
22
  gem "rdiscount"
23
23
  gem "kramdown"
24
+ gem "rspec-its"
24
25
  end
data/README.md CHANGED
@@ -2,10 +2,6 @@
2
2
 
3
3
  Pass a string through filters to transform it.
4
4
 
5
- ### Note! ###
6
-
7
- If you're having a problem with the TextTube::InsideBlock filter on Heroku it could be because of the version of Libxml2 it uses, as [the problem given here states](http://stackoverflow.com/q/8598958/335847), which means Nokogiri won't always work properly on Heroku. When using the InsideBlock filter this can be a problem, so use the `hpricot` branch instead.
8
-
9
5
  ### Build status ###
10
6
 
11
7
  Master branch:
@@ -130,223 +126,14 @@ The class picks which filters to use, and can add filters on the fly, by using `
130
126
  s.filter
131
127
  # => "Let me introduce <a href="iainbarnett.me.uk" title="My blog">Iain Barnett</a>. He writes Ruby code. ©2013. Let me introduce <a href="iainbarnett.me.uk" title="My blog">Iain Barnett</a>. He writes Ruby code. ©2013. "
132
128
 
129
+ ### Ready made filters ###
133
130
 
134
- ## The Filters ##
135
-
136
- Here are some ready built filters to use.
137
-
138
- ### LinkReffing ###
139
-
140
- If you'd don't want your links inline and would prefer to have them at the bottom of the document, then you can use this:
141
-
142
- require 'texttube/base'
143
- require 'texttube/filters/link_reffing'
144
-
145
- class TextWithLinks < TextTube::Base
146
- register TextTube::LinkReffing
147
- end
148
-
149
- s = TextWithLinks.new %q!Iain's blog[[http://iainbarnett.me.uk|My blog]] is good. Erik Hollensbe's blog[[http://erik.hollensbe.org/|Holistic Engineering]] is also good, as is James Coglan's blog[[http://blog.jcoglan.com/|The If Works]]!
150
-
151
- s.filter
152
-
153
- and it will produce this:
154
-
155
- # => "Iain's blog[&#8304;](#0 "Jump to reference") is good. Erik Hollensbe's blog[&sup1;](#1 "Jump to reference") is also good, as is James Coglan's blog[&sup2;](#2 "Jump to reference")\n<div markdown='1' id='reflinks'>\n<a name="0"></a>&#91;0&#93; [http://iainbarnett.me.uk](http://iainbarnett.me.uk "http://iainbarnett.me.uk") My blog\n\n\n<a name="1"></a>&#91;1&#93; [http://erik.hollensbe.org/](http://erik.hollensbe.org/ "http://erik.hollensbe.org/") Holistic Engineering\n\n\n<a name="2"></a>&#91;2&#93; [http://blog.jcoglan.com/](http://blog.jcoglan.com/ "http://blog.jcoglan.com/") The If Works\n\n</div>"
156
-
157
- Run that through a markdown parser and you get:
158
-
159
- <p>Iain's blog<a href="#0" title="Jump to reference">&#8304;</a> is good. Erik Hollensbe's blog<a href="#1" title="Jump to reference">&sup1;</a> is also good, as is James Coglan's blog<a href="#2" title="Jump to reference">&sup2;</a></p>
160
-
161
- <div markdown='1' id='reflinks'>
162
- <a name="0"></a>&#91;0&#93; [http://iainbarnett.me.uk](http://iainbarnett.me.uk "http://iainbarnett.me.uk") My blog
163
-
164
-
165
- <a name="1"></a>&#91;1&#93; [http://erik.hollensbe.org/](http://erik.hollensbe.org/ "http://erik.hollensbe.org/") Holistic Engineering
166
-
167
-
168
- <a name="2"></a>&#91;2&#93; [http://blog.jcoglan.com/](http://blog.jcoglan.com/ "http://blog.jcoglan.com/") The If Works
169
-
170
- </div>
171
-
172
- Using this will probably end up with also using InsideBlock, to transform the markdown inside the div.
173
-
174
- ### InsideBlock ###
175
-
176
- Sometimes it'd be useful to wrap some markdown with HTML, for example:
177
-
178
- <div id="notes">
179
-
180
- * first
181
- * second
182
- * third
183
-
184
- </div>
185
-
186
- If you put this through a markdown parser the markdown won't get parsed:
187
-
188
- require 'rdiscount'
189
- s = "<div id="notes">\n\n* first\n* second\n* third\n\n</div>\n"
190
- puts RDiscount.new(s).to_html
191
-
192
- This is the output:
193
-
194
- <div id="notes">
195
-
196
- * first
197
- * second
198
- * third
199
-
200
- </div>
201
-
202
- My brilliant idea to get around this is to add an HTML attribute of `markdown='1'` to HTML tags that you want the markdown parser to look inside:
203
-
204
- <div id="notes" markdown='1'>
205
-
206
- * first
207
- * second
208
- * third
209
-
210
- </div>
211
-
212
- Trying this with `InsideBlock` gives:
213
-
214
- puts TextTube::InsideBlock.run s
215
-
216
- <div id="notes">
217
- <ul>
218
- <li>first</li>
219
- <li>second</li>
220
- <li>third</li>
221
- </ul>
222
-
223
- </div>
224
-
225
- To use it as a filter:
226
-
227
- require 'texttube/base'
228
-
229
- class MyFilter < TextTube::Base
230
- register TextTube::InsideBlock
231
- end
232
-
233
- myf = MyFilter.new(s)
234
- # => "<div id="notes" markdown='1'>\n\n* first\n* second\n* third\n\n</div>\n"
235
-
236
- puts myf.filter
237
-
238
- Gives:
239
-
240
- <div id="notes">
241
- <ul>
242
- <li>first</li>
243
- <li>second</li>
244
- <li>third</li>
245
- </ul>
246
-
247
- </div>
248
-
249
- ### Coderay ###
250
-
251
- Filters an HTML code block and marks it up with [coderay](http://coderay.rubychan.de/):
252
-
253
-
254
-
255
- require 'texttube/base'
256
- require 'texttube/filters/coderay'
257
- require 'rdiscount' # a markdown parser
258
-
259
- class TextWithCode < TextTube::Base
260
- register do
261
- filter_with :rdiscount do |text|
262
- RDiscount.new(text).to_html
263
- end
264
- end
265
- register TextTube::Coderay
266
- end
267
-
268
- s = TextWithCode.new <<'STR'
269
- # FizzBuzz #
270
-
271
- ::::ruby
272
- (1..100).each do |n|
273
- out = "#{n}: "
274
- out << "Fizz" if n % 3 == 0
275
- out << "Buzz" if n % 5 == 0
276
- puts out
277
- end
278
-
279
- That's all folks!
280
- STR
281
- # => "# FizzBuzz #\n\n ::::ruby\n (1..100).each do |n| \n out = "\#{n}: "\n out << "Fizz" if n % 3 == 0\n out << "Buzz" if n % 5 == 0\n puts out\n end\n\nThat's all folks!\n"
282
-
283
-
284
- puts s.filter
285
-
286
- Produces:
287
-
288
- <h1>FizzBuzz</h1>
289
-
290
- <pre><code class="CodeRay">(<span class="integer">1</span>..<span class="integer">100</span>).each <span class="keyword">do</span> |n|
291
- out = <span class="string"><span class="delimiter">"</span><span class="inline"><span class="inline-delimiter">#{</span>n<span class="inline-delimiter">}</span></span><span class="content">: </span><span class="delimiter">"</span></span>
292
- out &lt;&lt; <span class="string"><span class="delimiter">"</span><span class="content">Fizz</span><span class="delimiter">"</span></span> <span class="keyword">if</span> n % <span class="integer">3</span> == <span class="integer">0</span>
293
- out &lt;&lt; <span class="string"><span class="delimiter">"</span><span class="content">Buzz</span><span class="delimiter">"</span></span> <span class="keyword">if</span> n % <span class="integer">5</span> == <span class="integer">0</span>
294
- puts out
295
- <span class="keyword">end</span></code></pre>
296
-
297
- <p>That's all folks!</p>
298
-
299
- The language was specified with a leading `::::ruby`. It didn't have to be as the default is to use Ruby, but if you want to use any other of the [coderay supported languages](http://coderay.rubychan.de/doc/CodeRay/Scanners.html), that's how to do it.
300
-
301
- ### Spiffing ###
302
-
303
- Transforms CSS written in British English into its ugly sister from across the pond. Inspired by [visualidiot's SpiffingCSS](https://github.com/visualidiot/Spiffing).
304
-
305
- content = <<CSS
306
- body {
307
- background-colour: darkgrey;
308
- background-photograph: url(logo.gif);
309
- transparency: .7;
310
-
311
- font: 72px "Comic Sans", cursive !please;
312
- font-weight: plump;
313
- p { text-align: centre }
314
- fieldset input {
315
- text-transform: capitalise;
316
- }
317
- }
318
- CSS
319
-
320
- require 'texttube/base'
321
- require 'texttube/filters/spiffing'
322
-
323
- class CssString < TextTube::Base
324
- register TextTube::Spiffing
325
- end
326
-
327
- puts CssString.new(content).filter
328
-
329
- # output:
330
-
331
- body {
332
- background-color: darkgray;
333
- background-image: url(logo.gif);
334
- opacity: .7;
335
-
336
- font: 72px "Comic Sans", cursive !important;
337
- font-weight: bold;
338
- p { text-align: center }
339
- fieldset input {
340
- text-transform: capitalize;
341
- }
342
- }
343
-
344
- God save the Queen!
131
+ They used to come with this library, but sometimes they caused problems with installation (things like Nokogiri can be painful to install at times) so I spun them off into their own library - TextTubeBaby!
345
132
 
346
133
 
347
134
  ### Contributors ###
348
135
 
349
- Many thanks to Eleni Karinou and [Annette Smith](https://twitter.com/moosecatear) for brainsplatting a new name for the library, and after many unusable and clearly disturbing suggestions, to Annette for the final name (and its future spin off, which will remain secret for now).
136
+ Many thanks to Eleni Karinou and [Annette Smith](https://twitter.com/moosecatear) for brainsplatting a new name for the library, and after many unusable and clearly disturbing suggestions, to Annette for the final name (and its spin off, TextTubeBaby).
350
137
 
351
138
 
352
139
  ### Licence ###
@@ -2,5 +2,5 @@
2
2
 
3
3
  module TextTube
4
4
  # This library's version.
5
- VERSION = "5.1.1"
5
+ VERSION = "6.0.0"
6
6
  end
data/lib/texttube.rb CHANGED
@@ -1,23 +1,4 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
  require_relative "./ext/blank.rb"
4
- require_relative "./ext/to_constant.rb"
5
-
6
- # The original. Maybe. I haven't checked.
7
- module TextTube
8
-
9
- # Require all the filters.
10
- # The `map` is there to show the result of this and
11
- # show which libs were required (if so desired).
12
- # @return [Array<String,TrueClass>]
13
- def self.load_all_filters
14
- Dir.glob( File.join File.dirname(__FILE__), "/texttube/filters/*.rb" )
15
- .reject{|name| name.end_with? "version.rb" }
16
- .map{|filter|
17
- tf = require filter
18
- [File.basename(filter, ".rb").gsub("_",""), tf]
19
- }
20
- end
21
-
22
-
23
- end
4
+ require_relative "./ext/to_constant.rb"
data/spec/base_spec.rb ADDED
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'rspec/its'
3
+ require_relative "../lib/texttube/base.rb"
4
+
5
+ module TextTube # for convenience
6
+
7
+ describe Base do
8
+
9
+ context "Checking the basics" do
10
+ context "Instances" do
11
+ subject { Base.new "anything" }
12
+ it { should be_a_kind_of String }
13
+ it { should respond_to :options }
14
+ its(:options) { should respond_to :empty? }
15
+ its(:options) { should be_empty }
16
+ end
17
+ context "Class methods and their defaults" do
18
+ subject { Base }
19
+ it { should respond_to :options }
20
+ its(:options) { should respond_to :empty? }
21
+ its(:options) { should be_empty }
22
+ it { should respond_to :reset! }
23
+ it { should respond_to :filters }
24
+ its(:filters) { should respond_to :empty? }
25
+ its(:filters) { should be_empty }
26
+ it { should respond_to :register }
27
+ it { should respond_to :inherited }
28
+ end
29
+ end
30
+ end
31
+
32
+
33
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require 'rspec/its'
3
+ require_relative "../lib/texttube/base.rb"
4
+ require_relative "../lib/texttube/filterable.rb"
5
+
6
+ module TextTube # for convenience
7
+
8
+ describe "Example usage" do
9
+ before :all do
10
+ module AFilter
11
+ extend TextTube::Filterable
12
+
13
+ filter_with :double do |text|
14
+ text * 2
15
+ end
16
+
17
+ filter_with :triple do |text|
18
+ text * 3
19
+ end
20
+ end
21
+
22
+ module BFil
23
+ extend TextTube::Filterable
24
+
25
+ filter_with :spacial do |current,options|
26
+ current.split(//).join " "
27
+ end
28
+ end
29
+
30
+ class NeuS < TextTube::Base
31
+ register BFil
32
+ register AFilter
33
+ register do
34
+ filter_with :dashes do |text|
35
+ "---#{text}---"
36
+ end
37
+ end
38
+ end
39
+ end # before
40
+
41
+ context "Instantiation" do
42
+ let(:n) { NeuS.new "abc" }
43
+ subject { n }
44
+ it { should == "abc" }
45
+
46
+ context "filtering" do
47
+ context "With no arguments" do
48
+ subject { n.filter }
49
+ it { should == "---a b ca b ca b ca b ca b ca b c---" }
50
+ end
51
+ context "Given a specific filter" do
52
+ subject { n.filter :spacial }
53
+ it { should == "a b c" }
54
+ end
55
+ context "Given several specific filters" do
56
+ subject { n.filter :spacial, :dashes, :spacial }
57
+ it { should == "- - - a b c - - -" }
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ end # inconvenient
data/spec/spec_helper.rb CHANGED
@@ -27,7 +27,6 @@ Dir[ File.join( Spec_dir, "/support/**/*.rb")].each do |f|
27
27
  end
28
28
 
29
29
 
30
- RSpec.configure do |config|
31
- config.treat_symbols_as_metadata_keys_with_true_values = true
32
- end
30
+ # RSpec.configure do |config|
31
+ # end`
33
32
 
data/texttube.gemspec CHANGED
@@ -4,17 +4,13 @@ require "texttube/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "texttube"
7
- s.summary = "Some useful filters for markdown that I use in my blogs"
8
- s.description = <<-EOF
9
- Some markdown filters I find useful.
10
- EOF
7
+ s.summary = "Create chainable filters with ease."
8
+ s.description = s.summary
11
9
  s.version = TextTube::VERSION
12
10
  s.platform = Gem::Platform::RUBY
13
11
  s.required_ruby_version = ">= 1.9.1"
14
12
  s.author = "Iain Barnett"
15
13
  s.files = `git ls-files`.split("\n")
16
- s.add_dependency("nokogiri", '~>1.5.9' )
17
- s.add_dependency("coderay", '~>1.0' )
18
14
  s.email = "iainspeed @nospam@ gmail.com"
19
15
  s.test_files = `git ls-files -- {test,spec,features}`.split("\n")
20
16
  s.homepage = "https://github.com/yb66/TextTube"
metadata CHANGED
@@ -1,64 +1,23 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: texttube
3
- version: !ruby/object:Gem::Version
4
- hash: 49
5
- prerelease:
6
- segments:
7
- - 5
8
- - 1
9
- - 1
10
- version: 5.1.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 6.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Iain Barnett
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2014-07-30 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: nokogiri
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 17
29
- segments:
30
- - 1
31
- - 5
32
- - 9
33
- version: 1.5.9
34
- type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: coderay
38
- prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 15
45
- segments:
46
- - 1
47
- - 0
48
- version: "1.0"
49
- type: :runtime
50
- version_requirements: *id002
51
- description: " Some markdown filters I find useful.\n"
11
+ date: 2014-10-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Create chainable filters with ease.
52
14
  email: iainspeed @nospam@ gmail.com
53
15
  executables: []
54
-
55
16
  extensions: []
56
-
57
17
  extra_rdoc_files: []
58
-
59
- files:
60
- - .gitignore
61
- - .travis.yml
18
+ files:
19
+ - ".gitignore"
20
+ - ".travis.yml"
62
21
  - CHANGES.md
63
22
  - Gemfile
64
23
  - README.md
@@ -68,61 +27,35 @@ files:
68
27
  - lib/texttube.rb
69
28
  - lib/texttube/base.rb
70
29
  - lib/texttube/filterable.rb
71
- - lib/texttube/filters/coderay.rb
72
- - lib/texttube/filters/embedding_audio.rb
73
- - lib/texttube/filters/embedding_video.rb
74
- - lib/texttube/filters/inside_block.rb
75
- - lib/texttube/filters/link_reffing.rb
76
- - lib/texttube/filters/spiffing.rb
77
30
  - lib/texttube/version.rb
78
- - spec/coderay_spec.rb
79
- - spec/embedding_audio_spec.rb
80
- - spec/inside_block_spec.rb
81
- - spec/link_reffing_spec.rb
82
- - spec/markdownfilters_spec.rb
31
+ - spec/base_spec.rb
32
+ - spec/examples_spec.rb
83
33
  - spec/spec_helper.rb
84
- - spec/spiffing_spec.rb
85
34
  - texttube.gemspec
86
35
  homepage: https://github.com/yb66/TextTube
87
36
  licenses: []
88
-
37
+ metadata: {}
89
38
  post_install_message:
90
39
  rdoc_options: []
91
-
92
- require_paths:
40
+ require_paths:
93
41
  - lib
94
- required_ruby_version: !ruby/object:Gem::Requirement
95
- none: false
96
- requirements:
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
97
44
  - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 49
100
- segments:
101
- - 1
102
- - 9
103
- - 1
45
+ - !ruby/object:Gem::Version
104
46
  version: 1.9.1
105
- required_rubygems_version: !ruby/object:Gem::Requirement
106
- none: false
107
- requirements:
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
108
49
  - - ">="
109
- - !ruby/object:Gem::Version
110
- hash: 3
111
- segments:
112
- - 0
113
- version: "0"
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
114
52
  requirements: []
115
-
116
53
  rubyforge_project:
117
- rubygems_version: 1.8.22
54
+ rubygems_version: 2.2.2
118
55
  signing_key:
119
- specification_version: 3
120
- summary: Some useful filters for markdown that I use in my blogs
121
- test_files:
122
- - spec/coderay_spec.rb
123
- - spec/embedding_audio_spec.rb
124
- - spec/inside_block_spec.rb
125
- - spec/link_reffing_spec.rb
126
- - spec/markdownfilters_spec.rb
56
+ specification_version: 4
57
+ summary: Create chainable filters with ease.
58
+ test_files:
59
+ - spec/base_spec.rb
60
+ - spec/examples_spec.rb
127
61
  - spec/spec_helper.rb
128
- - spec/spiffing_spec.rb
@@ -1,68 +0,0 @@
1
- # encoding: UTF-8
2
- module TextTube
3
-
4
- require 'nokogiri'
5
- require_relative "../../ext/blank.rb"
6
- require 'coderay'
7
- require_relative "../filterable.rb"
8
-
9
- # a filter for Coderay
10
- module Coderay
11
- extend Filterable
12
-
13
- filter_with :coderay do |text|
14
- TextTube::Coderay.run text
15
- end
16
-
17
-
18
- # @param [String] content
19
- # @param [Hash] options
20
- # @return [String]
21
- def self.run(content, options={})
22
- options = {lang: :ruby } if options.blank?
23
- doc = Nokogiri::HTML::fragment(content)
24
-
25
- code_blocks = doc.xpath("pre/code").map do |code_block|
26
- #un-escape as Coderay will escape it again
27
- inner_html = code_block.inner_html
28
-
29
- # following the convention of Rack::Codehighlighter
30
- if inner_html.start_with?("::::")
31
- lines = inner_html.split("\n")
32
- options[:lang] = lines.shift.match(%r{::::(\w+)})[1].to_sym
33
- inner_html = lines.join("\n")
34
- end
35
-
36
- if (options[:lang] == :skip) || (! options.has_key? :lang )
37
- code_block.inner_html = inner_html
38
- else
39
- code = Coderay.codify(Coderay.html_unescape(inner_html), options[:lang])
40
- code_block.inner_html = code
41
- code_block["class"] = "CodeRay"
42
- end
43
- end#block
44
-
45
- doc.to_s
46
- end#def
47
-
48
- # @private
49
- # Unescape the HTML as the Coderay scanner won't work otherwise.
50
- def self.html_unescape(a_string)
51
- a_string.gsub('&amp;', '&').gsub('&lt;', '<').gsub('&gt;',
52
- '>').gsub('&quot;', '"')
53
- end#def
54
-
55
- # Run the Coderay scanner.
56
- # @private
57
- # @param [String] str
58
- # @param [String] lang
59
- # @example
60
- # self.class.codify "x = 2", "ruby"
61
- def self.codify(str, lang)
62
- CodeRay.scan(str, lang).html
63
- end#def
64
-
65
- end#class
66
-
67
-
68
- end#module