booklab-sml 0.2.0 → 0.2.1

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: f40ffbae208235a1dfafa968aa9816198027175749c37b846133c4c90d1e0579
4
- data.tar.gz: e47ff7a87045859d6d78ad591651e1e0c92f2ca3d9f745c1c71cd47971910962
3
+ metadata.gz: d7221135ee40e21ca054073ec862e70f9f298b858a47254cabc978fd5b1b2ea1
4
+ data.tar.gz: b0aa1e7faaba0780cd2ac13a02d4247f5ed76a980ed4a5874f7084afe95336aa
5
5
  SHA512:
6
- metadata.gz: 2826b2f592c86982df5694b1fb8deaf788d0639facc2bd67a956b7028f1621d73dcc1c686df6b54676afbfa27029c53b0f220a7a224e0e898060e289d9723381
7
- data.tar.gz: 50fe6bdd5bbfbb946b3c543f2359f34c82b43f68b9b091c3517b25a50cf54cbab75018087e38dbc0e53c08f37c3d888a74f9ce40e698aac9ce8f1a382170e670
6
+ metadata.gz: 8e924228f106d6885dce973fdb0a9abf97f1171ebeefd829529424a161627ffafefacbb56d448c5bd441d2605c9bf53aa429ea94e8a369d40b2abc8824feef92
7
+ data.tar.gz: f673b5dcffe277844ccd491b93c26919e6ffdc7076610ef138bfa2335eb7ff74deb44ca2eb4f9b3a07a8d4f5c59a5221f4d87c57fc4fa800fc3ced60e55df067
@@ -8,6 +8,9 @@ module BookLab::SML
8
8
 
9
9
  attr_accessor :sml, :config
10
10
 
11
+ # For table, list for temp mark in block
12
+ attr_accessor :in_block
13
+
11
14
  def initialize(sml, options)
12
15
  @sml = sml
13
16
  @config = Config.new
@@ -34,7 +37,7 @@ module BookLab::SML
34
37
  prev_node = idx > 0 ? children[idx - 1] : nil
35
38
  next_node = idx < children.length ? children[idx + 1] : nil
36
39
 
37
- node_to_html(child)
40
+ node_to_html(child, { prev: prev_node, next: next_node })
38
41
  end.join("")
39
42
  end
40
43
  end
@@ -8,6 +8,8 @@ module BookLab::SML::Rules
8
8
  class Base
9
9
  include BookLab::SML::Utils
10
10
 
11
+ INDENT_PX = 8
12
+
11
13
  class << self
12
14
  include EscapeUtils
13
15
  end
@@ -24,6 +26,18 @@ module BookLab::SML::Rules
24
26
  end
25
27
 
26
28
  protected
29
+ def self.style_for_attrs(attrs, style = {})
30
+ attrs ||= {}
31
+ if attrs[:align]
32
+ style["text-align"] = attrs[:align]
33
+ end
34
+ if attrs[:indent]
35
+ style["text-indent"] = "#{4 * INDENT_PX}px"
36
+ end
37
+ props = styleize(style)
38
+ return "" if props.strip.blank?
39
+ %( style="#{props}")
40
+ end
27
41
 
28
42
  def self.styleize(style)
29
43
  style.map { |k, v| "#{k}: #{v};" }.join(" ")
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "digest/md5"
4
+
3
5
  module BookLab::SML::Rules
4
6
  class Heading < Base
5
7
  def self.match?(node)
@@ -10,7 +12,16 @@ module BookLab::SML::Rules
10
12
  renderer = opts[:renderer]
11
13
  title = renderer.children_to_html(node)
12
14
  heading_tag = tag_name(node)
