markdownlyze 0.0.2
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 +7 -0
- data/lib/markdownlyze/element_name_matcher.rb +39 -0
- data/lib/markdownlyze/elements/base.rb +40 -0
- data/lib/markdownlyze/elements/blank_line.rb +7 -0
- data/lib/markdownlyze/elements/code_block.rb +26 -0
- data/lib/markdownlyze/elements/h1.rb +9 -0
- data/lib/markdownlyze/elements/h2.rb +9 -0
- data/lib/markdownlyze/elements/h3.rb +9 -0
- data/lib/markdownlyze/elements/h4.rb +9 -0
- data/lib/markdownlyze/elements/image.rb +9 -0
- data/lib/markdownlyze/elements/ol.rb +18 -0
- data/lib/markdownlyze/elements/paragraph.rb +7 -0
- data/lib/markdownlyze/elements/quote.rb +18 -0
- data/lib/markdownlyze/elements/table.rb +26 -0
- data/lib/markdownlyze/elements/ul.rb +18 -0
- data/lib/markdownlyze/version.rb +9 -0
- data/lib/markdownlyze.rb +54 -0
- metadata +99 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 2893ad36d725df82ee075003813643374a0a6b612ba5f31595f4f3b889952ea1
|
|
4
|
+
data.tar.gz: 730467d9ad5ca5ed36bfb79e6a583e275a53d599da4cc1eedc9583775bdd7f03
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: b2999d43f01fe126efbd00ed2c86b258bbcf1726c76c27228aca2d45376cbace5b5ec2d2b8cb854617932413896867992777a993bfa49794e4485d2e283a2b01
|
|
7
|
+
data.tar.gz: 1c159cf78113b05268a0bd56db22678ba8eeaffcf00a55723a50ef329a37e2af2f3cc3f584e60beb1e1a8a63e497822588b7517cb2f4b3a789c4970d65f96228
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
class ElementNameMatcher
|
|
3
|
+
MATCHERS = {
|
|
4
|
+
/^# .*/ => :h1,
|
|
5
|
+
/^## .*/ => :h2,
|
|
6
|
+
/^### .*/ => :h3,
|
|
7
|
+
/^#### .*/ => :h4,
|
|
8
|
+
/\!\[.*\]\(\.\/images\/.*\)/ => :image,
|
|
9
|
+
/```[a-z]*/ => :code_block,
|
|
10
|
+
/^\> .*/ => :quote,
|
|
11
|
+
[/^1\. .*/, lambda { |next_line| next_line.to_s.match?(/^2\. .*/) }] => :ol,
|
|
12
|
+
[/^(\*|\-) .*/, lambda { |next_line| next_line.to_s.match?(/^(\*|\-) .*/) }] => :ul,
|
|
13
|
+
[/^|.* \| .*$/, lambda { |next_line| next_line.to_s.count('|') > 1 }] => :table
|
|
14
|
+
}.freeze
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
def call(current_line:, next_line:)
|
|
18
|
+
return :blank_line if current_line.nil? || current_line.strip.empty?
|
|
19
|
+
|
|
20
|
+
MATCHERS.each do |pattern, element|
|
|
21
|
+
return element if matching?(current_line, next_line, pattern)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
:paragraph
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def matching?(current_line, next_line, pattern)
|
|
30
|
+
if pattern.is_a?(Regexp)
|
|
31
|
+
current_line.match?(pattern)
|
|
32
|
+
else
|
|
33
|
+
regex_pattern, lambda_pattern = pattern
|
|
34
|
+
current_line.match?(regex_pattern) && lambda_pattern.call(next_line)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
module Elements
|
|
3
|
+
class Base
|
|
4
|
+
attr_reader :skip_until
|
|
5
|
+
|
|
6
|
+
def initialize(line:, index:, lines:)
|
|
7
|
+
@line = line
|
|
8
|
+
@index = index
|
|
9
|
+
@lines = lines
|
|
10
|
+
@skip_until = nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def options = {}
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def to_html(value)
|
|
18
|
+
# avoid case when 1. something is created as one element ol list
|
|
19
|
+
if value.to_s.match?(/^\d+\. .*/)
|
|
20
|
+
captures = value.match(/^(?<start_number>\d+)\. (?<raw_value>.*)/).named_captures
|
|
21
|
+
parsed_value = markdown.render(captures.fetch('raw_value')).gsub(/\<(|\/)p\>/, '').gsub("\n", '').gsub("'", "'")
|
|
22
|
+
element_number = captures.fetch('start_number')
|
|
23
|
+
|
|
24
|
+
"#{element_number}. #{parsed_value}"
|
|
25
|
+
elsif value.to_s.strip == '>'
|
|
26
|
+
''
|
|
27
|
+
else
|
|
28
|
+
markdown.render(value).gsub(/\<(|\/)p\>/, '').gsub("\n", '').gsub("'", "'")
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def markdown
|
|
33
|
+
@markdown ||= begin
|
|
34
|
+
renderer = Redcarpet::Render::HTML.new(render_options = {})
|
|
35
|
+
Redcarpet::Markdown.new(renderer, extensions = {})
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
module Elements
|
|
3
|
+
class CodeBlock < ::Markdownlyze::Elements::Base
|
|
4
|
+
def value
|
|
5
|
+
@lines[@index..-1].each_with_index do |subline, subindex|
|
|
6
|
+
if subline.to_s.strip == '```'
|
|
7
|
+
@skip_until = @index + subindex + 1
|
|
8
|
+
break
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
@lines[(@index + 1)..(@skip_until - 2)].join("\n")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def options
|
|
16
|
+
{ language: language }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def language
|
|
22
|
+
(@line.match(/```(?<language>[a-z].*)/) || { language: 'bash' })[:language]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
module Elements
|
|
3
|
+
class Ol < ::Markdownlyze::Elements::Base
|
|
4
|
+
def value
|
|
5
|
+
@lines[@index..-1].each_with_index do |subline, subindex|
|
|
6
|
+
if !subline.match?(/^\d+\. .*/)
|
|
7
|
+
@skip_until = @index + subindex
|
|
8
|
+
break
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
@skip_until = @lines.size if @skip_until.nil?
|
|
13
|
+
|
|
14
|
+
@lines[@index..(@skip_until - 1)].map { |line| to_html(line.gsub(/^\d+\. /, '')) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
module Elements
|
|
3
|
+
class Quote < ::Markdownlyze::Elements::Base
|
|
4
|
+
def value
|
|
5
|
+
@lines[@index..-1].each_with_index do |subline, subindex|
|
|
6
|
+
if !subline.match?(/^\> .*/) && subline.to_s.strip != '>'
|
|
7
|
+
@skip_until = @index + subindex
|
|
8
|
+
break
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
@skip_until = @lines.size if @skip_until.nil?
|
|
13
|
+
|
|
14
|
+
@lines[@index..(@skip_until - 1)].map { |line| to_html(line.gsub(/^\> /, '')) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
module Elements
|
|
3
|
+
class Table < ::Markdownlyze::Elements::Base
|
|
4
|
+
def value
|
|
5
|
+
@lines[@index..-1].each_with_index do |subline, subindex|
|
|
6
|
+
if subline.count('|') < 2
|
|
7
|
+
@skip_until = @index + subindex
|
|
8
|
+
break
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
table_lines = @lines[@index..(skip_until.to_i - 1)]
|
|
13
|
+
headers = table_lines.shift
|
|
14
|
+
table_lines.shift
|
|
15
|
+
raw_table = [headers] | table_lines
|
|
16
|
+
rows = raw_table.map { |row| row.split("|").map(&:strip)[1..-1].map { |value| to_html(value) } }
|
|
17
|
+
|
|
18
|
+
if @skip_until.to_i.zero?
|
|
19
|
+
@skip_until = @index + rows.size + 1
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
rows
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Markdownlyze
|
|
2
|
+
module Elements
|
|
3
|
+
class Ul < ::Markdownlyze::Elements::Base
|
|
4
|
+
def value
|
|
5
|
+
@lines[@index..-1].each_with_index do |subline, subindex|
|
|
6
|
+
if !subline.match?(/^(\*|\-) .*/)
|
|
7
|
+
@skip_until = @index + subindex
|
|
8
|
+
break
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
@skip_until = @lines.size if @skip_until.nil?
|
|
13
|
+
|
|
14
|
+
@lines[@index..(@skip_until - 1)].map { |line| to_html(line.gsub(/^(\*|\-) /, '')) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/markdownlyze.rb
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'redcarpet'
|
|
2
|
+
|
|
3
|
+
require_relative 'markdownlyze/element_name_matcher'
|
|
4
|
+
|
|
5
|
+
require_relative 'markdownlyze/elements/base'
|
|
6
|
+
require_relative 'markdownlyze/elements/h1'
|
|
7
|
+
require_relative 'markdownlyze/elements/h2'
|
|
8
|
+
require_relative 'markdownlyze/elements/h3'
|
|
9
|
+
require_relative 'markdownlyze/elements/h4'
|
|
10
|
+
require_relative 'markdownlyze/elements/image'
|
|
11
|
+
require_relative 'markdownlyze/elements/blank_line'
|
|
12
|
+
require_relative 'markdownlyze/elements/paragraph'
|
|
13
|
+
require_relative 'markdownlyze/elements/code_block'
|
|
14
|
+
require_relative 'markdownlyze/elements/table'
|
|
15
|
+
require_relative 'markdownlyze/elements/ol'
|
|
16
|
+
require_relative 'markdownlyze/elements/ul'
|
|
17
|
+
require_relative 'markdownlyze/elements/quote'
|
|
18
|
+
|
|
19
|
+
module Markdownlyze
|
|
20
|
+
class << self
|
|
21
|
+
def parse(content)
|
|
22
|
+
markdown_lines = content.to_s.split("\n")
|
|
23
|
+
skip_until = nil
|
|
24
|
+
|
|
25
|
+
elements = markdown_lines.map.with_index do |line, index|
|
|
26
|
+
unless skip_until.nil?
|
|
27
|
+
next if index < skip_until
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
element_name = ::Markdownlyze::ElementNameMatcher.call(
|
|
31
|
+
current_line: line,
|
|
32
|
+
next_line: markdown_lines[index + 1]
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
element_class = ::Markdownlyze::Elements.const_get(element_name.to_s.split('_').map(&:capitalize).join)
|
|
36
|
+
element = element_class.new(
|
|
37
|
+
line: line,
|
|
38
|
+
index: index,
|
|
39
|
+
lines: markdown_lines
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
{ element: element_name, value: element.value }.merge(element.options).tap do
|
|
43
|
+
skip_until = element.skip_until
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
elements.compact
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def parse_file(file_path)
|
|
51
|
+
parse(File.read(file_path))
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: markdownlyze
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Paweł Dąbrowski
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2024-08-19 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rspec
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: pry
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ">="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: redcarpet
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - '='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 3.6.0
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - '='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 3.6.0
|
|
55
|
+
description: Turn markdown documents into easily parseable format
|
|
56
|
+
email: contact@paweldabrowski.com
|
|
57
|
+
executables: []
|
|
58
|
+
extensions: []
|
|
59
|
+
extra_rdoc_files: []
|
|
60
|
+
files:
|
|
61
|
+
- lib/markdownlyze.rb
|
|
62
|
+
- lib/markdownlyze/element_name_matcher.rb
|
|
63
|
+
- lib/markdownlyze/elements/base.rb
|
|
64
|
+
- lib/markdownlyze/elements/blank_line.rb
|
|
65
|
+
- lib/markdownlyze/elements/code_block.rb
|
|
66
|
+
- lib/markdownlyze/elements/h1.rb
|
|
67
|
+
- lib/markdownlyze/elements/h2.rb
|
|
68
|
+
- lib/markdownlyze/elements/h3.rb
|
|
69
|
+
- lib/markdownlyze/elements/h4.rb
|
|
70
|
+
- lib/markdownlyze/elements/image.rb
|
|
71
|
+
- lib/markdownlyze/elements/ol.rb
|
|
72
|
+
- lib/markdownlyze/elements/paragraph.rb
|
|
73
|
+
- lib/markdownlyze/elements/quote.rb
|
|
74
|
+
- lib/markdownlyze/elements/table.rb
|
|
75
|
+
- lib/markdownlyze/elements/ul.rb
|
|
76
|
+
- lib/markdownlyze/version.rb
|
|
77
|
+
homepage:
|
|
78
|
+
licenses: []
|
|
79
|
+
metadata: {}
|
|
80
|
+
post_install_message:
|
|
81
|
+
rdoc_options: []
|
|
82
|
+
require_paths:
|
|
83
|
+
- lib
|
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - ">="
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0'
|
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
|
+
requirements:
|
|
91
|
+
- - ">="
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '0'
|
|
94
|
+
requirements: []
|
|
95
|
+
rubygems_version: 3.4.10
|
|
96
|
+
signing_key:
|
|
97
|
+
specification_version: 4
|
|
98
|
+
summary: Turn markdown documents into easily parseable format
|
|
99
|
+
test_files: []
|