fuji_markdown 0.1.1 → 0.2.0
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/.travis.yml +3 -1
- data/Gemfile.lock +1 -1
- data/exe/fujimd +10 -2
- data/lib/fuji_markdown/postprocessors/ruby.rb +49 -0
- data/lib/fuji_markdown/preprocessors/ruby.rb +15 -4
- data/lib/fuji_markdown/processor.rb +34 -0
- data/lib/fuji_markdown/renderers/kakuyomu_renderer.rb +37 -0
- data/lib/fuji_markdown/version.rb +1 -1
- data/lib/fuji_markdown.rb +32 -10
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7da8dd0aaeba4f74a917ee80a9dd367dcbc1c36d8c7aed1b2d16a007cb8e21ec
|
4
|
+
data.tar.gz: 8225eff80f86cc29e08998a20d4501fb6a339dc034599f12627e006479a11b65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 925fe47b95cbc571167e91fd5727f04372b8d92ee326b34f85be67b6e43e3d7274c9a7cbe2ff2fa9fedffceff08557a9d7325abcc693924ff383b044c06a60cd
|
7
|
+
data.tar.gz: f94d570d92109c5435a41c02413bd2e833b2edeae304354f72c1e0f9174b88608f3d73d75e35e30780ed17252c96f1b9dd56c40b7a8521288f1ce502d7816fa9
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/exe/fujimd
CHANGED
@@ -3,16 +3,24 @@
|
|
3
3
|
require 'optparse'
|
4
4
|
require 'fuji_markdown'
|
5
5
|
|
6
|
+
option = :HTML
|
7
|
+
|
6
8
|
OptionParser.new do |opts|
|
7
|
-
opts.banner = 'Usage: fujimd [
|
9
|
+
opts.banner = 'Usage: fujimd [--output <format>] <file>...'
|
10
|
+
|
11
|
+
opts.on('-o', '--output FORMAT', 'Specify output format: html or kakuyomu') do |fmt|
|
12
|
+
option = fmt.upcase.to_sym
|
13
|
+
end
|
14
|
+
|
8
15
|
opts.on_tail('-v', '--version', 'Display the current version') do
|
9
16
|
puts FujiMarkdown::VERSION
|
10
17
|
exit
|
11
18
|
end
|
19
|
+
|
12
20
|
opts.on_tail('-h', '--help', 'Display this help message') do
|
13
21
|
puts opts
|
14
22
|
exit
|
15
23
|
end
|
16
24
|
end.parse!
|
17
25
|
|
18
|
-
puts FujiMarkdown.render(ARGF.read)
|
26
|
+
puts FujiMarkdown.render(ARGF.read, option)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module FujiMarkdown
|
2
|
+
module Postprocessors
|
3
|
+
class Ruby
|
4
|
+
attr_reader :omit_start_symbol
|
5
|
+
|
6
|
+
def initialize(omit_start_symbol: false)
|
7
|
+
@ruby = false
|
8
|
+
@omit_start_symbol = omit_start_symbol
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(doc)
|
12
|
+
doc.walk do |node|
|
13
|
+
if node.type == :inline_html
|
14
|
+
process_ruby_node!(node)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def process_ruby_node!(node)
|
22
|
+
case node.string_content
|
23
|
+
when '<ruby>'
|
24
|
+
@ruby = true
|
25
|
+
node.delete
|
26
|
+
when '</ruby>'
|
27
|
+
@ruby = false
|
28
|
+
node.delete
|
29
|
+
when '<rt>'
|
30
|
+
kanji_node = node.previous
|
31
|
+
kana_node = node.next
|
32
|
+
if @ruby && kana_node.next.string_content == '</rt>'
|
33
|
+
convert_to_kakuyomu_ruby!(kanji_node, kana_node)
|
34
|
+
end
|
35
|
+
node.delete
|
36
|
+
when '</rt>'
|
37
|
+
node.delete
|
38
|
+
else
|
39
|
+
# do nothing
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def convert_to_kakuyomu_ruby!(kanji_node, kana_node)
|
44
|
+
kanji_node.string_content = "|#{kanji_node.string_content}" if kanji_node.type == :text && !(omit_start_symbol && kanji_node.string_content.match(/\A[一-龠々]+\z/))
|
45
|
+
kana_node.string_content = "《#{kana_node.string_content}》" if kana_node.type == :text
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -6,14 +6,25 @@ module FujiMarkdown
|
|
6
6
|
{
|
7
7
|
(?<kanji>[^{}|]*)
|
8
8
|
\|
|
9
|
-
(?<kana>[^{}
|
9
|
+
(?<kana>[^{}]*)
|
10
10
|
}
|
11
11
|
)x
|
12
12
|
|
13
13
|
def call(text)
|
14
|
-
text.gsub(RUBY_PATTERN) do |match|
|
15
|
-
kanji,
|
16
|
-
"<ruby>#{kanji}<rt
|
14
|
+
text.gsub!(RUBY_PATTERN) do |match|
|
15
|
+
kanji, *kanas = match.slice(1...-1).split('|')
|
16
|
+
return "<ruby>#{kanji}<rt></rt></ruby>" if kanas.empty?
|
17
|
+
|
18
|
+
pairs = []
|
19
|
+
kanas.each_with_index do |kana, i|
|
20
|
+
if i == kanas.size - 1
|
21
|
+
pairs << [kanji.slice(i..-1), kana]
|
22
|
+
else
|
23
|
+
pairs << [kanji.slice(i), kana]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
"<ruby>#{pairs.map { |k, kana| "#{k}<rt>#{kana}</rt>" }.join}</ruby>"
|
17
28
|
end
|
18
29
|
end
|
19
30
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'commonmarker'
|
2
|
+
|
3
|
+
module FujiMarkdown
|
4
|
+
class Processor
|
5
|
+
attr_reader :preprocessors, :parser, :postprocessors, :renderer
|
6
|
+
|
7
|
+
def initialize(preprocessors: [], parser: CommonMarker, postprocessors: [], renderer: CommonMarker::HtmlRenderer.new)
|
8
|
+
@preprocessors = preprocessors
|
9
|
+
@parser = parser
|
10
|
+
@postprocessors = postprocessors
|
11
|
+
@renderer = renderer
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse(text)
|
15
|
+
processed_text = text.dup
|
16
|
+
|
17
|
+
preprocessors.each do |preprocessor|
|
18
|
+
preprocessor.call(processed_text)
|
19
|
+
end
|
20
|
+
|
21
|
+
parser.render_doc(processed_text)
|
22
|
+
end
|
23
|
+
|
24
|
+
def render(text)
|
25
|
+
doc = parse(text)
|
26
|
+
|
27
|
+
postprocessors.each do |postprocessor|
|
28
|
+
postprocessor.call(doc)
|
29
|
+
end
|
30
|
+
|
31
|
+
renderer.render(doc)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'commonmarker'
|
2
|
+
|
3
|
+
module FujiMarkdown
|
4
|
+
module Renderers
|
5
|
+
class KakuyomuRenderer < CommonMarker::HtmlRenderer
|
6
|
+
def header(node)
|
7
|
+
out("\n") if node.previous&.type&.==(:paragraph)
|
8
|
+
block do
|
9
|
+
out('#' * node.header_level, ' ', :children)
|
10
|
+
end
|
11
|
+
out("\n")
|
12
|
+
end
|
13
|
+
|
14
|
+
def paragraph(node)
|
15
|
+
block do
|
16
|
+
out(:children)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def hrule(_)
|
21
|
+
out("\n")
|
22
|
+
end
|
23
|
+
|
24
|
+
def emph(_)
|
25
|
+
out('《《', :children, '》》')
|
26
|
+
end
|
27
|
+
|
28
|
+
def link(node)
|
29
|
+
out(:children)
|
30
|
+
end
|
31
|
+
|
32
|
+
def softbreak(_)
|
33
|
+
out("\n")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/fuji_markdown.rb
CHANGED
@@ -1,23 +1,45 @@
|
|
1
|
+
require_relative 'fuji_markdown/processor'
|
1
2
|
require_relative 'fuji_markdown/version'
|
2
3
|
|
4
|
+
require_relative 'fuji_markdown/postprocessors/ruby'
|
3
5
|
require_relative 'fuji_markdown/preprocessors/ruby'
|
6
|
+
require_relative 'fuji_markdown/renderers/kakuyomu_renderer'
|
4
7
|
|
5
8
|
require 'commonmarker'
|
6
9
|
|
7
10
|
module FujiMarkdown
|
8
|
-
|
9
|
-
|
11
|
+
class << self
|
12
|
+
def parse(text, option = :HTML)
|
13
|
+
processor(option).parse(text)
|
14
|
+
end
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
processed_text = filter.call(processed_text)
|
16
|
+
def render(text, option = :HTML)
|
17
|
+
processor(option).render(text)
|
14
18
|
end
|
15
19
|
|
16
|
-
|
17
|
-
end
|
20
|
+
private
|
18
21
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
+
def processor(option)
|
23
|
+
args = processor_args(option)
|
24
|
+
Processor.new(args)
|
25
|
+
end
|
26
|
+
|
27
|
+
def processor_args(option)
|
28
|
+
case option
|
29
|
+
when :HTML
|
30
|
+
{
|
31
|
+
preprocessors: [Preprocessors::Ruby.new],
|
32
|
+
renderer: CommonMarker::HtmlRenderer.new(options: :HARDBREAKS),
|
33
|
+
}
|
34
|
+
when :KAKUYOMU
|
35
|
+
{
|
36
|
+
preprocessors: [Preprocessors::Ruby.new, Proc.new { |text| text.gsub!(/《/, '|《') }],
|
37
|
+
postprocessors: [Postprocessors::Ruby.new],
|
38
|
+
renderer: Renderers::KakuyomuRenderer.new,
|
39
|
+
}
|
40
|
+
else
|
41
|
+
raise ArgumentError, "Invalid option #{option}"
|
42
|
+
end
|
43
|
+
end
|
22
44
|
end
|
23
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fuji_markdown
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fuji Nakahara
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commonmarker
|
@@ -118,7 +118,10 @@ files:
|
|
118
118
|
- exe/fujimd
|
119
119
|
- fuji_markdown.gemspec
|
120
120
|
- lib/fuji_markdown.rb
|
121
|
+
- lib/fuji_markdown/postprocessors/ruby.rb
|
121
122
|
- lib/fuji_markdown/preprocessors/ruby.rb
|
123
|
+
- lib/fuji_markdown/processor.rb
|
124
|
+
- lib/fuji_markdown/renderers/kakuyomu_renderer.rb
|
122
125
|
- lib/fuji_markdown/version.rb
|
123
126
|
homepage: https://github.com/fuji-nakahara/fuji_markdown
|
124
127
|
licenses:
|