motion-html-pipeline 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +67 -121
- data/lib/motion-html-pipeline/document_fragment.rb +1 -1
- data/lib/motion-html-pipeline/pipeline/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55c54e232963c7cf35b570d08254c1e606734fdfa9366b283a725ca000b93e27
|
4
|
+
data.tar.gz: 88cc47077bb6987d072abd324721d5c31ec06d6ac24a4a829fdcc7bd860faa2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a0826f7b29520d89e95ceb4c29ebf14c4e6d6a9c545ffccff10e36d8dab55a4bbb395f1b3a05bb322eac611589c0b5b44a59abdca439b803be26bcca1136481
|
7
|
+
data.tar.gz: 455fda735e854253104bc9562bb6e6b06ce56fd9c598577356ac2d38b353d15e3b8aa63ff1cfbd0b228a5e58c42f0a30d178ac8afcad5e142e4058aa044c6e5d
|
data/README.md
CHANGED
@@ -3,16 +3,7 @@
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/motion-html-pipeline.svg)](http://badge.fury.io/rb/motion-html-pipeline)
|
4
4
|
[![Build Status](https://travis-ci.org/digitalmoksha/motion-html-pipeline.svg?branch=master)](https://travis-ci.org/digitalmoksha/motion-html-pipeline)
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
Several of the standard filters, such as `AutolinkFilter` and `EmojiFilter`, are initially disabled, as they rely on other Ruby gems that don't have RubyMotion equivalents. Please feel free to submit a pull request that enables any of them.
|
9
|
-
|
10
|
-
We use [HTMLKit](https://github.com/iabudiab/HTMLKit) to take the place of Nokogiri.
|
11
|
-
|
12
|
-
Below is a copy of the original README file, until I'm able to flesh this one out more.
|
13
|
-
|
14
|
-
---
|
15
|
-
# HTML::Pipeline
|
6
|
+
_This gem is a port of the [`html-pipeline` gem](https://github.com/jch/html-pipeline) to RubyMotion, for use on iOS and macOS. Currently synced with `html-pipeline` release [`v.2.11.0`](https://github.com/jch/html-pipeline/releases/tag/v2.11.0)_
|
16
7
|
|
17
8
|
GitHub HTML processing filters and utilities. This module includes a small
|
18
9
|
framework for defining DOM based content filters and applying them to user
|
@@ -23,95 +14,93 @@ provided content. Read an introduction about this project in
|
|
23
14
|
- [Usage](#usage)
|
24
15
|
- [Examples](#examples)
|
25
16
|
- [Filters](#filters)
|
26
|
-
- [
|
17
|
+
- [Disabled Filters](#disabled-filters)
|
27
18
|
- [Documentation](#documentation)
|
28
19
|
- [Extending](#extending)
|
29
20
|
- [3rd Party Extensions](#3rd-party-extensions)
|
30
21
|
- [Instrumenting](#instrumenting)
|
31
22
|
- [Contributing](#contributing)
|
32
23
|
- [Contributors](#contributors)
|
33
|
-
- [Releasing A New Version](#releasing-a-new-version)
|
34
24
|
|
35
25
|
## Installation
|
36
26
|
|
37
27
|
Add this line to your application's Gemfile:
|
38
28
|
|
39
29
|
```ruby
|
40
|
-
gem 'html-pipeline'
|
30
|
+
gem 'motion-html-pipeline'
|
41
31
|
```
|
42
32
|
|
43
|
-
|
33
|
+
and to your `Rakefile`
|
44
34
|
|
45
|
-
```
|
46
|
-
|
35
|
+
```ruby
|
36
|
+
require 'motion-html-pipeline'
|
47
37
|
```
|
48
38
|
|
49
|
-
|
39
|
+
And then execute:
|
50
40
|
|
51
41
|
```sh
|
52
|
-
$
|
42
|
+
$ bundle
|
53
43
|
```
|
54
44
|
|
55
45
|
## Usage
|
56
46
|
|
57
|
-
This library provides a handful of
|
58
|
-
content into markup. A filter takes an HTML string or
|
59
|
-
`
|
47
|
+
This library provides a handful of chain-able HTML filters to transform user
|
48
|
+
content into markup. A filter takes an HTML string or a
|
49
|
+
`MotionHTMLPipeline::DocumentFragment`, optionally manipulates it, and then
|
60
50
|
outputs the result.
|
61
51
|
|
62
|
-
For example, to transform
|
52
|
+
For example, to transform an image URL into an image tag:
|
63
53
|
|
64
54
|
```ruby
|
65
|
-
|
66
|
-
|
67
|
-
filter = HTML::Pipeline::MarkdownFilter.new("Hi **world**!")
|
55
|
+
filter = MotionHTMLPipeline::Pipeline::ImageFilter.new("http://example.com/test.jpg")
|
68
56
|
filter.call
|
69
57
|
```
|
70
58
|
|
59
|
+
would output
|
60
|
+
|
61
|
+
```html
|
62
|
+
<img src="http://example.com/test.jpg" alt=""/>
|
63
|
+
```
|
64
|
+
|
71
65
|
Filters can be combined into a pipeline which causes each filter to hand its
|
72
66
|
output to the next filter's input. So if you wanted to have content be
|
73
|
-
filtered through
|
74
|
-
|
67
|
+
filtered through the `ImageFilter` and then wrap it in an `<a>` tag with
|
68
|
+
a max-width inline style:
|
75
69
|
|
76
70
|
```ruby
|
77
|
-
pipeline =
|
78
|
-
|
79
|
-
|
80
|
-
]
|
81
|
-
result = pipeline.call
|
82
|
-
This is *great*:
|
83
|
-
|
84
|
-
some_code(:first)
|
85
|
-
|
86
|
-
CODE
|
71
|
+
pipeline = MotionHTMLPipeline::Pipeline.new([
|
72
|
+
MotionHTMLPipeline::Pipeline::ImageFilter,
|
73
|
+
MotionHTMLPipeline::Pipeline::ImageMaxWidthFilter
|
74
|
+
])
|
75
|
+
result = pipeline.call("http://example.com/test.jpg")
|
87
76
|
result[:output].to_s
|
88
77
|
```
|
89
78
|
|
90
79
|
Prints:
|
91
80
|
|
92
81
|
```html
|
93
|
-
<
|
94
|
-
|
95
|
-
<pre><code>some_code(:first)
|
96
|
-
</code></pre>
|
82
|
+
<a href="http://example.com/test.jpg" target="_blank"><img src="http://example.com/test.jpg" alt="" style="max-width:100%;"></a>
|
97
83
|
```
|
98
84
|
|
99
|
-
To generate CSS for HTML formatted code, use the [Rouge CSS Theme](https://github.com/jneen/rouge#css-theme-options) `#css` method. `rouge` is a dependency of the `SyntaxHighlightFilter`.
|
100
|
-
|
101
85
|
Some filters take an optional **context** and/or **result** hash. These are
|
102
86
|
used to pass around arguments and metadata between filters in a pipeline. For
|
103
|
-
example,
|
104
|
-
|
87
|
+
example, with the `AbsoluteSourceFilter` you can pass in `:image_base_url` in
|
88
|
+
the context hash:
|
89
|
+
|
105
90
|
|
106
91
|
```ruby
|
107
|
-
filter =
|
92
|
+
filter = MotionHTMLPipeline::Pipeline::AbsoluteSourceFilter.new('<img src="/test.jpg">', image_base_url: 'http://example.com')
|
108
93
|
filter.call
|
109
94
|
```
|
110
95
|
|
111
96
|
### Examples
|
112
97
|
|
113
98
|
We define different pipelines for different parts of our app. Here are a few
|
114
|
-
paraphrased snippets to get you started
|
99
|
+
paraphrased snippets to get you started.
|
100
|
+
|
101
|
+
_Note: these are examples from the original
|
102
|
+
gem since they illustrate how the pipelines can be used. Many of the filters are
|
103
|
+
not currently usable yet, as mentioned in the Filters section below._
|
115
104
|
|
116
105
|
```ruby
|
117
106
|
# The context hash is how you pass options between different filters.
|
@@ -166,68 +155,51 @@ EmojiPipeline = Pipeline.new [
|
|
166
155
|
|
167
156
|
## Filters
|
168
157
|
|
169
|
-
* `MentionFilter` - replace `@user` mentions with links
|
170
158
|
* `AbsoluteSourceFilter` - replace relative image urls with fully qualified versions
|
159
|
+
* `HttpsFilter` - HTML Filter for replacing http github urls with https versions.
|
160
|
+
* `ImageMaxWidthFilter` - link to full size image for large images
|
161
|
+
|
162
|
+
### Disabled Filters
|
163
|
+
|
164
|
+
Several of the standard filters, such as `AutolinkFilter` and `EmojiFilter`, are initially disabled, as they rely on other Ruby gems that don't have RubyMotion equivalents. Please feel free to submit a pull request that enables any of them.
|
165
|
+
|
166
|
+
* `MentionFilter` - replace `@user` mentions with links
|
171
167
|
* `AutolinkFilter` - auto_linking urls in HTML
|
172
168
|
* `CamoFilter` - replace http image urls with [camo-fied](https://github.com/atmos/camo) https versions
|
173
169
|
* `EmailReplyFilter` - util filter for working with emails
|
174
170
|
* `EmojiFilter` - everyone loves [emoji](http://www.emoji-cheat-sheet.com/)!
|
175
|
-
* `HttpsFilter` - HTML Filter for replacing http github urls with https versions.
|
176
|
-
* `ImageMaxWidthFilter` - link to full size image for large images
|
177
171
|
* `MarkdownFilter` - convert markdown to html
|
178
172
|
* `PlainTextInputFilter` - html escape text and wrap the result in a div
|
179
173
|
* `SanitizationFilter` - whitelist sanitize user markup
|
180
174
|
* `SyntaxHighlightFilter` - code syntax highlighter
|
181
|
-
* `TextileFilter` - convert textile to html
|
182
175
|
* `TableOfContentsFilter` - anchor headings with name attributes and generate Table of Contents html unordered list linking headings
|
183
176
|
|
184
|
-
## Dependencies
|
185
|
-
|
186
|
-
Filter gem dependencies are not bundled; you must bundle the filter's gem
|
187
|
-
dependencies. The below list details filters with dependencies. For example,
|
188
|
-
`SyntaxHighlightFilter` uses [rouge](https://github.com/jneen/rouge)
|
189
|
-
to detect and highlight languages. For example, to use the `SyntaxHighlightFilter`,
|
190
|
-
add the following to your Gemfile:
|
191
|
-
|
192
|
-
```ruby
|
193
|
-
gem 'rouge'
|
194
|
-
```
|
195
|
-
|
196
|
-
* `AutolinkFilter` - `rinku`
|
197
|
-
* `EmailReplyFilter` - `escape_utils`, `email_reply_parser`
|
198
|
-
* `EmojiFilter` - `gemoji`
|
199
|
-
* `MarkdownFilter` - `commonmarker`
|
200
|
-
* `PlainTextInputFilter` - `escape_utils`
|
201
|
-
* `SanitizationFilter` - `sanitize`
|
202
|
-
* `SyntaxHighlightFilter` - `rouge`
|
203
|
-
* `TableOfContentsFilter` - `escape_utils`
|
204
|
-
* `TextileFilter` - `RedCloth`
|
205
|
-
|
206
|
-
_Note:_ See [Gemfile](/Gemfile) `:test` block for version requirements.
|
207
|
-
|
208
177
|
## Documentation
|
209
178
|
|
210
|
-
Full reference documentation can be [found here](http://rubydoc.info/gems/html-pipeline/frames).
|
179
|
+
Full reference documentation for the original `html-pipeline` gem can be [found here](http://rubydoc.info/gems/html-pipeline/frames).
|
211
180
|
|
212
181
|
## Extending
|
182
|
+
|
213
183
|
To write a custom filter, you need a class with a `call` method that inherits
|
214
|
-
from `
|
184
|
+
from `MotionHTMLPipeline::Pipeline::Filter`.
|
215
185
|
|
216
186
|
For example this filter adds a base url to images that are root relative:
|
217
187
|
|
218
188
|
```ruby
|
219
|
-
|
220
|
-
|
221
|
-
class RootRelativeFilter < HTML::Pipeline::Filter
|
189
|
+
class RootRelativeFilter < MotionHTMLPipeline::Pipeline::Filter
|
222
190
|
|
223
191
|
def call
|
224
|
-
doc.
|
192
|
+
doc.css("img").each do |img|
|
225
193
|
next if img['src'].nil?
|
194
|
+
|
226
195
|
src = img['src'].strip
|
196
|
+
|
227
197
|
if src.start_with? '/'
|
228
|
-
|
198
|
+
base_url = NSURL.URLWithString(context[:base_url])
|
199
|
+
img["src"] = NSURL.URLWithString(src, relativeToURL: base_url).absoluteString
|
229
200
|
end
|
230
201
|
end
|
202
|
+
|
231
203
|
doc
|
232
204
|
end
|
233
205
|
|
@@ -237,15 +209,14 @@ end
|
|
237
209
|
Now this filter can be used in a pipeline:
|
238
210
|
|
239
211
|
```ruby
|
240
|
-
Pipeline.new [ RootRelativeFilter ], { :
|
212
|
+
Pipeline.new [ RootRelativeFilter ], { base_url: 'http://somehost.com' }
|
241
213
|
```
|
242
214
|
|
215
|
+
We use [HTMLKit](https://github.com/iabudiab/HTMLKit) for document parsing in `MotionHTMLPipeline::DocumentFragment`.
|
216
|
+
|
243
217
|
### 3rd Party Extensions
|
244
218
|
|
245
|
-
|
246
|
-
[an issue](https://github.com/jch/html-pipeline/issues) first. This allows us discuss
|
247
|
-
whether the filter is a common enough use case to belong in this gem, or should be
|
248
|
-
built as an external gem.
|
219
|
+
Many people have built their own filters for [html-pipeline](https://github.com/jch/html-pipeline/issues). Although these have not been converted to run with RubyMotion, most of them should be easy convert.
|
249
220
|
|
250
221
|
Here are some extensions people have built:
|
251
222
|
|
@@ -271,22 +242,25 @@ Here are some extensions people have built:
|
|
271
242
|
|
272
243
|
## Instrumenting
|
273
244
|
|
245
|
+
_Although instrumenting was ported, it has not been used real-world, and may not work
|
246
|
+
properly at this time._
|
247
|
+
|
274
248
|
Filters and Pipelines can be set up to be instrumented when called. The pipeline
|
275
249
|
must be setup with an
|
276
250
|
[ActiveSupport::Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html)
|
277
251
|
compatible service object and a name. New pipeline objects will default to the
|
278
|
-
`
|
252
|
+
`MotionHTMLPipeline::Pipeline.default_instrumentation_service` object.
|
279
253
|
|
280
254
|
``` ruby
|
281
255
|
# the AS::Notifications-compatible service object
|
282
256
|
service = ActiveSupport::Notifications
|
283
257
|
|
284
258
|
# instrument a specific pipeline
|
285
|
-
pipeline =
|
259
|
+
pipeline = MotionHTMLPipeline::Pipeline.new [MarkdownFilter], context
|
286
260
|
pipeline.setup_instrumentation "MarkdownPipeline", service
|
287
261
|
|
288
262
|
# or set default instrumentation service for all new pipelines
|
289
|
-
|
263
|
+
MotionHTMLPipeline::Pipeline.default_instrumentation_service = service
|
290
264
|
pipeline = HTML::Pipeline.new [MarkdownFilter], context
|
291
265
|
pipeline.setup_instrumentation "MarkdownPipeline"
|
292
266
|
```
|
@@ -321,6 +295,8 @@ end
|
|
321
295
|
|
322
296
|
## FAQ
|
323
297
|
|
298
|
+
_I have left this FAQ item here for when we get the `PlainTextInputFilter` working._
|
299
|
+
|
324
300
|
### 1. Why doesn't my pipeline work when there's no root element in the document?
|
325
301
|
|
326
302
|
To make a pipeline work on a plain text document, put the `PlainTextInputFilter`
|
@@ -342,38 +318,8 @@ html_fragment = "This is outside of an html element, but <strong>this isn't. :+1
|
|
342
318
|
EmojiPipeline.call("<div>#{html_fragment}</div>") # <- Wrap your own html fragments to avoid escaping
|
343
319
|
```
|
344
320
|
|
345
|
-
### 2. How do I customize a whitelist for `SanitizationFilter`s?
|
346
|
-
|
347
|
-
`SanitizationFilter::WHITELIST` is the default whitelist used if no `:whitelist`
|
348
|
-
argument is given in the context. The default is a good starting template for
|
349
|
-
you to add additional elements. You can either modify the constant's value, or
|
350
|
-
re-define your own constant and pass that in via the context.
|
351
|
-
|
352
321
|
## Contributing
|
353
322
|
|
354
|
-
Please review the [Contributing Guide](https://github.com/jch/html-pipeline/blob/master/CONTRIBUTING.md).
|
355
|
-
|
356
|
-
1. [Fork it](https://help.github.com/articles/fork-a-repo)
|
357
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
358
|
-
3. Commit your changes (`git commit -am 'Added some feature'`)
|
359
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
360
|
-
5. Create new [Pull Request](https://help.github.com/articles/using-pull-requests)
|
361
|
-
|
362
|
-
To see what has changed in recent versions, see the [CHANGELOG](https://github.com/jch/html-pipeline/blob/master/CHANGELOG.md).
|
363
|
-
|
364
323
|
### Contributors
|
365
324
|
|
366
|
-
Thanks to all of [these contributors](https://github.com/jch/html-pipeline/graphs/contributors).
|
367
|
-
|
368
|
-
Project is a member of the [OSS Manifesto](http://ossmanifesto.org/).
|
369
|
-
|
370
|
-
### Releasing A New Version
|
371
|
-
|
372
|
-
This section is for gem maintainers to cut a new version of the gem.
|
373
|
-
|
374
|
-
* create a new branch named `release-x.y.z` where `x.y.z` follows [semver](http://semver.org)
|
375
|
-
* update lib/html/pipeline/version.rb to next version number X.X.X
|
376
|
-
* update CHANGELOG.md. Prepare a draft with `script/changelog`
|
377
|
-
* push branch and create a new pull request
|
378
|
-
* after tests are green, merge to master
|
379
|
-
* on the master branch, run `script/release`
|
325
|
+
Thanks to all of [these contributors](https://github.com/jch/html-pipeline/graphs/contributors), who have made the original gem possible.
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# Not meant to duplicate Nokogiri completely, just add a similar interface
|
5
5
|
#------------------------------------------------------------------------------
|
6
6
|
module MotionHTMLPipeline
|
7
|
-
class DocumentFragment
|
7
|
+
class DocumentFragment
|
8
8
|
attr_reader :document
|
9
9
|
|
10
10
|
def self.parse(html)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion-html-pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Tomayko
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2019-07-
|
14
|
+
date: 2019-07-16 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: motion-cocoapods
|