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 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: