fuji_markdown 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|