13
- %(<#{heading_tag}>#{title}</#{heading_tag}>)
15
+
16
+ title_length = title.length
17
+ min_length = title_length * 0.3
18
+ words_length = /[a-z0-9]/i.match(title)&.length || 0
19
+ header_id = title.gsub(/[^a-z0-9]+/i, "-").downcase.gsub(/^\-|\-$/, "")
20
+ if title_length - header_id.length > min_length
21
+ header_id = Digest::MD5.hexdigest(title.strip)[0..8]
22
+ end
23
+
24
+ %(<#{heading_tag} id="#{header_id}"><a href="##{header_id}" class="heading-anchor">#</a>#{title}</#{heading_tag}>)
14
25
  end
15
26
  end
16
27
  end
@@ -12,7 +12,7 @@ module BookLab::SML::Rules
12
12
  name = renderer.children_to_html(node)
13
13
  return name if attrs[:href].blank?
14
14
 
15
- %(<a href="#{attrs[:href]}" title="#{attrs[:title]}">#{name}</a>)
15
+ %(<a href="#{attrs[:href]}" title="#{attrs[:title]}" target="_blank">#{name}</a>)
16
16
  end
17
17
  end
18
18
  end
@@ -23,36 +23,62 @@ module BookLab::SML::Rules
23
23
  nid = attrs[:nid]
24
24
  list_type = attrs[:type] || "bulleted"
25
25
  level = attrs[:level] || 1
26
- num = attrs[:num] || 1
27
- pstyle = attrs[:pstyle] || "paragraph"
26
+ num = (attrs[:num] || 0) + 1
28
27
 
29
- wrap_tag = attrs[:type] == "bulleted" ? "ul" : "ol"
30
- item_tag = "li"
28
+ style_attrs = style_for_attrs(attrs, {
29
+ "padding-left": "#{indent_left * INDENT_PX}px"
30
+ })
31
31
 
32
- case pstyle
33
- when "paragraph" then item_tag = "p"
34
- when "heading1" then item_tag = "h1"
35
- when "heading2" then item_tag = "h2"
36
- else item_tag = "p"
37
- end
32
+ wrap_tag = list_type == "bulleted" ? "ul" : "ol"
38
33
 
39
- style = {
40
- "text-align": text_align,
41
- "text-indent": text_indent ? "#{4 * INDENT_PX}px" : "0px",
42
- "padding-left": "#{indent_left * INDENT_PX}px"
43
- }.map { |k, v| "#{k}: #{v};" }.join(" ")
34
+
35
+ # <ul>
36
+ # <li>Bold text</li>
37
+ # <li>Important text
38
+ # <ul>
39
+ # <li>Emphasized text</li>
40
+ # <li>
41
+ # Small text
42
+ # <ul>
43
+ # <li>Subscript text</li>
44
+ # </ul>
45
+ # </li>
46
+ # </ul>
47
+ # </li>
48
+ # </ul>
49
+
50
+ # get prev attrs
51
+ prev_name = tag_name(opts[:prev])
52
+ next_name = tag_name(opts[:next])
53
+ prev_level = attributes(opts[:prev])[:level]
54
+ next_level = attributes(opts[:next])[:level]
44
55
 
45
56
  outs = []
46
- if opts[:prev] && tag_name(opts[:prev]) != "list"
47
- outs << %(<#{wrap_tag} style="#{style}">)
57
+
58
+
59
+ if prev_name != "list" || prev_level != level
60
+ outs << %(<#{wrap_tag} data-level="#{level}">)
48
61
  end
49
62
 
50
- outs << %(<li>#{children}</li>)
63
+ li_item = "<li>#{children}"
51
64
 
52
- if opts[:next] && tag_name(opts[:next]) != "list"
53
- outs << "</#{wrap_tag}>"
65
+ if next_name == "list"
66
+ if next_level < level
67
+ (level - next_level + 1).times do
68
+ li_item += "</li></#{wrap_tag}>"
69
+ end
70
+ elsif next_level == level
71
+ li_item += "</li>"
72
+ else
73
+ li_item += "\n"
74
+ end
75
+ else
76
+ li_item += "</li></#{wrap_tag}>"
54
77
  end
55
- outs.join("")
78
+
79
+ outs << li_item
80
+
81
+ outs.join("\n")
56
82
  end
57
83
  end
58
84
  end
@@ -9,7 +9,11 @@ module BookLab::SML::Rules
9
9
  def self.to_html(node, opts = {})
10
10
  renderer = opts[:renderer]
11
11
  children = renderer.children_to_html(node)
12
- %(<p>#{children}</p>)
12
+ attrs = attributes(node)
13
+
14
+ style_attrs = style_for_attrs(attrs)
15
+
16
+ %(<p#{style_attrs}>#{children}</p>)
13
17
  end
14
18
  end
15
19
  end
@@ -5,11 +5,10 @@ module BookLab::SML::Rules
5
5
  MARKS = {
6
6
  cd: ["<code>", "</code>"],
7
7
  b: ["<strong>", "</strong>"],
8
- i: ["<em>", "</em>"],
8
+ i: ["<i>", "</i>"],
9
9
  s: ["<del>", "</del>"],
10
10
  u: ["<u>", "</u>"],
11
- mt: ["$", "$"],
12
- m: ["==", "=="],
11
+ m: ["<mark>", "</mark>"],
13
12
  sup: ["<sup>", "</sup>"],
14
13
  sub: ["<sub>", "</sub>"],
15
14
  }
@@ -12,15 +12,7 @@ module BookLab::SML::Rules
12
12
  children = renderer.children_to_html(node)
13
13
 
14
14
  style = {}
15
- if attrs[:align]
16
- style["text-align"] = attrs[:align]
17
- end
18
-
19
- style_attrs = ""
20
- if style.any?
21
- style_attrs = %( style="#{styleize(style)}")
22
- end
23
-
15
+ style_attrs = style_for_attrs(attrs, style)
24
16
  %(<td#{style_attrs}>#{children}</td>)
25
17
  end
26
18
  end
@@ -10,12 +10,14 @@ module BookLab::SML
10
10
  end
11
11
 
12
12
  def tag_name(node)
13
+ return nil if node.blank?
13
14
  node[0] || ""
14
15
  end
15
16
 
16
17
  def attributes(node, add_if_mission: false)
18
+ return {} if node.blank?
17
19
  return node[1].deep_symbolize_keys if has_attributes?(node)
18
- return nil unless add_if_mission
20
+ return {} unless add_if_mission
19
21
 
20
22
  name = node.shift || ""
21
23
  attrs = {}
@@ -2,6 +2,6 @@
2
2
 
3
3
  module BookLab
4
4
  module SML
5
- VERSION = "0.2.0"
5
+ VERSION = "0.2.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: booklab-sml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Lee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-09 00:00:00.000000000 Z
11
+ date: 2019-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport