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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 632b78dfc503f004c7dbcbbe42ddc2fd27d9c55ffb467e509db4e7e553a5a595
4
- data.tar.gz: dc2eb533dbfdc304ec9734ad846f5851bea494350603159905b6f26d22ef62c1
3
+ metadata.gz: 7da8dd0aaeba4f74a917ee80a9dd367dcbc1c36d8c7aed1b2d16a007cb8e21ec
4
+ data.tar.gz: 8225eff80f86cc29e08998a20d4501fb6a339dc034599f12627e006479a11b65
5
5
  SHA512:
6
- metadata.gz: 0377d1d841768d569b70b5c27110f34b9468a16719ec1b588215268c9413b6ebd0362f8f7b6064e788fee1e3ab141ee4020f0c565c8d19a241e7d46b01a2984d
7
- data.tar.gz: d9d8cb1a60aaa1bf72987d511f68ea5a8bcccde1da7678129477d94d9ba70318642e399021007ae8e2d1e09f7e703adbef88f72578cbca1e4af20c3563f1a611
6
+ metadata.gz: 925fe47b95cbc571167e91fd5727f04372b8d92ee326b34f85be67b6e43e3d7274c9a7cbe2ff2fa9fedffceff08557a9d7325abcc693924ff383b044c06a60cd
7
+ data.tar.gz: f94d570d92109c5435a41c02413bd2e833b2edeae304354f72c1e0f9174b88608f3d73d75e35e30780ed17252c96f1b9dd56c40b7a8521288f1ce502d7816fa9
data/.travis.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.5.1
4
+ - 2.5
5
+ - 2.4
6
+ - 2.3
5
7
  before_install: gem install bundler -v 1.16.2
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fuji_markdown (0.1.1)
4
+ fuji_markdown (0.2.0)
5
5
  commonmarker (~> 0.17)
6
6
 
7
7
  GEM
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 [options] [FILE]'
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, kana = match.slice(1...-1).split('|')
16
- "<ruby>#{kanji}<rt>#{kana}</rt></ruby>"
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
@@ -1,3 +1,3 @@
1
1
  module FujiMarkdown
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  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
- def self.parse(text)
9
- preprocessors = [Preprocessors::Ruby.new]
11
+ class << self
12
+ def parse(text, option = :HTML)
13
+ processor(option).parse(text)
14
+ end
10
15
 
11
- processed_text = text.dup
12
- preprocessors.each do |filter|
13
- processed_text = filter.call(processed_text)
16
+ def render(text, option = :HTML)
17
+ processor(option).render(text)
14
18
  end
15
19
 
16
- CommonMarker.render_doc(processed_text)
17
- end
20
+ private
18
21
 
19
- def self.render(text)
20
- doc = parse(text)
21
- doc.to_html(:HARDBREAKS)
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.1.1
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-05 00:00:00.000000000 Z
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: