fuji_markdown 0.2.2 → 0.4.1

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: 5ae1283a77990cc0ad59534fc97d698b5eacd037cbabc7aa827872b36cfa80a3
4
- data.tar.gz: 05572f49b8b6523c6bfa1b5de7307c7caad4debe0fe537a19b824bc238e3fc7e
3
+ metadata.gz: d596f7b5a4ffb1833c3b305c0fc86ff89ca9fc76c1659135c9f2c39245429221
4
+ data.tar.gz: 89c48f513b16677073e88aca5f86384e432d681f2bb588819fd970cf5df044e3
5
5
  SHA512:
6
- metadata.gz: 499b6c709a44f30e6c65b6edf7851eddfe7c1571a5f21a01c0690e410fa27e86564fb95a5398132d78681085fdf328c869e1491dc82b213037b050fc64b8b8b6
7
- data.tar.gz: 9b824827f54978ad22e625db35510f769fdc0ff70ce1bd6b8c589ae60c58d0d5bc612f6ce522cd9be9202bf8addecb5944d3d47d09b906b72cb47d289665c315
6
+ metadata.gz: 40015bf7c0be7a04298d60f52540d0210a20143fb11d95f5a8d2e8a9016458dce72f6806455fd84bf2c195bdc895ecc121c0a95d08fa44f51def93291c63b1e9
7
+ data.tar.gz: '09ce44473e30d5fc2b1c785dadfa6a38f09c7cff2fda858af8eb93dda1cc8ce5b5846819245e3a7551c000edc52656ee3737ea1b529a862fff66e241d0c3bf51'
@@ -0,0 +1 @@
1
+ github: fuji-nakahara
@@ -0,0 +1,31 @@
1
+ name: Ruby Gem
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - v*
7
+
8
+ jobs:
9
+ build:
10
+ name: Build + Publish
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+
16
+ - name: Set up Ruby
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: 2.7
20
+
21
+ - name: Publish to GPR
22
+ run: |
23
+ mkdir -p $HOME/.gem
24
+ touch $HOME/.gem/credentials
25
+ chmod 0600 $HOME/.gem/credentials
26
+ printf -- "---\n:github: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
27
+ gem build *.gemspec
28
+ gem push --key github --host https://rubygems.pkg.github.com/${OWNER} *.gem
29
+ env:
30
+ GEM_HOST_API_KEY: "Bearer ${{secrets.GITHUB_TOKEN}}"
31
+ OWNER: ${{ github.repository_owner }}
@@ -0,0 +1,33 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+ pull_request:
8
+ branches:
9
+ - master
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ matrix:
17
+ ruby:
18
+ - 2.6
19
+ - 2.7
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+
24
+ - name: Set up Ruby
25
+ uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: ${{ matrix.ruby }}
28
+
29
+ - name: Install dependencies
30
+ run: bundle install
31
+
32
+ - name: Run tests
33
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -1,11 +1,55 @@
1
- /.bundle/
2
- /.yardoc
3
- /_yardoc/
1
+ # rspec failure tracking
2
+ .rspec_status
3
+
4
+ ### https://raw.github.com/github/gitignore/9da1b5d8ce4e009ff627c4fe49a4488b2a3f60d4/Ruby.gitignore
5
+
6
+ *.gem
7
+ *.rbc
8
+ /.config
4
9
  /coverage/
5
- /doc/
10
+ /InstalledFiles
6
11
  /pkg/
7
12
  /spec/reports/
13
+ /spec/examples.txt
14
+ /test/tmp/
15
+ /test/version_tmp/
8
16
  /tmp/
9
17
 
