html-pipeline 2.0 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81ea1429ab17d2b994718b0332f25cca4587258e
4
- data.tar.gz: 1e88eb99b9689beaa37be9f07dd337b587e7f6de
3
+ metadata.gz: ef883e1a02e6690f3f708437f0750d38be6e26a7
4
+ data.tar.gz: c821156250cf94cbbf7a5d219bb6d10b3df77dbf
5
5
  SHA512:
6
- metadata.gz: 53dcb279bc816247b352642d0037dfdf7200622f8ec81e0f4e7e2f16f93dfb1131a159274cac6cd37822b6b9486f4160d20e78ec439a4a3a4731d10da23b60a7
7
- data.tar.gz: 435e84847668fac1e7f8ea78e6dac82b7e646885523440ce57dc19e711e69875a1b2b0eca5aade300dbbefe0a5c064f4af66a7dbaa5af1d48a0ad1f9ba5b1d7d
6
+ metadata.gz: 066dbba5d1a4c96b94a4eab74f0e6e1f81156362e05dec76e1b798489a8bdfb87db150bbe093b4c9e11cddc791a483d1bfbcc3ef2d0e43dec4df6f8d96b57f2c
7
+ data.tar.gz: 14e260bd46d314003cfd680d87f59660b584911e6646890a437afdfcf5e384f25bc06004d681886d3ae249ef3ff20ed8ddfc377e86ec5bfc0a4a5f585993d17a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.1.0
4
+
5
+ * Whitelist schemes for longdesc [#221](https://github.com/jch/html-pipeline/pull/221)
6
+ * Extract emoji image tag generation to own method [#195](https://github.com/jch/html-pipeline/pull/195)
7
+ * Update README.md [#211](https://github.com/jch/html-pipeline/pull/211)
8
+ * Add ImageFilter for image url to img tag conversion [#207](https://github.com/jch/html-pipeline/pull/207)
9
+
3
10
  ## 2.0
4
11
 
5
12
  **New**
data/README.md CHANGED
@@ -245,6 +245,9 @@ Here are some extensions people have built:
245
245
  * [html-pipeline-rouge_filter](https://github.com/JuanitoFatas/html-pipeline-rouge_filter) - Syntax highlight with [Rouge](https://github.com/jneen/rouge/)
246
246
  * [html-pipeline-nico_link](https://github.com/rutan/html-pipeline-nico_link) - An HTML::Pipeline filter for [niconico](http://www.nicovideo.jp) description links
247
247
  * [html-pipeline-gitlab](https://gitlab.com/gitlab-org/html-pipeline-gitlab) - This gem implements various filters for html-pipeline used by GitLab
248
+ * [html-pipeline-youtube](https://github.com/st0012/html-pipeline-youtube) - An HTML::Pipeline filter for YouTube links
249
+ * [html-pipeline-flickr](https://github.com/st0012/html-pipeline-flickr) - An HTML::Pipeline filter for Flickr links
250
+ * [html-pipeline-vimeo](https://github.com/dlackty/html-pipeline-vimeo) - An HTML::Pipeline filter for Vimeo links
248
251
 
249
252
  ## Instrumenting
250
253
 
data/lib/html/pipeline.rb CHANGED
@@ -32,6 +32,7 @@ module HTML
32
32
  autoload :EmailReplyFilter, 'html/pipeline/email_reply_filter'
33
33
  autoload :EmojiFilter, 'html/pipeline/emoji_filter'
34
34
  autoload :HttpsFilter, 'html/pipeline/https_filter'
35
+ autoload :ImageFilter, 'html/pipeline/image_filter'
35
36
  autoload :ImageMaxWidthFilter, 'html/pipeline/image_max_width_filter'
36
37
  autoload :MarkdownFilter, 'html/pipeline/markdown_filter'
37
38
  autoload :MentionFilter, 'html/pipeline/@mention_filter'
@@ -43,8 +43,7 @@ module HTML
43
43
  # Returns a String with :emoji: replaced with images.
44
44
  def emoji_image_filter(text)
45
45
  text.gsub(emoji_pattern) do |match|
46
- name = $1
47
- "<img class='emoji' title=':#{name}:' alt=':#{name}:' src='#{emoji_url(name)}' height='20' width='20' align='absmiddle' />"
46
+ emoji_image_tag($1)
48
47
  end
49
48
  end
50
49
 
@@ -70,6 +69,11 @@ module HTML
70
69
 
71
70
  private
72
71
 
72
+ # Build an emoji image tag
73
+ def emoji_image_tag(name)
74
+ "<img class='emoji' title=':#{name}:' alt=':#{name}:' src='#{emoji_url(name)}' height='20' width='20' align='absmiddle' />"
75
+ end
76
+
73
77
  def emoji_url(name)
74
78
  File.join(asset_root, asset_path(name))
75
79
  end
@@ -0,0 +1,17 @@
1
+ module HTML
2
+ class Pipeline
3
+ # HTML Filter that converts image's url into <img> tag.
4
+ # For example, it will convert
5
+ # http://example.com/test.jpg
6
+ # into
7
+ # <img src="http://example.com/test.jpg" alt=""/>.
8
+
9
+ class ImageFilter < TextFilter
10
+ def call
11
+ @text.gsub(/(https|http)?:\/\/.+\.(jpg|jpeg|bmp|gif|png)(\?\S+)?/i) do |match|
12
+ %|<img src="#{match}" alt=""/>|
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -50,7 +50,7 @@ module HTML
50
50
  :remove_contents => ['script'],
51
51
  :attributes => {
52
52
  'a' => ['href'],
53
- 'img' => ['src'],
53
+ 'img' => ['src', 'longdesc'],
54
54
  'div' => ['itemscope', 'itemtype'],
55
55
  :all => ['abbr', 'accept', 'accept-charset',
56
56
  'accesskey', 'action', 'align', 'alt', 'axis',
@@ -61,7 +61,7 @@ module HTML
61
61
  'disabled', 'enctype', 'for', 'frame',
62
62
  'headers', 'height', 'hreflang',
63
63
  'hspace', 'ismap', 'label', 'lang',
64
- 'longdesc', 'maxlength', 'media', 'method',
64
+ 'maxlength', 'media', 'method',
65
65
  'multiple', 'name', 'nohref', 'noshade',
66
66
  'nowrap', 'open', 'prompt', 'readonly', 'rel', 'rev',
67
67
  'rows', 'rowspan', 'rules', 'scope',
@@ -72,7 +72,10 @@ module HTML
72
72
  },
73
73
  :protocols => {
74
74
  'a' => {'href' => ANCHOR_SCHEMES},
75
- 'img' => {'src' => ['http', 'https', :relative]}
75
+ 'img' => {
76
+ 'src' => ['http', 'https', :relative],
77
+ 'longdesc' => ['http', 'https', :relative]
78
+ }
76
79
  },
77
80
  :transformers => [
78
81
  # Top-level <li> elements are removed because they can break out of
@@ -1,5 +1,5 @@
1
1
  module HTML
2
2
  class Pipeline
3
- VERSION = "2.0"
3
+ VERSION = "2.1.0"
4
4
  end
5
5
  end
data/script/changelog CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env sh
1
+ #!/bin/bash
2
2
  # Usage: script/changelog [-r <repo>] [-b <base>] [-h <head>]
3
3
  #
4
4
  # repo: base string of GitHub repository url. e.g. "user_or_org/repository". Defaults to git remote url.
@@ -8,23 +8,40 @@
8
8
  # Generate a changelog preview from pull requests merged between `base` and
9
9
  # `head`.
10
10
  #
11
- # https://github.com/jch/release-scripts
11
+ # https://github.com/jch/release-scripts/blob/master/changelog
12
12
  set -e
13
13
 
14
14
  [ $# -eq 0 ] && set -- --help
15
+ while [[ $# > 1 ]]
16
+ do
17
+ key="$1"
18
+ case $key in
19
+ -r|--repo)
20
+ repo="$2"
21
+ shift
22
+ ;;
23
+ -b|--base)
24
+ base="$2"
25
+ shift
26
+ ;;
27
+ -h|--head)
28
+ head="$2"
29
+ shift
30
+ ;;
31
+ *)
32
+ ;;
33
+ esac
34
+ shift
35
+ done
15
36
 
16
- # parse args
17
- repo='jch/html-pipeline'
18
- base=$(git tag -l | sort -t. -k 1,1n -k 2,2n -k 3,3n | tail -n 1)
19
- head="HEAD"
37
+ repo="${repo:-$(git remote -v | grep push | awk '{print $2}' | cut -d'/' -f4- | sed 's/\.git//')}"
38
+ base="${base:-$(git tag -l | sort -t. -k 1,1n -k 2,2n -k 3,3n | tail -n 1)}"
39
+ head="${head:-HEAD}"
20
40
  api_url="https://api.github.com"
21
41
 
22
- echo "# $repo $base..$head"
23
- echo
24
-
25
42
  # get merged PR's. Better way is to query the API for these, but this is easier
26
43
  for pr in $(git log --oneline $base..$head | grep "Merge pull request" | awk '{gsub("#",""); print $5}')
27
44
  do
28
45
  # frustrated with trying to pull out the right values, fell back to ruby
29
- curl -s "$api_url/repos/$repo/pulls/$pr" | ruby -rjson -e 'pr=JSON.parse(STDIN.read); puts "* #{pr[%q(title)]} [##{pr[%q(number)]}](#{pr[%q(html_url)]}) @#{pr[%q(user)][%q(login)]}"'
46
+ curl -s "$api_url/repos/$repo/pulls/$pr" | ruby -rjson -e 'pr=JSON.parse(STDIN.read); puts "* #{pr[%q(title)]} [##{pr[%q(number)]}](#{pr[%q(html_url)]})"'
30
47
  done
@@ -0,0 +1,39 @@
1
+ require "test_helper"
2
+
3
+ ImageFilter = HTML::Pipeline::ImageFilter
4
+
5
+ class HTML::Pipeline::ImageFilterTest < Minitest::Test
6
+ def filter(html)
7
+ ImageFilter.to_html(html)
8
+ end
9
+
10
+ def test_jpg
11
+ assert_equal %(<img src="http://example.com/test.jpg" alt=""/>),
12
+ filter(%(http://example.com/test.jpg))
13
+ end
14
+
15
+ def test_jpeg
16
+ assert_equal %(<img src="http://example.com/test.jpeg" alt=""/>),
17
+ filter(%(http://example.com/test.jpeg))
18
+ end
19
+
20
+ def test_bmp
21
+ assert_equal %(<img src="http://example.com/test.bmp" alt=""/>),
22
+ filter(%(http://example.com/test.bmp))
23
+ end
24
+
25
+ def test_gif
26
+ assert_equal %(<img src="http://example.com/test.gif" alt=""/>),
27
+ filter(%(http://example.com/test.gif))
28
+ end
29
+
30
+ def test_png
31
+ assert_equal %(<img src="http://example.com/test.png" alt=""/>),
32
+ filter(%(http://example.com/test.png))
33
+ end
34
+
35
+ def test_https_url
36
+ assert_equal %(<img src="https://example.com/test.png" alt=""/>),
37
+ filter(%(https://example.com/test.png))
38
+ end
39
+ end
@@ -51,6 +51,18 @@ class HTML::Pipeline::SanitizationFilterTest < Minitest::Test
51
51
  assert_equal '<a>Wat</a> is this', html
52
52
  end
53
53
 
54
+ def test_whitelisted_longdesc_schemes_are_allowed
55
+ stuff = '<img src="./foo.jpg" longdesc="http://longdesc.com">'
56
+ html = SanitizationFilter.call(stuff).to_s
57
+ assert_equal '<img src="./foo.jpg" longdesc="http://longdesc.com">', html
58
+ end
59
+
60
+ def test_weird_longdesc_schemes_are_removed
61
+ stuff = '<img src="./foo.jpg" longdesc="javascript:alert(1)">'
62
+ html = SanitizationFilter.call(stuff).to_s
63
+ assert_equal '<img src="./foo.jpg">', html
64
+ end
65
+
54
66
  def test_standard_schemes_are_removed_if_not_specified_in_anchor_schemes
55
67
  stuff = '<a href="http://www.example.com/">No href for you</a>'
56
68
  filter = SanitizationFilter.new(stuff, {:anchor_schemes => []})
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html-pipeline
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.0'
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Tomayko
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-20 00:00:00.000000000 Z
12
+ date: 2015-09-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -79,6 +79,7 @@ files:
79
79
  - lib/html/pipeline/emoji_filter.rb
80
80
  - lib/html/pipeline/filter.rb
81
81
  - lib/html/pipeline/https_filter.rb
82
+ - lib/html/pipeline/image_filter.rb
82
83
  - lib/html/pipeline/image_max_width_filter.rb
83
84
  - lib/html/pipeline/markdown_filter.rb
84
85
  - lib/html/pipeline/plain_text_input_filter.rb
@@ -97,6 +98,7 @@ files:
97
98
  - test/html/pipeline/camo_filter_test.rb
98
99
  - test/html/pipeline/emoji_filter_test.rb
99
100
  - test/html/pipeline/https_filter_test.rb
101
+ - test/html/pipeline/image_filter_test.rb
100
102
  - test/html/pipeline/image_max_width_filter_test.rb
101
103
  - test/html/pipeline/markdown_filter_test.rb
102
104
  - test/html/pipeline/mention_filter_test.rb
@@ -132,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
134
  version: '0'
133
135
  requirements: []
134
136
  rubyforge_project:
135
- rubygems_version: 2.0.14
137
+ rubygems_version: 2.2.3
136
138
  signing_key:
137
139
  specification_version: 4
138
140
  summary: Helpers for processing content through a chain of filters
@@ -143,6 +145,7 @@ test_files:
143
145
  - test/html/pipeline/camo_filter_test.rb
144
146
  - test/html/pipeline/emoji_filter_test.rb
145
147
  - test/html/pipeline/https_filter_test.rb
148
+ - test/html/pipeline/image_filter_test.rb
146
149
  - test/html/pipeline/image_max_width_filter_test.rb
147
150
  - test/html/pipeline/markdown_filter_test.rb
148
151
  - test/html/pipeline/mention_filter_test.rb