fuji_markdown 0.2.1 → 0.4.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: bccca760ab8465e71d02376a9e970d8f1175fa88f292bdb6c343e92ddf48a3e6
4
- data.tar.gz: 961256c1893e014db3a2c34e4f70884e508f9efb4ae4e6c6c810f469ac406b4c
3
+ metadata.gz: 0e641373ec793135f6072dc2525b081db86b590618260ced757ba79a9e92604c
4
+ data.tar.gz: 52ea47ffb8b02107bc7071c9895ec111d1763d38c46bbde0f1d37e99509f3aab
5
5
  SHA512:
6
- metadata.gz: 19227c0a43c7ace5c99b93792318f258aea845a8d65ce24f3f2f6f19f696de664ec4065b236aabb14f6230493f421da74d00c181bcce5e903724d2f10dab75c6
7
- data.tar.gz: 1e741ef1ed9c4245ed76a79c837c11641b3eb076bc3dec2a900b03856cd85b741d3a18cf81fd6d4f0d213b2370f1ade203147f4b987f59e47523311585022991
6
+ metadata.gz: 10eb84854b743bdf5d17af4b386a974b9523f106c2d8d905a14df9dbef7bc3571fcad4823f3fc473dd12529a9223deb3b8f461eb97f4c6e594bbb828ea42ec92
7
+ data.tar.gz: 9d6a3ddc3b9518b967f7ce4afa02a6de998d323c779dcdbba24d2ff41f43997b2dd5b492dcc01fe8adbe7450ab4ee78a40bf40b026dae7dd565c38cc399f05cb
@@ -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,22 @@
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.0] - 2020-10-12
11
+
12
+ ### Added
13
+
14
+ - Add CHANGELOG.md.
15
+
16
+ ### Changed
17
+
18
+ - Specify required_ruby_version to '>= 2.6'.
19
+ - Make preprocessors not to change given text destructively.
20
+
21
+ [Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.4.0...HEAD
22
+ [0.4.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.3.1...v0.4.0
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
 
@@ -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 project’s 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,45 +1,45 @@
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
- class << self
12
- def parse(text, option = :HTML)
13
- processor(option).parse(text)
14
- end
13
+ PRESETS = {
14
+ HTML: {
15
+ preprocessors: [Preprocessors::Ruby.new],
16
+ renderer: CommonMarker::HtmlRenderer.new(options: %i[HARDBREAKS UNSAFE])
17
+ },
18
+ KAKUYOMU: {
19
+ preprocessors: [Preprocessors::Ruby.new, proc { |text| text.gsub(/《/, '|《') }],
20
+ postprocessors: [Postprocessors::Ruby.new],
21
+ renderer: Renderers::KakuyomuRenderer.new
22
+ },
23
+ NAROU: {
24
+ preprocessors: [Preprocessors::Ruby.new, Preprocessors::EscapeNarou.new],
25
+ postprocessors: [Postprocessors::Ruby.new],
26
+ renderer: Renderers::NarouRenderer.new
27
+ }
28
+ }.freeze
15
29
 
16
- def render(text, option = :HTML)
17
- processor(option).render(text)
18
- end
19
-
20
- private
21
-
22
- def processor(option)
23
- args = processor_args(option)
24
- Processor.new(args)
30
+ class << self
31
+ def parse(text, preset = :HTML)
32
+ options = PRESETS.fetch(preset)
33
+ Processor.new(**options).parse(text)
34
+ rescue KeyError => e
35
+ raise InvalidPresetError, "Invalid preset: #{e.key}"
25
36
  end
26
37
 
27
- def processor_args(option)
28
- case option
29
- when :HTML
30
- {
31
- preprocessors: [Preprocessors::Ruby.new],
32
- renderer: CommonMarker::HtmlRenderer.new(options: [:HARDBREAKS, :UNSAFE]),
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
38
+ def render(text, preset = :HTML)
39
+ options = PRESETS.fetch(preset)
40
+ Processor.new(**options).render(text)
41
+ rescue KeyError => e
42
+ raise InvalidPresetError, "Invalid preset: #{e.key}"
43
43
  end
44
44
  end
45
45
  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,13 +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 softbreak(_)
41
- out("\n")
42
- end
43
21
  end
44
22
  end
45
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.1'
4
+ VERSION = '0.4.0'
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.1
4
+ version: 0.4.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-11-04 00:00:00.000000000 Z
11
+ date: 2020-10-12 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.1)
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