10
- # rspec failure tracking
11
- .rspec_status
18
+ # Used by dotenv library to load environment variables.
19
+ # .env
20
+
21
+ ## Specific to RubyMotion:
22
+ .dat*
23
+ .repl_history
24
+ build/
25
+ *.bridgesupport
26
+ build-iPhoneOS/
27
+ build-iPhoneSimulator/
28
+
29
+ ## Specific to RubyMotion (use of CocoaPods):
30
+ #
31
+ # We recommend against adding the Pods directory to your .gitignore. However
32
+ # you should judge for yourself, the pros and cons are mentioned at:
33
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
34
+ #
35
+ # vendor/Pods/
36
+
37
+ ## Documentation cache and generated files:
38
+ /.yardoc/
39
+ /_yardoc/
40
+ /doc/
41
+ /rdoc/
42
+
43
+ ## Environment normalization:
44
+ /.bundle/
45
+ /vendor/bundle
46
+ /lib/bundler/man/
47
+
48
+ # for a library or gem, you might want to ignore these files since the code is
49
+ # intended to run in multiple environments; otherwise, check them in:
50
+ Gemfile.lock
51
+ .ruby-version
52
+ .ruby-gemset
53
+
54
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
55
+ .rvmrc
@@ -1,6 +1,20 @@
1
- inherit_gem:
2
- meowcop:
3
- - config/rubocop.yml
1
+ require:
2
+ - rubocop-rspec
4
3
 
5
4
  AllCops:
6
- TargetRubyVersion: 2.5
5
+ TargetRubyVersion: 2.6
6
+ NewCops: enable
7
+
8
+ # rubocop
9
+
10
+ Metrics/BlockLength:
11
+ Exclude:
12
+ - spec/**/*
13
+
14
+ Style/Documentation:
15
+ Enabled: false
16
+
17
+ # rubocop-rspec
18
+
19
+ RSpec/ExampleLength:
20
+ Enabled: false
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.4.1]
11
+
12
+ ### Fixed
13
+
14
+ - Stop holding presets as constants.
15
+
16
+ ## [0.4.0] - 2020-10-12
17
+
18
+ ### Added
19
+
20
+ - Add CHANGELOG.md.
21
+
22
+ ### Changed
23
+
24
+ - Specify required_ruby_version to '>= 2.6'.
25
+ - Make preprocessors not to change given text destructively.
26
+
27
+ [Unreleased]: https://github.com/fuji-nakahara/fuji_markdown/compare/v0.4.1...HEAD
28
+ [0.4.1]: https://github.com/fuji-nakahara/fuji_markdown/compare/v0.4.0...v0.4.1
29
+ [0.4.0]: https://github.com/fuji-nakahara/fuji_markdown/compare/v0.3.1...v0.4.0
@@ -68,7 +68,7 @@ members of the project's leadership.
68
68
  ## Attribution
69
69
 
70
70
  This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
71
+ available at [https://contributor-covenant.org/version/1/4][version]
72
72
 
73
- [homepage]: http://contributor-covenant.org
74
- [version]: http://contributor-covenant.org/version/1/4/
73
+ [homepage]: https://contributor-covenant.org
74
+ [version]: https://contributor-covenant.org/version/1/4/
data/Gemfile CHANGED
@@ -1,4 +1,11 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in fuji_markdown.gemspec
4
6
  gemspec
7
+
8
+ gem 'rake'
9
+ gem 'rspec'
10
+ gem 'rubocop'
11
+ gem 'rubocop-rspec'
data/README.md CHANGED
@@ -21,9 +21,26 @@ Or install it yourself as:
21
21
 
22
22
  ## Usage
23
23
 
24
- Just type `fujimd` and give your FujiMarkdown file:
24
+ ```ruby
25
+ require 'fuji_markdown'
26
+
27
+ FujiMarkdown.render('山へ*柴刈り*に出かけたおじいさんは{紅蓮の炎|ヘルフレイム}に焼かれ果てた。')
28
+ # => "<p>山へ<em>柴刈り</em>に出かけたおじいさんは<ruby>紅蓮の炎<rt>ヘルフレイム</rt></ruby>に焼かれ果てた。</p>\n"
29
+
30
+ FujiMarkdown.render('山へ*柴刈り*に出かけたおじいさんは{紅蓮の炎|ヘルフレイム}に焼かれ果てた。', :KAKUYOMU)
31
+ # => "山へ《《柴刈り》》に出かけたおじいさんは|紅蓮の炎《ヘルフレイム》に焼かれ果てた。\n"
32
+
33
+ FujiMarkdown.render('山へ*柴刈り*に出かけたおじいさんは{紅蓮の炎|ヘルフレイム}に焼かれ果てた。', :NAROU)
34
+ # => "山へ|柴《・》|刈《・》|り《・》に出かけたおじいさんは|紅蓮の炎《ヘルフレイム》に焼かれ果てた。\n"
35
+ ```
36
+
37
+ See [spec](spec/fuji_markdown_spec.rb) for more detail.
38
+
39
+ ---
40
+
41
+ In addition, you can use `fujimd` command from CLI:
25
42
 
26
- $ fujimd your-fuji_markdown-file.md
43
+ $ fujimd your-FujiMarkdown-file.md [--output kakuyomu]
27
44
 
28
45
  ## Development
29
46
 
@@ -33,7 +50,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
33
50
 
34
51
  ## Contributing
35
52
 
36
- Bug reports and pull requests are welcome on GitHub at https://github.com/fuji-nakahara/fuji_markdown. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
53
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fuji-nakahara/fuji_markdown. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/fuji-nakahara/fuji_markdown/blob/master/CODE_OF_CONDUCT.md).
37
54
 
