fuji_markdown 0.2.3 → 0.3.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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +20 -3
- data/exe/fujimd +1 -1
- data/lib/fuji_markdown.rb +14 -5
- data/lib/fuji_markdown/postprocessors/ruby.rb +3 -3
- data/lib/fuji_markdown/preprocessors/escape_narou.rb +11 -0
- data/lib/fuji_markdown/preprocessors/ruby.rb +1 -8
- data/lib/fuji_markdown/processor.rb +3 -5
- data/lib/fuji_markdown/renderers/kakuyomu_renderer.rb +1 -41
- data/lib/fuji_markdown/renderers/narou_renderer.rb +26 -0
- data/lib/fuji_markdown/renderers/text_renderer.rb +61 -0
- data/lib/fuji_markdown/version.rb +1 -1
- 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: 4ec58909236c9cff6ddf2e3c280f62f41548ea3e62e1d2336ef825b8a18ed5ff
|
4
|
+
data.tar.gz: 4fbfd254823a2ae17baebc17e8d8ca49a8077b1738f47ffb17d12f0b3409ab74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '01829618095700ddb3bc36a1bb07436e724115dd4c29a5ad9d314ced11bf707e6b99b677fcabf814725d768b6adb11ec32313cecb597c9898be5fc42ca5b3327'
|
7
|
+
data.tar.gz: 6b4b5b47ae5471eb6370b9e80ede54b7bffbef0cea0df32b77e2a987cf6e52ce439ed795bf6528defb4803ce65ed5b587f21a7319704dbf890ca6741870b20ad
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -21,9 +21,26 @@ Or install it yourself as:
|
|
21
21
|
|
22
22
|
## Usage
|
23
23
|
|
24
|
-
|
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-
|
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/
|
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/exe/fujimd
CHANGED
@@ -8,7 +8,7 @@ option = :HTML
|
|
8
8
|
OptionParser.new do |opts|
|
9
9
|
opts.banner = 'Usage: fujimd [--output <format>] <file>...'
|
10
10
|
|
11
|
-
opts.on('-o', '--output FORMAT', 'Specify output format:
|
11
|
+
opts.on('-o', '--output FORMAT', 'Specify output format: kakuyomu, narou or html') do |fmt|
|
12
12
|
option = fmt.upcase.to_sym
|
13
13
|
end
|
14
14
|
|
data/lib/fuji_markdown.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
|
+
require 'commonmarker'
|
2
|
+
|
1
3
|
require_relative 'fuji_markdown/processor'
|
2
4
|
require_relative 'fuji_markdown/version'
|
3
5
|
|
4
6
|
require_relative 'fuji_markdown/postprocessors/ruby'
|
5
7
|
require_relative 'fuji_markdown/preprocessors/ruby'
|
8
|
+
require_relative 'fuji_markdown/preprocessors/escape_narou'
|
9
|
+
require_relative 'fuji_markdown/renderers/text_renderer'
|
6
10
|
require_relative 'fuji_markdown/renderers/kakuyomu_renderer'
|
7
|
-
|
8
|
-
require 'commonmarker'
|
11
|
+
require_relative 'fuji_markdown/renderers/narou_renderer'
|
9
12
|
|
10
13
|
module FujiMarkdown
|
11
14
|
class << self
|
@@ -29,13 +32,19 @@ module FujiMarkdown
|
|
29
32
|
when :HTML
|
30
33
|
{
|
31
34
|
preprocessors: [Preprocessors::Ruby.new],
|
32
|
-
renderer:
|
35
|
+
renderer: CommonMarker::HtmlRenderer.new(options: [:HARDBREAKS, :UNSAFE]),
|
33
36
|
}
|
34
37
|
when :KAKUYOMU
|
35
38
|
{
|
36
|
-
preprocessors:
|
39
|
+
preprocessors: [Preprocessors::Ruby.new, Proc.new { |text| text.gsub!(/《/, '|《') }],
|
40
|
+
postprocessors: [Postprocessors::Ruby.new],
|
41
|
+
renderer: Renderers::KakuyomuRenderer.new,
|
42
|
+
}
|
43
|
+
when :NAROU
|
44
|
+
{
|
45
|
+
preprocessors: [Preprocessors::Ruby.new, Preprocessors::EscapeNarou.new],
|
37
46
|
postprocessors: [Postprocessors::Ruby.new],
|
38
|
-
renderer:
|
47
|
+
renderer: Renderers::NarouRenderer.new,
|
39
48
|
}
|
40
49
|
else
|
41
50
|
raise ArgumentError, "Invalid option #{option}"
|
@@ -4,7 +4,7 @@ module FujiMarkdown
|
|
4
4
|
attr_reader :omit_start_symbol
|
5
5
|
|
6
6
|
def initialize(omit_start_symbol: false)
|
7
|
-
@ruby
|
7
|
+
@ruby = false
|
8
8
|
@omit_start_symbol = omit_start_symbol
|
9
9
|
end
|
10
10
|
|
@@ -28,7 +28,7 @@ module FujiMarkdown
|
|
28
28
|
node.delete
|
29
29
|
when '<rt>'
|
30
30
|
kanji_node = node.previous
|
31
|
-
kana_node
|
31
|
+
kana_node = node.next
|
32
32
|
if @ruby && kana_node.next.string_content == '</rt>'
|
33
33
|
convert_to_kakuyomu_ruby!(kanji_node, kana_node)
|
34
34
|
end
|
@@ -42,7 +42,7 @@ module FujiMarkdown
|
|
42
42
|
|
43
43
|
def convert_to_kakuyomu_ruby!(kanji_node, kana_node)
|
44
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
|
45
|
+
kana_node.string_content = "《#{kana_node.string_content}》" if kana_node.type == :text
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module FujiMarkdown
|
2
|
+
module Preprocessors
|
3
|
+
class EscapeNarou
|
4
|
+
def call(text)
|
5
|
+
text.gsub!(/([一-龠々])(([\p{Hiragana}\p{Katakana}]+))/, '\1|(\2)')
|
6
|
+
text.gsub!(/([一-龠々])\(([\p{Hiragana}\p{Katakana}]+)\)/, '\1|(\2)')
|
7
|
+
text.gsub!(/《([\p{Hiragana}\p{Katakana}]+)》/, '|《\1》')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,14 +1,7 @@
|
|
1
1
|
module FujiMarkdown
|
2
2
|
module Preprocessors
|
3
3
|
class Ruby
|
4
|
-
RUBY_PATTERN =
|
5
|
-
%r(
|
6
|
-
{
|
7
|
-
(?<kanji>[^{}|]*)
|
8
|
-
\|
|
9
|
-
(?<kana>[^{}]*)
|
10
|
-
}
|
11
|
-
)x
|
4
|
+
RUBY_PATTERN = %r({(?<kanji>[^{}|]*)\|(?<kana>[^{}]*)})
|
12
5
|
|
13
6
|
def call(text)
|
14
7
|
text.gsub!(RUBY_PATTERN) do |match|
|
@@ -1,14 +1,12 @@
|
|
1
|
-
require 'commonmarker'
|
2
|
-
|
3
1
|
module FujiMarkdown
|
4
2
|
class Processor
|
5
3
|
attr_reader :preprocessors, :parser, :postprocessors, :renderer
|
6
4
|
|
7
5
|
def initialize(preprocessors: [], parser: CommonMarker, postprocessors: [], renderer: CommonMarker::HtmlRenderer.new)
|
8
|
-
@preprocessors
|
9
|
-
@parser
|
6
|
+
@preprocessors = preprocessors
|
7
|
+
@parser = parser
|
10
8
|
@postprocessors = postprocessors
|
11
|
-
@renderer
|
9
|
+
@renderer = renderer
|
12
10
|
end
|
13
11
|
|
14
12
|
def parse(text)
|
@@ -1,36 +1,6 @@
|
|
1
|
-
require 'commonmarker'
|
2
|
-
|
3
1
|
module FujiMarkdown
|
4
2
|
module Renderers
|
5
|
-
class KakuyomuRenderer <
|
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
|
-
|
3
|
+
class KakuyomuRenderer < TextRenderer
|
34
4
|
def code_block(node)
|
35
5
|
out("\n") if node.previous&.type&.==(:paragraph)
|
36
6
|
block do
|
@@ -46,16 +16,6 @@ module FujiMarkdown
|
|
46
16
|
def link(node)
|
47
17
|
out(:children)
|
48
18
|
end
|
49
|
-
|
50
|
-
def code(node)
|
51
|
-
out('`')
|
52
|
-
out(escape_html(node.string_content))
|
53
|
-
out('`')
|
54
|
-
end
|
55
|
-
|
56
|
-
def softbreak(_)
|
57
|
-
out("\n")
|
58
|
-
end
|
59
19
|
end
|
60
20
|
end
|
61
21
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module FujiMarkdown
|
2
|
+
module Renderers
|
3
|
+
class NarouRenderer < TextRenderer
|
4
|
+
def code_block(node)
|
5
|
+
out("\n") if node.previous&.type&.==(:paragraph)
|
6
|
+
block do
|
7
|
+
out(escape_html(node.string_content))
|
8
|
+
end
|
9
|
+
out("\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
def emph(node)
|
13
|
+
node.walk do |n|
|
14
|
+
if n.type == :text
|
15
|
+
n.string_content = n.string_content.chars.map { |char| "|#{char}《・》"}.join
|
16
|
+
end
|
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,61 @@
|
|
1
|
+
module FujiMarkdown
|
2
|
+
module Renderers
|
3
|
+
class TextRenderer < CommonMarker::HtmlRenderer
|
4
|
+
def header(node)
|
5
|
+
out("\n") if node.previous&.type&.==(:paragraph)
|
6
|
+
block do
|
7
|
+
out('#' * node.header_level, ' ', :children)
|
8
|
+
end
|
9
|
+
out("\n")
|
10
|
+
end
|
11
|
+
|
12
|
+
def paragraph(node)
|
13
|
+
return out(:children) if node.parent.type == :blockquote
|
14
|
+
|
15
|
+
block do
|
16
|
+
out(:children)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def blockquote(node)
|
21
|
+
out("\n") if node.previous&.type&.==(:paragraph)
|
22
|
+
block do
|
23
|
+
out('> ', :children)
|
24
|
+
end
|
25
|
+
out("\n")
|
26
|
+
end
|
27
|
+
|
28
|
+
def hrule(_)
|
29
|
+
out("\n")
|
30
|
+
end
|
31
|
+
|
32
|
+
def code_block(node)
|
33
|
+
out("\n") if node.previous&.type&.==(:paragraph)
|
34
|
+
out('```')
|
35
|
+
block do
|
36
|
+
out(escape_html(node.string_content))
|
37
|
+
end
|
38
|
+
out('```')
|
39
|
+
out("\n")
|
40
|
+
end
|
41
|
+
|
42
|
+
def emph(_)
|
43
|
+
out('*', :children, '*')
|
44
|
+
end
|
45
|
+
|
46
|
+
def link(node)
|
47
|
+
out('[', :children, '](', node.url.nil? ? '' : escape_href(node.url), ')')
|
48
|
+
end
|
49
|
+
|
50
|
+
def code(node)
|
51
|
+
out('`')
|
52
|
+
out(escape_html(node.string_content))
|
53
|
+
out('`')
|
54
|
+
end
|
55
|
+
|
56
|
+
def softbreak(_)
|
57
|
+
out("\n")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
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.3.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-
|
11
|
+
date: 2018-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commonmarker
|
@@ -119,9 +119,12 @@ files:
|
|
119
119
|
- fuji_markdown.gemspec
|
120
120
|
- lib/fuji_markdown.rb
|
121
121
|
- lib/fuji_markdown/postprocessors/ruby.rb
|
122
|
+
- lib/fuji_markdown/preprocessors/escape_narou.rb
|
122
123
|
- lib/fuji_markdown/preprocessors/ruby.rb
|
123
124
|
- lib/fuji_markdown/processor.rb
|
124
125
|
- lib/fuji_markdown/renderers/kakuyomu_renderer.rb
|
126
|
+
- lib/fuji_markdown/renderers/narou_renderer.rb
|
127
|
+
- lib/fuji_markdown/renderers/text_renderer.rb
|
125
128
|
- lib/fuji_markdown/version.rb
|
126
129
|
homepage: https://github.com/fuji-nakahara/fuji_markdown
|
127
130
|
licenses:
|