fuji_markdown 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|