38
55
  ## License
39
56
 
@@ -41,4 +58,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
41
58
 
42
59
  ## Code of Conduct
43
60
 
44
- Everyone interacting in the FujiMarkdown projects codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/fuji_markdown/blob/master/CODE_OF_CONDUCT.md).
61
+ Everyone interacting in the FujiMarkdown project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/fuji-nakahara/fuji_markdown/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,7 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'fuji_markdown'
5
6
 
6
- require 'pry'
7
- Pry.start
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start(__FILE__)
data/exe/fujimd CHANGED
@@ -1,14 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'optparse'
4
5
  require 'fuji_markdown'
6
+ require 'fuji_markdown/version'
5
7
 
6
8
  option = :HTML
7
9
 
8
10
  OptionParser.new do |opts|
9
11
  opts.banner = 'Usage: fujimd [--output <format>] <file>...'
10
12
 
11
- opts.on('-o', '--output FORMAT', 'Specify output format: html or kakuyomu') do |fmt|
13
+ opts.on('-o', '--output FORMAT', 'Specify output format: kakuyomu, narou or html') do |fmt|
12
14
  option = fmt.upcase.to_sym
13
15
  end
14
16
 
@@ -1,7 +1,6 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'fuji_markdown/version'
3
+ require_relative 'lib/fuji_markdown/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = 'fuji_markdown'
@@ -13,19 +12,20 @@ Gem::Specification.new do |spec|
13
12
  spec.description = 'FujiMarkdown is the dialect of Markdown supporting extensions for Japanese novels.'
14
13
  spec.homepage = 'https://github.com/fuji-nakahara/fuji_markdown'
15
14
  spec.license = 'MIT'
15
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.6')
16
16
 
17
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/fuji-nakahara/fuji_markdown'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/fuji-nakahara/fuji_markdown/blob/master/CHANGELOG.md'
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
25
  end
20
26
  spec.bindir = 'exe'
21
- spec.executables = ['fujimd']
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
28
  spec.require_paths = ['lib']
23
29
 
24
30
  spec.add_dependency 'commonmarker', '~> 0.17'
25
-
26
- spec.add_development_dependency 'bundler', '~> 1.16'
27
- spec.add_development_dependency 'meowcop'
28
- spec.add_development_dependency 'pry'
29
- spec.add_development_dependency 'rake', '~> 12.3'
30
- spec.add_development_dependency 'rspec', '~> 3.7'
31
31
  end
@@ -1,44 +1,49 @@
1
- require_relative 'fuji_markdown/processor'
2
- require_relative 'fuji_markdown/version'
1
+ # frozen_string_literal: true
3
2
 
3
+ require_relative 'fuji_markdown/error'
4
+ require_relative 'fuji_markdown/processor'
4
5
  require_relative 'fuji_markdown/postprocessors/ruby'
5
6
  require_relative 'fuji_markdown/preprocessors/ruby'
7
+ require_relative 'fuji_markdown/preprocessors/escape_narou'
8
+ require_relative 'fuji_markdown/renderers/text_renderer'
6
9
  require_relative 'fuji_markdown/renderers/kakuyomu_renderer'
7
-
8
- require 'commonmarker'
10
+ require_relative 'fuji_markdown/renderers/narou_renderer'
9
11
 
10
12
  module FujiMarkdown
11
13
  class << self
12
- def parse(text, option = :HTML)
13
- processor(option).parse(text)
14
+ def parse(text, preset = :HTML)
15
+ options = build_options_from_preset(preset)
16
+ Processor.new(**options).parse(text)
14
17
  end
15
18
 
16
- def render(text, option = :HTML)
17
- processor(option).render(text)
19
+ def render(text, preset = :HTML)
20
+ options = build_options_from_preset(preset)
21
+ Processor.new(**options).render(text)
18
22
  end
19
23
 
20
24
  private
21
25
 
22
- def processor(option)
23
- args = processor_args(option)
24
- Processor.new(args)
25
- end
26
-
27
- def processor_args(option)
28
- case option
26
+ def build_options_from_preset(preset) # rubocop:disable Metrics/MethodLength
27
+ case preset
29
28
  when :HTML
30
29
  {
31
30
  preprocessors: [Preprocessors::Ruby.new],
32
- renderer: CommonMarker::HtmlRenderer.new(options: [:HARDBREAKS, :UNSAFE]),
31
+ renderer: CommonMarker::HtmlRenderer.new(options: %i[HARDBREAKS UNSAFE])
33
32
  }
34
33
  when :KAKUYOMU
35
34
  {
36
- preprocessors: [Preprocessors::Ruby.new, Proc.new { |text| text.gsub!(/《/, '|《') }],
35
+ preprocessors: [Preprocessors::Ruby.new, proc { |text| text.gsub(/《/, '|《') }],
36
+ postprocessors: [Postprocessors::Ruby.new],
37
+ renderer: Renderers::KakuyomuRenderer.new
38
+ }
39
+ when :NAROU
40
+ {
41
+ preprocessors: [Preprocessors::Ruby.new, Preprocessors::EscapeNarou.new],
37
42
  postprocessors: [Postprocessors::Ruby.new],
38
- renderer: Renderers::KakuyomuRenderer.new,
43
+ renderer: Renderers::NarouRenderer.new
39
44
  }
40
45
  else
41
- raise ArgumentError, "Invalid option #{option}"
46
+ raise InvalidPresetError, "Invalid preset: #{preset}"
42
47
  end
43
48
  end
44
49
  end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FujiMarkdown
4
+ Error = Class.new(StandardError)
5
+ InvalidPresetError = Class.new(StandardError)
6
+ end
@@ -1,24 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FujiMarkdown
2
4
  module Postprocessors
3
5
  class Ruby
4
- attr_reader :omit_start_symbol
6
+ KANJI_REGEXP = /\A[一-龠々]+\z/.freeze
5
7
 
6
8
  def initialize(omit_start_symbol: false)
7
- @ruby = false
9
+ @ruby = false
8
10
  @omit_start_symbol = omit_start_symbol
9
11
  end
10
12
 
11
13
  def call(doc)
12
14
  doc.walk do |node|
13
- if node.type == :inline_html
14
- process_ruby_node!(node)
15
- end
15
+ process_ruby_node!(node) if node.type == :inline_html
16
16
  end
17
17
  end
18
18
 
19
19
  private
20
20
 
21
- def process_ruby_node!(node)
21
+ def process_ruby_node!(node) # rubocop:disable Metrics/MethodLength
22
22
  case node.string_content
23
23
  when '<ruby>'
24
24
  @ruby = true
@@ -28,22 +28,24 @@ module FujiMarkdown
28
28
  node.delete
29
29
  when '<rt>'
30
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
31
+ kana_node = node.next
32
+ convert_to_kakuyomu_ruby!(kanji_node, kana_node) if @ruby && kana_node.next.string_content == '</rt>'
35
33
  node.delete
36
34
  when '</rt>'
37
35
  node.delete
38
- else
39
- # do nothing
40
36
  end
41
37
  end
42
38
 
43
39
  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/))
