hitomalu_formatter 0.1.3 → 0.1.6

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
  SHA256:
3
- metadata.gz: '04239c9c7d366f97db31ee7a67a15936ad16fe3900d0816b32409b9b6d944dec'
4
- data.tar.gz: 6a26df5123e66d197952a98c30e1179a2d2c9c5620d07d1c5916aaddda9afd50
3
+ metadata.gz: 8d057802ad94435771493393f773043cbd9a36d6f61c6a0d28cced13ab87c0c4
4
+ data.tar.gz: 373d05bc1ebf63133106f0212f2f2473ad313383360c26af44a0cb233ca2d1c5
5
5
  SHA512:
6
- metadata.gz: b2999cc3946c94771090f582c649359fac349209fe5aa953173767f9ab1235ec366c4b5dcb6c8d6432411527694970aae15663a749a8358c5f8e90d4a9a57e2b
7
- data.tar.gz: bc946c6f1cea4481ca105cd42dc6cef6993baaa64d76e1b58e9a9644fb5f1a9effb1dbf40a527a11f5c9f386f427e5bde117523b57ce2006ec96dcd30be531d7
6
+ metadata.gz: ed90413307ccbd96dd5167db30d96768332b63f8feb9e19cbfdd5c179c24ccc13ab4c1b0db34616d607a94ff90875f5c0e2fe52f3a793e9566a6132ed03c4108
7
+ data.tar.gz: debadd8eeca99009687f43892aa7cc995e5c771e791483ee3e7b62517813bc8ddeb8b710157bcbc44281905fb9447dc4280c36c82d446c3ae7b7ba0af5b89aa8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.6] - 2022-08-26
4
+ ## [0.1.5] - 2022-08-16
5
+ ## [0.1.4] - 2022-08-16
3
6
  ## [0.1.3] - 2022-08-04
4
7
  ## [0.1.2] - 2022-08-03
