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 +4 -4
- data/lib/booklab/sml/renderer.rb +4 -1
- data/lib/booklab/sml/rules/base.rb +14 -0
- data/lib/booklab/sml/rules/heading.rb +12 -1
- data/lib/booklab/sml/rules/link.rb +1 -1
- data/lib/booklab/sml/rules/list.rb +47 -21
- data/lib/booklab/sml/rules/paragraph.rb +5 -1
- data/lib/booklab/sml/rules/span_with_mark.rb +2 -3
- data/lib/booklab/sml/rules/td.rb +1 -9
- data/lib/booklab/sml/utils.rb +3 -1
- data/lib/booklab/sml/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: d7221135ee40e21ca054073ec862e70f9f298b858a47254cabc978fd5b1b2ea1
         | 
| 4 | 
            +
              data.tar.gz: b0aa1e7faaba0780cd2ac13a02d4247f5ed76a980ed4a5874f7084afe95336aa
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8e924228f106d6885dce973fdb0a9abf97f1171ebeefd829529424a161627ffafefacbb56d448c5bd441d2605c9bf53aa429ea94e8a369d40b2abc8824feef92
         | 
| 7 | 
            +
              data.tar.gz: f673b5dcffe277844ccd491b93c26919e6ffdc7076610ef138bfa2335eb7ff74deb44ca2eb4f9b3a07a8d4f5c59a5221f4d87c57fc4fa800fc3ced60e55df067
         | 
    
        data/lib/booklab/sml/renderer.rb
    CHANGED
    
    | @@ -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 | 
            -
             | 
| 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 | 
            -
                   | 
| 30 | 
            -
             | 
| 28 | 
            +
                  style_attrs = style_for_attrs(attrs, {
         | 
| 29 | 
            +
                    "padding-left": "#{indent_left * INDENT_PX}px"
         | 
| 30 | 
            +
                  })
         | 
| 31 31 |  | 
| 32 | 
            -
                   | 
| 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 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
                   | 
| 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 | 
            -
             | 
| 47 | 
            -
             | 
| 57 | 
            +
             | 
| 58 | 
            +
             | 
| 59 | 
            +
                  if prev_name != "list" || prev_level != level
         | 
| 60 | 
            +
                    outs << %(<#{wrap_tag} data-level="#{level}">)
         | 
| 48 61 | 
             
                  end
         | 
| 49 62 |  | 
| 50 | 
            -
                   | 
| 63 | 
            +
                  li_item = "<li>#{children}"
         | 
| 51 64 |  | 
| 52 | 
            -
                  if  | 
| 53 | 
            -
                     | 
| 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 | 
            -
             | 
| 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 | 
            -
                   | 
| 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: ["< | 
| 8 | 
            +
                  i: ["<i>", "</i>"],
         | 
| 9 9 | 
             
                  s: ["<del>", "</del>"],
         | 
| 10 10 | 
             
                  u: ["<u>", "</u>"],
         | 
| 11 | 
            -
                   | 
| 12 | 
            -
                  m: ["==", "=="],
         | 
| 11 | 
            +
                  m: ["<mark>", "</mark>"],
         | 
| 13 12 | 
             
                  sup: ["<sup>", "</sup>"],
         | 
| 14 13 | 
             
                  sub: ["<sub>", "</sub>"],
         | 
| 15 14 | 
             
                }
         | 
    
        data/lib/booklab/sml/rules/td.rb
    CHANGED
    
    | @@ -12,15 +12,7 @@ module BookLab::SML::Rules | |
| 12 12 | 
             
                  children = renderer.children_to_html(node)
         | 
| 13 13 |  | 
| 14 14 | 
             
                  style = {}
         | 
| 15 | 
            -
                   | 
| 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
         | 
    
        data/lib/booklab/sml/utils.rb
    CHANGED
    
    | @@ -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  | 
| 20 | 
            +
                    return {} unless add_if_mission
         | 
| 19 21 |  | 
| 20 22 | 
             
                    name = node.shift || ""
         | 
| 21 23 | 
             
                    attrs = {}
         | 
    
        data/lib/booklab/sml/version.rb
    CHANGED
    
    
    
        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. | 
| 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- | 
| 11 | 
            +
            date: 2019-01-10 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activesupport
         |