40
+ if kanji_node.type == :text && !(@omit_start_symbol && start_symbol_omittable?(kanji_node))
41
+ kanji_node.string_content = "|#{kanji_node.string_content}"
42
+ end
45
43
  kana_node.string_content = "《#{kana_node.string_content}》" if kana_node.type == :text
46
44
  end
45
+
46
+ def start_symbol_omittable?(kanji_node)
47
+ kanji_node.string_content.match?(KANJI_REGEXP) && !kanji_node.previous.string_content[-1].match?(KANJI_REGEXP)
48
+ end
47
49
  end
48
50
  end
49
51
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FujiMarkdown
4
+ module Preprocessors
5
+ class EscapeNarou
6
+ def call(text)
7
+ text.gsub(/([一-龠々])(([\p{Hiragana}\p{Katakana}]+))/, '\1|(\2)')
8
+ .gsub(/([一-龠々])\(([\p{Hiragana}\p{Katakana}]+)\)/, '\1|(\2)')
9
+ .gsub(/《([\p{Hiragana}\p{Katakana}]+)》/, '|《\1》')
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,31 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FujiMarkdown
2
4
  module Preprocessors
3
5
  class Ruby
4
- RUBY_PATTERN =
5
- %r(
6
- {
7
- (?<kanji>[^{}|]*)
8
- \|
9
- (?<kana>[^{}]*)
10
- }
11
- )x
6
+ RUBY_REGEXP = /(?<!\\){(?<kanji>.*?)\|(?<kana>.*?)}/.freeze
12
7
 
13
8
  def call(text)
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?
9
+ text.gsub(RUBY_REGEXP) do |ruby_pattern|
10
+ convert_to_html(ruby_pattern)
11
+ end
12
+ end
17
13
 
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
14
+ private
26
15
 
27
- "<ruby>#{pairs.map { |k, kana| "#{k}<rt>#{kana}</rt>" }.join}</ruby>"
16
+ def convert_to_html(ruby_pattern)
17
+ kanji_chars, *kanas = ruby_pattern[/\A{(.*)}\z/, 1].split('|')
18
+ return "<ruby>#{kanji_chars}<rt></rt></ruby>" if kanas.empty?
19
+
20
+ pairs = kanas.each_with_object([]).with_index do |(kana, arr), i|
21
+ arr << if i == kanas.size - 1
22
+ [kanji_chars[i..], kana]
23
+ else
24
+ [kanji_chars[i], kana]
25
+ end
28
26
  end
27
+
28
+ "<ruby>#{pairs.map { |kanji, kana| "#{kanji}<rt>#{kana}</rt>" }.join}</ruby>"
29
29
  end
30
30
  end
31
31
  end
@@ -1,34 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'commonmarker'
2
4
 
3
5
  module FujiMarkdown
4
6
  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
7
+ def initialize(preprocessors: [], postprocessors: [], renderer: CommonMarker::HtmlRenderer.new)
8
+ @preprocessors = preprocessors
10
9
  @postprocessors = postprocessors
11
- @renderer = renderer
10
+ @renderer = renderer
12
11
  end
13
12
 
14
13
  def parse(text)
15
- processed_text = text.dup
16
-
17
- preprocessors.each do |preprocessor|
18
- preprocessor.call(processed_text)
14
+ processed_text = @preprocessors.inject(text) do |result, preprocessor|
15
+ preprocessor.call(result)
19
16
  end
20
17
 
21
- parser.render_doc(processed_text)
18
+ CommonMarker.render_doc(processed_text)
22
19
  end
23
20
 
24
21
  def render(text)
25
22
  doc = parse(text)
26
23
 
27
- postprocessors.each do |postprocessor|
24
+ @postprocessors.each do |postprocessor|
28
25
  postprocessor.call(doc)
29
26
  end
30
27
 
31
- renderer.render(doc)
28
+ @renderer.render(doc)
32
29
  end
33
30
  end
34
31
  end
@@ -1,26 +1,8 @@
1
- require 'commonmarker'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module FujiMarkdown
4
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
-
5
+ class KakuyomuRenderer < TextRenderer
24
6
  def code_block(node)
25
7
  out("\n") if node.previous&.type&.==(:paragraph)
26
8
  block do
@@ -33,19 +15,9 @@ module FujiMarkdown
33
15
  out('《《', :children, '》》')
34
16
  end
35
17
 
36
- def link(node)
18
+ def link(_node)
37
19
  out(:children)
38
20
  end
39
-
40
- def code(node)
41
- out('`')
42
- out(escape_html(node.string_content))
43
- out('`')
44
- end
45
-
46
- def softbreak(_)
47
- out("\n")
48
- end
49
21
  end
50
22
  end
51
23
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FujiMarkdown
4
+ module Renderers
5
+ class NarouRenderer < TextRenderer
6
+ def code_block(node)
7
+ out("\n") if node.previous&.type&.==(:paragraph)
8
+ block do
9
+ out(escape_html(node.string_content))
10
+ end
11
+ out("\n")
12
+ end
13
+
14
+ def emph(node)
15
+ node.walk do |n|
16
+ n.string_content = n.string_content.chars.map { |char| "|#{char}《・》" }.join if n.type == :text
17
+ end
18
+ out(:children)
19
+ end
20
+
21
+ def link(_node)
22
+ out(:children)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FujiMarkdown
4
+ module Renderers
5
+ class TextRenderer < 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
+ return out(:children) if node.parent.type == :blockquote
16
+
17
+ block do
18
+ out(:children)
19
+ end
20
+ end
21
+
22
+ def blockquote(node)
23
+ out("\n") if node.previous&.type&.==(:paragraph)
24
+ block do
25
+ out('> ', :children)
26
+ end
27
+ out("\n")
28
+ end
29
+
30
+ def hrule(_)
31
+ out("\n")
32
+ end
33
+
34
+ def code_block(node)
35
+ out("\n") if node.previous&.type&.==(:paragraph)
36
+ out('```')
37
+ block do
38
+ out(escape_html(node.string_content))
39
+ end
40
+ out('```')
41
+ out("\n")
42
+ end
43
+
44
+ def emph(_)
45
+ out('*', :children, '*')
46
+ end
47
+
48
+ def link(node)
49
+ out('[', :children, '](', node.url.nil? ? '' : escape_href(node.url), ')')
50
+ end
51
+
52
+ def code(node)
53
+ out('`')
54
+ out(escape_html(node.string_content))
55
+ out('`')
56
+ end
57
+
58
+ def softbreak(_)
59
+ out("\n")
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module FujiMarkdown
2
- VERSION = '0.2.2'
4
+ VERSION = '0.4.1'
3
5
  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.2.2
4
+ version: 0.4.1
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-11-04 00:00:00.000000000 Z
11
+ date: 2020-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: commonmarker
@@ -24,76 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.17'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.16'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.16'
41
- - !ruby/object:Gem::Dependency
42
- name: meowcop
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '12.3'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '12.3'
83
- - !ruby/object:Gem::Dependency
84
- name: rspec
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '3.7'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '3.7'
97
27
  description: FujiMarkdown is the dialect of Markdown supporting extensions for Japanese
98
28
  novels.
99
29
  email:
@@ -103,13 +33,15 @@ executables:
103
33
  extensions: []
104
34
  extra_rdoc_files: []
105
35
  files:
36
+ - ".github/FUNDING.yml"
37
+ - ".github/workflows/gem-push.yml"
38
+ - ".github/workflows/ruby.yml"
106
39
  - ".gitignore"
107
40
  - ".rspec"
108
41
  - ".rubocop.yml"
109
- - ".travis.yml"
42
+ - CHANGELOG.md
110
43
  - CODE_OF_CONDUCT.md
111
44
  - Gemfile
112
- - Gemfile.lock
113
45
  - LICENSE.txt
114
46
  - README.md
115
47
  - Rakefile
@@ -118,15 +50,22 @@ files:
118
50
  - exe/fujimd
119
51
  - fuji_markdown.gemspec
120
52
  - lib/fuji_markdown.rb
53
+ - lib/fuji_markdown/error.rb
121
54
  - lib/fuji_markdown/postprocessors/ruby.rb
55
+ - lib/fuji_markdown/preprocessors/escape_narou.rb
122
56
  - lib/fuji_markdown/preprocessors/ruby.rb
123
57
  - lib/fuji_markdown/processor.rb
124
58
  - lib/fuji_markdown/renderers/kakuyomu_renderer.rb
59
+ - lib/fuji_markdown/renderers/narou_renderer.rb
60
+ - lib/fuji_markdown/renderers/text_renderer.rb
125
61
  - lib/fuji_markdown/version.rb
126
62
  homepage: https://github.com/fuji-nakahara/fuji_markdown
127
63
  licenses:
128
64
  - MIT
129
- metadata: {}
65
+ metadata:
66
+ homepage_uri: https://github.com/fuji-nakahara/fuji_markdown
67
+ source_code_uri: https://github.com/fuji-nakahara/fuji_markdown
68
+ changelog_uri: https://github.com/fuji-nakahara/fuji_markdown/blob/master/CHANGELOG.md
130
69
  post_install_message:
131
70
  rdoc_options: []
132
71
  require_paths:
@@ -135,15 +74,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
74
  requirements:
136
75
  - - ">="
137
76
  - !ruby/object:Gem::Version
138
- version: '0'
77
+ version: '2.6'
139
78
  required_rubygems_version: !ruby/object:Gem::Requirement
140
79
  requirements:
141
80
  - - ">="
142
81
  - !ruby/object:Gem::Version
143
82
  version: '0'
144
83
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.7.6
84
+ rubygems_version: 3.1.4
147
85
  signing_key:
148
86
  specification_version: 4
149
87
  summary: Markdown processor for Japanese novels
@@ -1,7 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.5
5
- - 2.4
6
- - 2.3
7
- before_install: gem install bundler -v 1.16.2
@@ -1,69 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- fuji_markdown (0.2.2)
5
- commonmarker (~> 0.17)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- ast (2.4.0)
11
- coderay (1.1.2)
12
- commonmarker (0.18.1)
13
- ruby-enum (~> 0.5)
14
- concurrent-ruby (1.0.5)
15
- diff-lcs (1.3)
16
- i18n (1.1.1)
17
- concurrent-ruby (~> 1.0)
18
- jaro_winkler (1.5.1)
19
- meowcop (1.17.1)
20
- rubocop (>= 0.57.0)
21
- method_source (0.9.1)
22
- parallel (1.12.1)
23
- parser (2.5.3.0)
24
- ast (~> 2.4.0)
25
- powerpack (0.1.2)
26
- pry (0.11.3)
27
- coderay (~> 1.1.0)
28
- method_source (~> 0.9.0)
29
- rainbow (3.0.0)
30
- rake (12.3.1)
31
- rspec (3.8.0)
32
- rspec-core (~> 3.8.0)
33
- rspec-expectations (~> 3.8.0)
34
- rspec-mocks (~> 3.8.0)
35
- rspec-core (3.8.0)
36
- rspec-support (~> 3.8.0)
37
- rspec-expectations (3.8.2)
38
- diff-lcs (>= 1.2.0, < 2.0)
39
- rspec-support (~> 3.8.0)
40
- rspec-mocks (3.8.0)
41
- diff-lcs (>= 1.2.0, < 2.0)
42
- rspec-support (~> 3.8.0)
43
- rspec-support (3.8.0)
44
- rubocop (0.60.0)
45
- jaro_winkler (~> 1.5.1)
46
- parallel (~> 1.10)
47
- parser (>= 2.5, != 2.5.1.1)
48
- powerpack (~> 0.1)
49
- rainbow (>= 2.2.2, < 4.0)
50
- ruby-progressbar (~> 1.7)
51
- unicode-display_width (~> 1.4.0)
52
- ruby-enum (0.7.2)
53
- i18n
54
- ruby-progressbar (1.10.0)
55
- unicode-display_width (1.4.0)
56
-
57
- PLATFORMS
58
- ruby
59
-
60
- DEPENDENCIES
61
- bundler (~> 1.16)
62
- fuji_markdown!
63
- meowcop
64
- pry
65
- rake (~> 12.3)
66
- rspec (~> 3.7)
67
-
68
- BUNDLED WITH
69
- 1.17.1