opml2html 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86f8b4072a12bf95e2bc5432d08f89810703425938d2ad537a3e0460eb34972a
4
- data.tar.gz: cd58c06735451231cd56708c0cc144e27737573b24d363d57ec45f10fdfec8e5
3
+ metadata.gz: 8e0131ae0abb115a15cafbf60050e6ee4fff9acd3a84d00d35b0d742f4bccdb2
4
+ data.tar.gz: 6d6581e206aa9a10a6b7136bf92256db3a554ec21f5c29123250d383b2337edf
5
5
  SHA512:
6
- metadata.gz: 50da65a32f37b59868dec3c76514a5e826c2533045fd4b1cfd8c517bc33ec17046160339296dca5e55cd20af7ec3756f89f43bb5b121196cdb0999138578e182
7
- data.tar.gz: 6008a560211d1253f7c34947cba17658b44561fe98cacd7b5f404f0791d818d12c2d0b30469f58b7af7f95c127524f38f0af4b1bdacc112aed6b17b715ab81f4
6
+ metadata.gz: 6c51c90e04f57ae7e3b7c0193e51a38dd3c4cc697b211c4bc891c238085484c3eeb7b5aa60a77f787c5351edcd29a1dc08b62c4423282393601b78b8da8275c4
7
+ data.tar.gz: a9ab4adccc8fcfafb04b4c562fe65fa11d62defc0a51e96a1f0ca22a54b448cab06d110d960eaeffdf0db7b6a331acb6cbf846eb8994471a2f582099322defbe
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.0.3 - 2025-02-07
6
+
7
+ * Render description for each outlines.
8
+ * Fix outline without XML URI attribute.
9
+
10
+ ## 0.0.2 - 2025-02-05
11
+
12
+ * Render XML URI hyperlinks.
13
+ * Add more head elements for metadata; owner email and docs.
14
+
5
15
  ## 0.0.1 - 2025-01-05
6
16
 
7
17
  * Initial release
@@ -0,0 +1,78 @@
1
+ module OPML2HTML
2
+ class Outline
3
+ def initialize(node)
4
+ node => Element[name: "outline"]
5
+ @node = node
6
+ end
7
+
8
+ def deconstruct_keys(*keys)
9
+ result = {}
10
+ keys => [keys]
11
+ keys.each do |key|
12
+ case key
13
+ in :text
14
+ result[:text] = (text or next)
15
+ in :created
16
+ result[:created] = (created or next)
17
+ in :children
18
+ result[:children] = (children or next)
19
+ in :xml_url
20
+ result[:xml_url] = (xml_url or next)
21
+ in :description
22
+ result[:description] = description
23
+ end
24
+ end
25
+ result
26
+ end
27
+
28
+ private
29
+
30
+ def text
31
+ @text and return @text
32
+ attributes => [*, Attr[name: "text", value:], *]
33
+ @text = value
34
+ end
35
+
36
+ def created
37
+ @created || @empty_created and return @created
38
+ if attributes in [*, Attr[name: "created", value:], *]
39
+ @created = value
40
+ else
41
+ @empty_created = true
42
+ return
43
+ end
44
+ end
45
+
46
+ def xml_url
47
+ @xml_url || @empty_xml_url and return @xml_url
48
+ if attributes in [*, Attr[name: "xmlUrl", value:], *]
49
+ @xml_url = value
50
+ else
51
+ @empty_xml_url = true
52
+ return
53
+ end
54
+ end
55
+
56
+ def description
57
+ @description || @empty_description and return @description
58
+ if attributes in [*, Attr[name: "description", value:], *]
59
+ @description = value
60
+ else
61
+ @empty_description = true
62
+ return
63
+ end
64
+ end
65
+
66
+ def attributes
67
+ @attributes and return @attributes
68
+ @node => Element[attributes:]
69
+ @attributes = attributes
70
+ end
71
+
72
+ def children
73
+ @children and return @children
74
+ @node => Element[children:]
75
+ @children = children
76
+ end
77
+ end
78
+ end
@@ -31,15 +31,26 @@ module OPML2HTML
31
31
  @document.metadata.add_child("modified: #{time}<br/>")
32
32
  end
33
33
 
34
+ def head_owner_email(content)
35
+ @document.metadata.add_child("owner email: #{content}")
36
+ end
37
+
38
+ def head_docs(*); end
39
+
34
40
  def head_end
35
41
  @document.head.add_child("<link rel=\"stylesheet\" href=\"#{ @css }\"/>")
36
42
  @document.main.add_child(@document.metadata)
37
43
  end
38
44
 
39
- def body_outline_heading(value)
40
- heading = @document.create_element("h2")
45
+ def body_outline_heading(value, description:, level:)
46
+ heading = @document.create_element("h#{level + 1}")
41
47
  heading.add_child(value)
42
48
  @document.main.add_child(heading)
49
+ if description
50
+ desc = @document.create_element("p")
51
+ desc.content = description
52
+ @document.main.add_child(desc)
53
+ end
43
54
  end
44
55
 
45
56
  def body_outline_text(value)
@@ -48,6 +59,20 @@ module OPML2HTML
48
59
  @document.main.add_child(par)
49
60
  end
50
61
 
62
+ def body_outline_rss(fragment, xml_url, description: nil)
63
+ anchor = @document.create_element("a")
64
+ anchor.add_child(fragment)
65
+ anchor["href"] = xml_url
66
+ par = @document.create_element("p")
67
+ par.add_child(anchor)
68
+ if description
69
+ desc = @document.create_element("p")
70
+ desc.content = description
71
+ par.add_child(desc)
72
+ end
73
+ @document.main.add_child(par)
74
+ end
75
+
51
76
  def body_outline_created(time)
52
77
  # @document.body.add_child("<p style='text-align: right'><small>#{time}</small></p>")
53
78
  end
@@ -1,5 +1,6 @@
1
1
  require "nokogiri"
2
2
  require "time"
3
+ require_relative "outline"
3
4
 
4
5
  module OPML2HTML
5
6
  class Traverser
@@ -20,27 +21,31 @@ module OPML2HTML
20
21
  private
21
22
 
22
23
  def parse_document(node)
23
- node => Nokogiri::XML::Document[root: Element[name: "opml",
24
- attributes: [Attr[name: "version",
25
- value: "2.0"]],
26
- children:]]
24
+ node => Document[root: Element[name: "opml",
25
+ attributes: [Attr[name: "version",
26
+ value: "2.0"]],
27
+ children:]]
27
28
  children.each { |child| parse_under_document(child) }
28
29
  end
29
30
 
30
31
  def parse_under_document(node)
32
+ (node in Text) and return
31
33
  case node
32
- in Text # nop
33
34
  in Element[name: "head", children:]
34
35
  children.each { |child| parse_under_head(child) }
35
36
  @hook.head_end
36
37
  in Element[name: "body", children:]
37
- children.each { |child| parse_outline(child, level: 1) }
38
+ children.each do |child|
39
+ (child in Text) and next
40
+ parse_outline(child, level: 1)
41
+ end
38
42
  else
39
43
  raise Error, node.inspect
40
44
  end
41
45
  end
42
46
 
43
47
  def parse_under_head(node)
48
+ (node in Text) and return
44
49
  case node
45
50
  in Element[name: "title", children: [Text[content:]]]
46
51
  @hook.head_title(content)
@@ -55,43 +60,34 @@ module OPML2HTML
55
60
  in Element[name: "dateModified", children: [Text[content:]]]
56
61
  time = Time.parse(content)
57
62
  @hook.head_date_modified(time)
58
- in Text |
59
- Element[name: "ownerId" |
60
- "urlUpdateSocket" |
61
- "expansionState" |
62
- "lastCursor"] # nop
63
- else
64
- raise Error, node.inspect
65
- end
66
- end
67
-
68
- def parse_body_outline_attribute(node)
69
- case node
70
- in Attr[name: "text", value:]
71
- value = DocumentFragment.parse(value)
72
- @hook.body_outline_text(value)
73
- in Attr[name: "created", value:]
74
- time = Time.parse(value)
75
- @hook.body_outline_created(time)
76
- in Attr[name: "flNumberedSubs"] # nop
63
+ in Element[name: "ownerEmail", children: [Text[content:]]]
64
+ @hook.head_owner_email(content)
65
+ in Element[name: "docs", children: [Text[content:]]]
66
+ @hook.head_docs(content)
67
+ in Element[name: "ownerId" |
68
+ "urlUpdateSocket" |
69
+ "expansionState" |
70
+ "lastCursor"] # nop
77
71
  else
78
72
  raise Error, node.inspect
79
73
  end
80
74
  end
81
75
 
82
76
  def parse_outline(node, level:)
83
- case [node, level]
84
- in [Text, _] # nop
85
- in [Element[name: "outline", attributes: [Attr[name: "text", value:], Attr[name: "created", value: _]], children: []], _]
86
- value = DocumentFragment.parse(value)
77
+ case Outline.new(node)
78
+ in text:, xml_url:, description:, children: []
79
+ value = DocumentFragment.parse(text)
80
+ @hook.body_outline_rss(value, xml_url, description:)
81
+ in text:, children: []
82
+ value = DocumentFragment.parse(text)
87
83
  @hook.body_outline_text(value)
88
- in [Element[name: "outline", attributes: [Attr[name: "text", value:], Attr[name: "created", value: _]], children:], 1]
89
- value = DocumentFragment.parse(value)
90
- @hook.body_outline_heading(value)
91
- children.each { |child| parse_outline(child, level: level + 1) }
92
- in [Element[name: "outline", attributes:, children:], _]
93
- attributes.each { |attribute| parse_body_outline_attribute(attribute) }
94
- children.each { |child| parse_outline(child, level: level + 1) }
84
+ in text:, children:, description:
85
+ value = DocumentFragment.parse(text)
86
+ @hook.body_outline_heading(value, description:, level:)
87
+ children.each do |child|
88
+ (child in Text) and next
89
+ parse_outline(child, level: level + 1)
90
+ end
95
91
  end
96
92
  end
97
93
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OPML2HTML
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.3"
5
5
  end
data/lib/opml2html.rb CHANGED
@@ -12,4 +12,5 @@ module OPML2HTML
12
12
  Attr = Nokogiri::XML::Attr
13
13
  Text = Nokogiri::XML::Text
14
14
  DocumentFragment = Nokogiri::XML::DocumentFragment
15
+ Document = Nokogiri::XML::Document
15
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opml2html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - gemmaro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-01-05 00:00:00.000000000 Z
11
+ date: 2025-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -85,6 +85,7 @@ files:
85
85
  - lib/opml2html.rb
86
86
  - lib/opml2html/dumper.rb
87
87
  - lib/opml2html/html_document.rb
88
+ - lib/opml2html/outline.rb
88
89
  - lib/opml2html/renderer.rb
89
90
  - lib/opml2html/traverser.rb
90
91
  - lib/opml2html/version.rb