5
8
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hitomalu_formatter (0.1.3)
4
+ hitomalu_formatter (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -7,9 +7,15 @@ module Hitomalu
7
7
  # cf. https://developer.mozilla.org/ja/docs/Web/HTML/Inline_elements
8
8
  # rp と rt は上に記載がないが、改行させたくないので追加
9
9
  # node.name が 'comment' であるコメントノードもインライン扱い
10
- INLINE_TAGS = [ 'a', 'abbr', 'acronym', 'audio', 'b', 'bdi', 'bdo', 'big', 'br', 'button', 'canvas', 'cite', 'code', 'comment', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'mark', 'meter', 'noscript', 'object', 'output', 'picture', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'select', 'slot', 'small', 'span', 'strong', 'sub', 'sup', 'svg', 'template', 'textarea', 'time', 'u', 'tt', 'var', 'video', 'wbr' ]
10
+ INLINE_TAGS = [ 'a', 'abbr', 'acronym', 'audio', 'b', 'bdi', 'bdo', 'big', 'br', 'button', 'canvas', 'cite', 'code', 'comment', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'label', 'map', 'mark', 'meter', 'nobr', 'noscript', 'object', 'output', 'picture', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'select', 'slot', 'small', 'span', 'strong', 'sub', 'sup', 'svg', 'template', 'text', 'textarea', 'time', 'u', 'tt', 'var', 'video', 'wbr' ]
11
11
  INLINE_TAGS_REGEXP = INLINE_TAGS.join('|')
12
12
 
13
+ ADD_BREAK_LINE_TAGS = [ 'br', 'hr', 'col' ]
14
+ ADD_BREAK_LINE_TAGS_REGEXP = ADD_BREAK_LINE_TAGS.join('|')
15
+
16
+ # フォーマットで改行が増えないタグ (改行が増えるタグで改行増殖を抑えるために使う)
17
+ BREAK_LINE_NOT_INCREASE_TAGS = INLINE_TAGS - ADD_BREAK_LINE_TAGS
18
+
13
19
  def self.format(html)
14
20
  # 改行コード \n を \r\n に統一しておく
15
21
  html = html.gsub(/(?<!\r)\n/, "\r\n")
@@ -23,17 +29,29 @@ module Hitomalu
23
29
  body = doc.at_css('body')
24
30
 
25
31
  body.traverse { |node|
32
+ # テキストノードが空白文字以外を含み、親が非インライン要素(=ブロックノード)でもpreでもないならば中身の先頭と最後のスペースを消す
33
+ # (親のブロック要素に接しているところ = 兄弟がいない方向のみ)
34
+ if node.instance_of?(Nokogiri::XML::Text) && /\S/.match(node.content) && !(INLINE_TAGS + CONTENT_NO_MODIFY_TAGS).include?(node.parent.name)
35
+ if node.previous_sibling.nil?
36
+ node.content = node.content.gsub(/(\A\s+)/, "")
37
+ end
38
+ if node.next_sibling.nil?
39
+ node.content = node.content.gsub(/(\s+\Z)/, "")
40
+ end
41
+ end
42
+
43
+
26
44
  # 中身がないと、li などの閉じタグ省略可能なタグについてNokogiriが閉じタグ省略を行い、整形をかけるたびに閉じタグがついたりなくなったりするので、
27
45
  # 中身がないかスペースだけの場合、仮文字列にして最後に空文字列に置換する
28
- # ただし、 <img src="1.jpg"> <img src="2.jpg"> のようなインライン要素の間のスペースと改行は保持する必要があるので保持する。
29
46
  # <li></li> の中に |mykaramojiretsu| を入れるために + ではなく * が必要
30
- if /\A[ ]*\Z/.match?(node.content) && (node.previous_sibling.nil? || !INLINE_TAGS.include?(node.previous_sibling.name))
31
- node.content = "|mykaramojiretsu|"
47
+ if /\A[ ]*\Z/.match?(node.content)
48
+ node.content = node.content + "|mykaramojiretsu|"
32
49
  end
33
50
 
34
51
  # インライン要素は、ブロック内先頭やテキストノードやインライン要素の次では改行しない
35
52
  # (前がブロック要素の終わりやコメントノードだと改行する)
36
- if INLINE_TAGS.include?(node.name) && (node.previous_sibling.nil? || (node.previous_sibling.instance_of?(Nokogiri::XML::Text) || INLINE_TAGS.include?(node.previous_sibling.name)))
53
+ # (前が最後に改行を足すタグの場合、|nobreakline| を足すとスペースが増えて、フォーマットをかける度に結果が変わるので、|nobreakline| を足しません)
54
+ if INLINE_TAGS.include?(node.name) && (node.previous_sibling.nil? || (INLINE_TAGS.include?(node.previous_sibling.name) && !ADD_BREAK_LINE_TAGS.include?(node.previous_sibling.name)))
37
55
  node.add_previous_sibling("|nobreakline|")
38
56
  end
39
57
 
@@ -51,13 +69,28 @@ module Hitomalu
51
69
  end
52
70
 
53
71
  # </span>\n</div> を </span>\n</div> のままにしたいが、Nokogiri は閉じタグ間の\nを消すので一旦 |mykaigyo| にする (整形を2回かけた時用)
54
- if node.instance_of?(Nokogiri::XML::Element) && !node.next_sibling.nil? && /\A\s*(\n|\r\n)\s*\Z/.match?(node.next_sibling.content) && node.next_sibling.next_sibling.nil?
72
+ if node.instance_of?(Nokogiri::XML::Element) && !node.next_sibling.nil? && /\A\s*(\n|\r\n)\s*\Z/.match?(node.next_sibling.to_s) && node.next_sibling.next_sibling.nil?
55
73
  node.next_sibling.content = "|mykaigyo|"
56
74
  end
57
75
 
76
+ # この下の処理で先頭改行をスペースに置換している & ブロック要素閉じタグの後には改行を入れる処理の関係上、
77
+ # </summary>\r\nnakami のような ブロック要素閉じタグ直後に改行が来ている場合、スペースが増殖してしまう (= 2回フォーマットをかけると結果が変わってしまう)
78
+ # それを防ぐため、ブロック要素閉じタグ直後の場合は先頭の改行を削除する
79
+ if node.instance_of?(Nokogiri::XML::Text) && !node.previous_sibling.nil? && !BREAK_LINE_NOT_INCREASE_TAGS.include?(node.previous_sibling.name) && !CONTENT_NO_MODIFY_TAGS.include?(node.parent.name)
80
+ node.content = node.content.gsub(/\A *(\r\n|\n)*/, "")
81
+ end
82
+
83
+ # 上の事を、直後がブロック要素開始タグの場合にも末尾の改行についてする
84
+ if node.instance_of?(Nokogiri::XML::Text) && !node.next_sibling.nil? && !BREAK_LINE_NOT_INCREASE_TAGS.include?(node.next_sibling.name) && !CONTENT_NO_MODIFY_TAGS.include?(node.parent.name)
85
+ node.content = node.content.gsub(/ *(\r\n|\n)*\Z/, "")
86
+ end
87
+
58
88
  # タグの中身を整形する(見やすくするため)
59
- if node.instance_of?(Nokogiri::XML::Text) && !CONTENT_NO_MODIFY_TAGS.include?(node.parent.name)
60
- node.content = node.content.strip.gsub(/\s{2,}/, " ")
89
+ # 英文など、スペースが重要な言語があるので、stripはしない (Hello <a href="#world">world</a> のような文でスペースが、stripで無くなってしまう)
90
+ # \r\n 2文字で1つのもの扱いにするため \s ではなく () で列挙している
91
+ # 連続する改行・スペースをスペース1つにし、先頭と最後の改行・スペースを除去し、文中の改行を除去する
92
+ if node.instance_of?(Nokogiri::XML::Text) && (CONTENT_NO_MODIFY_TAGS & node.ancestors.map do |ancestor| ancestor.name end).empty?
93
+ node.content = node.content.gsub(/(\r\n|\n| |\t|\f){2,}/, " ").gsub(/(\A ?(\r\n|\n) ?| ?(\r\n|\n) ?\Z)/, " ").gsub("\r\n", " ")
61
94
  end
62
95
 
63
96
  # 閉じタグとテキストノードの間に改行がなければ入れる(見やすくするため)
@@ -83,10 +116,11 @@ module Hitomalu
83
116
 
84
117
  # 開始タグの前に改行がなければ改行を入れる (add_prev_sibling は重いので文字列処理でやる) (文章の先頭からは消す)
85
118
  # その後、使い終わった改行しない印を消す
86
- body_str = body_str.gsub(/(?<!\r\n)(?<!\|nobreakline\|)(?<!\|nobreakline\| )<(?!\/)/, "\r\n<").gsub(/(\A\r\n|\|nobreakline\|)/, "")
119
+ # また、閉じタグしか無い行の先頭のスペースを消す (閉じタグで改行されるのはブロック要素の閉じタグだけであるため、pre以外ならスペースを消して問題ない)
120
+ body_str = body_str.gsub(/(?<!\r\n)(?<!\|nobreakline\|)(?<!\|nobreakline\| )<(?!\/)/, "\r\n<").gsub(/(\A\r\n|\|nobreakline\|)/, "").gsub(/^ *(?!<\/pre>)(<\/[a-z]+>)$/, "\\1")
87
121
 
88
122
  # <br> や <hr> や <col> の後ろに改行がなければ改行を入れる (add_next_sibling は重いので文字列処理でやる)
89
- body_str = body_str.gsub(/(<(?:br|hr|col)>)(?!\r\n)/, "\\1\r\n")
123
+ body_str = body_str.gsub(/(<(?:#{ADD_BREAK_LINE_TAGS_REGEXP})>)(?!\r\n)/, "\\1\r\n")
90
124
  end
91
125
  end
92
126
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HitomaluFormatter
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.6"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hitomalu_formatter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - t-hazawa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-04 00:00:00.000000000 Z
11
+ date: 2022-08-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email: []