cheepub 0.9.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +33 -0
  3. data/README.md +25 -1
  4. data/Rakefile +1 -1
  5. data/cheepub.gemspec +9 -8
  6. data/lib/cheepub.rb +5 -0
  7. data/lib/cheepub/asset_store.rb +59 -0
  8. data/lib/cheepub/content.rb +4 -14
  9. data/lib/cheepub/converter/cheehtml.rb +29 -0
  10. data/lib/cheepub/converter/cheelatex.rb +19 -0
  11. data/lib/cheepub/ext_hash.rb +12 -0
  12. data/lib/cheepub/generator/epub.rb +25 -7
  13. data/lib/cheepub/generator/latex.rb +16 -2
  14. data/lib/cheepub/i18n.rb +131 -0
  15. data/lib/cheepub/nav.rb +5 -1
  16. data/lib/cheepub/version.rb +1 -1
  17. data/lib/kramdown/parser/cheemarkdown.rb +1 -1
  18. data/samples/anausa_perter/anausa_peterno_hanashi.md +164 -0
  19. data/samples/anausa_perter/fig51344_01.png +0 -0
  20. data/samples/anausa_perter/fig51344_02.png +0 -0
  21. data/samples/anausa_perter/fig51344_03.png +0 -0
  22. data/samples/anausa_perter/fig51344_04.png +0 -0
  23. data/samples/anausa_perter/fig51344_05.png +0 -0
  24. data/samples/anausa_perter/fig51344_06.png +0 -0
  25. data/samples/anausa_perter/fig51344_07.png +0 -0
  26. data/samples/anausa_perter/fig51344_08.png +0 -0
  27. data/samples/anausa_perter/fig51344_09.png +0 -0
  28. data/samples/anausa_perter/fig51344_10.png +0 -0
  29. data/samples/anausa_perter/fig51344_11.png +0 -0
  30. data/samples/anausa_perter/fig51344_12.png +0 -0
  31. data/samples/anausa_perter/fig51344_13.png +0 -0
  32. data/samples/anausa_perter/fig51344_14.png +0 -0
  33. data/samples/anausa_perter/fig51344_15.png +0 -0
  34. data/samples/anausa_perter/fig51344_16.png +0 -0
  35. data/samples/anausa_perter/fig51344_17.png +0 -0
  36. data/samples/anausa_perter/fig51344_18.png +0 -0
  37. data/samples/anausa_perter/fig51344_19.png +0 -0
  38. data/samples/anausa_perter/fig51344_20.png +0 -0
  39. data/samples/anausa_perter/fig51344_21.png +0 -0
  40. data/samples/anausa_perter/fig51344_22.png +0 -0
  41. data/samples/anausa_perter/fig51344_23.png +0 -0
  42. data/samples/anausa_perter/fig51344_24.png +0 -0
  43. data/samples/anausa_perter/fig51344_25.png +0 -0
  44. data/samples/anausa_perter/fig51344_26.png +0 -0
  45. data/samples/anausa_perter/fig51344_27.png +0 -0
  46. data/samples/anausa_perter/fig51344_28.png +0 -0
  47. data/samples/anausa_perter/fig51344_29.png +0 -0
  48. data/samples/sangetsuki_colophon.md +67 -0
  49. data/templates/colophon.xhtml.erb +70 -0
  50. metadata +75 -27
  51. data/.travis.yml +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dc94d079a5e14e768ec79d72d23648c2718ae7de64c8783d099bcb80290dee85
4
- data.tar.gz: 34a9f53cdf27f298daf2369e973ccbb9eabea61e6e727340081404b6a1eaa1c4
3
+ metadata.gz: 1015b4ec48bfa86664b7f668a72577449950595770dadae33c5a5ae3b179ceb6
4
+ data.tar.gz: 35098a489d44ab31873a55fa7c570c5a745a576df2f7e8ccc2da7179a708ec41
5
5
  SHA512:
6
- metadata.gz: 992e95e9ec3a5343c3094fdfea29abb2bef71bf82121fe0668940847b3d356958dcc9e3e82830ec03289091156f52e2b6e8edbb2b724cbaae30dc1fc21eeddfd
7
- data.tar.gz: 8152e4bf67f26e086064a6c3d764294b791f7530011070f5083dd0a8faed7420e74c7109e14dea41ebee698b6646ba4a68384741b7465f67cc364b0a92bf9cb9
6
+ metadata.gz: f997970ac3bf3630ad99307995c2e1f20dc0e4b45a265efe3d19b1ecab791497c3ee528928016feda0d681d132b72b6efbb50bc481ed7795c7fa7104f648ffa0
7
+ data.tar.gz: 912c3634e3f2a5023de7ce9474de30e1225a6069578c97313ad636dc6acae895f69e6209edfd077efca3b50f2c09928e782b231f3d6171366b94c98d4b77a780
@@ -0,0 +1,33 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - uses: actions/checkout@v2
23
+ - name: Set up Ruby
24
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
25
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
26
+ # uses: ruby/setup-ruby@v1
27
+ uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
28
+ with:
29
+ ruby-version: 2.6
30
+ - name: Install dependencies
31
+ run: bundle install
32
+ - name: Run tests
33
+ run: bundle exec rake
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Cheepub
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/cheepub.svg)](https://badge.fury.io/rb/cheepub) [![Build Status](https://travis-ci.org/takahashim/cheepub.svg?branch=master)](https://travis-ci.org/takahashim/cheepub) [![Maintainability](https://api.codeclimate.com/v1/badges/15d5db3048b9067703a6/maintainability)](https://codeclimate.com/github/takahashim/cheepub/maintainability) [![Dependency Status](https://gemnasium.com/badges/github.com/takahashim/cheepub.svg)](https://gemnasium.com/github.com/takahashim/cheepub)
3
+ [![Gem Version](https://badge.fury.io/rb/cheepub.svg)](https://badge.fury.io/rb/cheepub)
4
+ [![Build Status](https://github.com/takahashim/cheepub/workflows/Ruby/badge.svg)](https://github.com/takahashim/cheepub/actions)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/15d5db3048b9067703a6/maintainability)](https://codeclimate.com/github/takahashim/cheepub/maintainability)
4
6
 
5
7
 
6
8
  Cheepub is EPUB/PDF generator from Markdown. When you have markdown file, you can generate EPUB3 file with just one command: `cheepub sample.md`.
@@ -93,9 +95,31 @@ In a little district west of Washington Square the streets have run crazy and br
93
95
  * lastModified: last modified date-time
94
96
  * pageDirection: `ltr` (horizontal) or `rtl` (vertical)
95
97
  * titlepage: add titlepage
98
+ * colophone: add colophon page
99
+ * colophone_before, colophone_after: some notes before/after colophon table
100
+ * (LaTeX) latexCommand: command name of LaTeX (`uplatex` or `lualatex`)
101
+ * (LaTeX) documentClass: document class and options. (ex. `["jlreq", "tate,book,a4paper,twocolumn,openany"]`)
102
+
96
103
 
97
104
  ## History
98
105
 
106
+ ### 0.13.0
107
+
108
+ - update `kramdown`, `gepub` and `rb_latex`
109
+
110
+ ### 0.12.0
111
+
112
+ - support colophon_(before|after) in EPUB
113
+
114
+ ### 0.11.0
115
+
116
+ - support titlepage in LaTeX
117
+ - support colophon in LaTeX
118
+
119
+ ### 0.10.0
120
+
121
+ - support Images in EPUB
122
+
99
123
  ### 0.9.0
100
124
 
101
125
  - support Markdown (pipe) table
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rake/clean'
5
5
  Rake::TestTask.new(:test) do |t|
6
6
  t.libs << "test"
7
7
  t.libs << "lib"
8
- t.options = "--max-diff-target-string-size=10000"
8
+ t.options = "--max-diff-target-string-size=100000"
9
9
  t.test_files = FileList["test/**/*_test.rb"]
10
10
  end
11
11
 
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["takahashim"]
9
9
  spec.email = ["maki@rubycolor.org"]
10
10
 
11
- spec.summary = "Simple EPUB generator from Markdown"
12
- spec.description = %q{Simple EPUB generator from Markdown. Inspired by denden converter}
11
+ spec.summary = "Simple EPUB/PDF generator from Markdown"
12
+ spec.description = %q{Simple EPUB/PDF generator from Markdown. Inspired by denden converter}
13
13
  spec.homepage = "https://github.com/takahashim/cheepub"
14
14
 
15
15
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -19,17 +19,18 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "gepub", "~> 0.7"
23
- spec.add_dependency "kramdown", "~> 1.16"
22
+ spec.add_dependency "gepub", "~> 1.0.2"
23
+ spec.add_dependency "kramdown"
24
+ spec.add_dependency "kramdown-parser-gfm", "~> 1.0.1"
24
25
  spec.add_dependency "clamp", "~> 1.2"
25
26
  spec.add_dependency "oga", "~> 2.15"
26
27
  spec.add_dependency "coderay"
27
28
  spec.add_dependency "rouge"
28
- spec.add_dependency "rb_latex", "~> 0.2.1"
29
+ spec.add_dependency "rb_latex"
29
30
 
30
- spec.add_development_dependency "rufo", "~> 0.3"
31
- spec.add_development_dependency "bundler", "~> 1.16"
32
- spec.add_development_dependency "rake", "~> 12.0"
31
+ spec.add_development_dependency "rufo"
32
+ spec.add_development_dependency "bundler"
33
+ spec.add_development_dependency "rake"
33
34
  spec.add_development_dependency "test-unit", "~> 3.2"
34
35
  spec.add_development_dependency "test-unit-notify"
35
36
  spec.add_development_dependency "terminal-notifier"
@@ -10,6 +10,7 @@ require "cheepub/version"
10
10
  require "cheepub/error"
11
11
  require "cheepub/ext_hash"
12
12
  require "cheepub/markdown"
13
+ require "kramdown"
13
14
  require "kramdown/parser/cheemarkdown"
14
15
  require "cheepub/cli"
15
16
  require "cheepub/generator"
@@ -20,7 +21,11 @@ require "cheepub/heading_parser"
20
21
  require "cheepub/heading_item"
21
22
  require "cheepub/nav"
22
23
  require "cheepub/converter/cheelatex"
24
+ require "cheepub/converter/cheehtml"
25
+ require "cheepub/asset_store"
26
+ require "cheepub/i18n"
23
27
 
24
28
  module Cheepub
25
29
  TEMPLATES_DIR = File.join(File.dirname(__FILE__), "../templates")
30
+ IMAGE_DIR = "images"
26
31
  end
@@ -0,0 +1,59 @@
1
+ require 'digest/sha2'
2
+ require 'base64'
3
+ require 'fileutils'
4
+ require 'tmpdir'
5
+ require 'pathname'
6
+ require 'open-uri'
7
+
8
+ module Cheepub
9
+ class AssetStore
10
+ def initialize(asset_dir, base_dir)
11
+ @store = {}
12
+ @asset_dir = Pathname.new(asset_dir)
13
+ @base_dir = Pathname.new(base_dir || ".")
14
+ end
15
+
16
+ def store(src, dir)
17
+ ext = File.extname(src)
18
+ if src =~ /^(https?:|\/)/
19
+ img_content = open(src){|f| f.read}
20
+ else
21
+ img_content = open(File.join(@base_dir, src)){|f| f.read}
22
+ end
23
+ img_path = asset_file_path(img_content, dir, ext)
24
+ if !@store[src]
25
+ @store[src] = img_path
26
+ FileUtils.mkdir_p(img_path.dirname.to_s)
27
+ File.write(img_path.to_s, img_content)
28
+ end
29
+ img_path.relative_path_from(@asset_dir)
30
+ end
31
+
32
+ def clear
33
+ FileUtils.remove_entry_secure(@asset_dir.to_s)
34
+ end
35
+
36
+ def [](key)
37
+ @store[key]
38
+ end
39
+
40
+ def []=(key,val)
41
+ @store[key] = val
42
+ end
43
+
44
+ def each_relpath_and_content(&proc)
45
+ @store.each do |key, val|
46
+ path = val.relative_path_from(@asset_dir)
47
+ content = File.read(val)
48
+ yield path.to_s, content
49
+ end
50
+ end
51
+
52
+ def asset_file_path(content, dir, ext)
53
+ hash_val = Digest::SHA256.digest(content)
54
+ basename = Base64.urlsafe_encode64(hash_val).gsub(/=/,"")
55
+ path = @asset_dir + dir + "#{basename}#{ext}"
56
+ path
57
+ end
58
+ end
59
+ end
@@ -2,6 +2,7 @@ require 'yaml'
2
2
 
3
3
  module Cheepub
4
4
  class Content
5
+ include Enumerable
5
6
  using Cheepub::ExtHash
6
7
 
7
8
  SEPARATOR_PATTERN = /\n\n(?:\={3,}|\-{6,})\s*\n\n/m
@@ -18,20 +19,9 @@ module Cheepub
18
19
  @pages = separate_pages(@body)
19
20
  end
20
21
 
21
- def converted_pages(target = :to_html)
22
- @pages.map{ |page| Cheepub::Markdown.new(page).__send__(target) }
23
- end
24
-
25
- def each_content_with_filename(ext)
26
- if ext == "xhtml"
27
- target = :to_html
28
- elsif ext == "tex"
29
- target = :to_latex
30
- else
31
- raise Cheepub::Error, "invalid ext: #{ext}"
32
- end
33
- converted_pages(target).each_with_index do |page, idx|
34
- yield page, "bodymatter_#{idx}.#{ext}"
22
+ def each
23
+ @pages.each do |page|
24
+ yield page
35
25
  end
36
26
  end
37
27
 
@@ -0,0 +1,29 @@
1
+ module Cheepub
2
+ module Converter
3
+ module CheeHtml
4
+
5
+ def initialize(root, options)
6
+ super
7
+ @asset_store = @options[:asset_store]
8
+ end
9
+
10
+ def convert_img(el, indent)
11
+ if !@options[:ignore_images]
12
+ replace_img_path(el)
13
+ end
14
+ super
15
+ end
16
+
17
+ def replace_img_path(el)
18
+ src = el.attr['src']
19
+ img_path = @asset_store.store(src, Cheepub::IMAGE_DIR)
20
+ el.attr['src'] = img_path
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ class Kramdown::Converter::Html
27
+ attr_reader :asset_store
28
+ prepend Cheepub::Converter::CheeHtml
29
+ end
@@ -14,6 +14,25 @@ module Cheepub
14
14
  end
15
15
  end
16
16
 
17
+ def convert_standalone_image(el, opts, img)
18
+ "#{img}\n"
19
+ end
20
+
21
+ def convert_img(el, opts)
22
+ line = el.options[:location]
23
+ angle = @options[:page_direction] == "rtl" ? 90 : 0
24
+ if el.attr['src'] =~ /^(https?|ftps?):\/\//
25
+ warning("Cannot include non-local image#{line ? " (line #{line})" : ''}")
26
+ ''
27
+ elsif !el.attr['src'].empty?
28
+ @data[:packages] << 'graphicx'
29
+ "#{latex_link_target(el)}\\includegraphics[angle=#{angle}]{#{el.attr['src']}}"
30
+ else
31
+ warning("Cannot include image with empty path#{line ? " (line #{line})" : ''}")
32
+ ''
33
+ end
34
+ end
35
+
17
36
  def convert_codeblock(el, opts)
18
37
  show_whitespace = el.attr['class'].to_s =~ /\bshow-whitespaces\b/
19
38
  lang = extract_code_language(el.attr)
@@ -14,6 +14,18 @@ module Cheepub
14
14
  def key_to_sym(key)
15
15
  (key.to_sym rescue nil) || key
16
16
  end
17
+
18
+ def deep_merge!(other_hash, &block)
19
+ merge!(other_hash) do |key, this_val, other_val|
20
+ if this_val.is_a?(Hash) && other_val.is_a?(Hash)
21
+ this_val.dup.deep_merge!(other_val, &block)
22
+ elsif block_given?
23
+ block.call(key, this_val, other_val)
24
+ else
25
+ other_val
26
+ end
27
+ end
28
+ end
17
29
  end
18
30
  end
19
31
  end
@@ -11,6 +11,8 @@ module Cheepub
11
11
  def initialize(src, params = Hash.new)
12
12
  super
13
13
  @book = GEPUB::Book.new
14
+ @asset_store = AssetStore.new(Dir.mktmpdir("cheepub"), @src ? File.dirname(@src) : nil)
15
+ params[:asset_store] = @asset_store
14
16
  end
15
17
 
16
18
  def output_file(params)
@@ -33,22 +35,23 @@ module Cheepub
33
35
  ## book.date= params[:date] || Time.now
34
36
  @book.add_date(params[:date] || Time.now, nil)
35
37
  @book.lastmodified = params[:lastModified] || Time.now
36
- @book.page_progression_direction = params[:pageDirection]
38
+ @book.page_progression_direction = params[:pageDirection] || "ltr"
37
39
  style_content = apply_template("style.css.erb")
38
40
  @book.add_item("style.css").add_raw_content(style_content)
39
41
  @book.ordered do
40
42
  make_titlepage(params)
41
43
  nav = Cheepub::Nav.new(@content)
42
44
  @book.add_item('nav.xhtml', nil,nil,'properties'=>['nav']).add_raw_content(nav.to_html)
43
- @content.each_content_with_filename("xhtml") do |html, filename|
45
+ @content.each_with_index do |file, idx|
46
+ html = Cheepub::Markdown.new(file, asset_store: @asset_store).to_html
47
+ filename = "bodymatter_#{idx}.xhtml"
44
48
  @book.add_item(filename).add_raw_content(html)
45
49
  end
50
+ make_colophon(params)
51
+ end
52
+ @asset_store.each_relpath_and_content do |path, content|
53
+ @book.add_item(path).add_raw_content(content)
46
54
  end
47
- end
48
-
49
- def apply_template(template_file)
50
- template = File.read(File.join(Cheepub::TEMPLATES_DIR, template_file))
51
- return ERB.new(template).result(binding)
52
55
  end
53
56
 
54
57
  def make_titlepage(params)
@@ -57,6 +60,21 @@ module Cheepub
57
60
  @book.add_item("titlepage.xhtml").add_raw_content(titlepage_content)
58
61
  end
59
62
  end
63
+
64
+ def make_colophon(params)
65
+ if params[:colophon]
66
+ @colophon = params[:colophon]
67
+ @colophon_before = params[:colophon_before] || ""
68
+ @colophon_after = params[:colophon_after] || ""
69
+ content = apply_template("colophon.xhtml.erb")
70
+ @book.add_item("colophon.xhtml").add_raw_content(content)
71
+ end
72
+ end
73
+
74
+ def apply_template(template_file)
75
+ template = File.read(File.join(Cheepub::TEMPLATES_DIR, template_file))
76
+ return ERB.new(template).result(binding)
77
+ end
60
78
  end
61
79
  end
62
80
  end
@@ -28,7 +28,7 @@ module Cheepub
28
28
  parse_creator(params[:creator])
29
29
  ##@maker.language = params[:language] || 'ja'
30
30
  @maker.publisher = params[:publisher] if params[:publisher]
31
- @maker.date= params[:date] || Time.now
31
+ @maker.date = params[:date] || Time.now
32
32
  @maker.lastmodified = params[:lastModified] || Time.now
33
33
  @maker.page_progression_direction = params[:pageDirection]
34
34
  if params.key?(:latexCommand)
@@ -41,7 +41,21 @@ module Cheepub
41
41
  if params[:documentClass]
42
42
  @maker.document_class = params[:documentClass]
43
43
  end
44
- @content.each_content_with_filename("tex") do |content, filename|
44
+ if params[:titlepage]
45
+ @maker.titlepage = params[:titlepage]
46
+ end
47
+ if params[:colophon]
48
+ @maker.colophon = params[:colophon]
49
+ end
50
+ if params[:colophon_before]
51
+ @maker.colophon_before = params[:colophon_before].gsub(/\n/m, "\\par ") + "\\vspace{5mm} \\par\n"
52
+ end
53
+ if params[:colophon_after]
54
+ @maker.colophon_after = params[:colophon_after].gsub(/\n/m, "\\par ")
55
+ end
56
+ @content.each_with_index do |file, idx|
57
+ content = Cheepub::Markdown.new(file, page_direction: params[:pageDirection]).to_latex
58
+ filename = "bodymatter_#{idx}.tex"
45
59
  @maker.add_item(filename, content)
46
60
  end
47
61
  end
@@ -0,0 +1,131 @@
1
+ require 'cheepub/ext_hash'
2
+
3
+ module Cheepub
4
+ class I18n
5
+ using Cheepub::ExtHash
6
+
7
+ ## some codes are from Ruby's I18n https://github.com/svenfuchs/i18n/
8
+
9
+ class InterpolateError < ArgumentError
10
+ def initialize(key, values, str)
11
+ @key, @values, @str = key, values, str
12
+ super "missing interpolation argument #{key.inspect} in #{str.inspect} (#{values.inspect} given)"
13
+ end
14
+ end
15
+
16
+ class InvalidLocaleData < ArgumentError
17
+ attr_reader :filename
18
+ def initialize(filename, exception_message)
19
+ @filename, @exception_message = filename, exception_message
20
+ super "can not load translations from #{filename}: #{exception_message}"
21
+ end
22
+ end
23
+
24
+ INTERPOLATION_PATTERN = %r<(?:%%|%\{([A-Za-z0-9_]+)\})>
25
+
26
+ def self.load_path=(path)
27
+ @i18n.load_path = path
28
+ end
29
+
30
+ def self.load_path
31
+ @i18n.load_path ||= []
32
+ @i18n.load_path
33
+ end
34
+
35
+ def self.available_locales=(locales)
36
+ @i18n.available_locales = locales
37
+ end
38
+
39
+ def self.available_locales
40
+ @i18n.available_locales
41
+ end
42
+
43
+ def self.default_locale=(locale)
44
+ @i18n.default_locale = locale
45
+ end
46
+
47
+ def self.t(*args)
48
+ key = args.shift
49
+ @i18n.translate(key, args)
50
+ end
51
+
52
+ @i18n = self.new
53
+
54
+ attr_accessor :load_path, :available_locales, :default_locale
55
+
56
+ def initialize
57
+ @translations = {}
58
+ @available_locales = [:ja, :en]
59
+ @default_locales = :en
60
+ end
61
+
62
+ def load_files(*files)
63
+ filenames = I18n.load_path if filenames.empty?
64
+ filenames.each { |filename| load_data(filename) }
65
+ end
66
+
67
+ def load_data(file)
68
+ begin
69
+ data = nil
70
+ if file.kind_of?(Hash)
71
+ data = file
72
+ else
73
+ content = File.read(file)
74
+ data = YAML.safe_load(content)
75
+ end
76
+ data.symbolize_keys!
77
+ pp data
78
+ data.each { |locale, d| store_translations(locale, d || {}) }
79
+ rescue => e
80
+ raise InvalidLocaleData.new(file, e.inspect)
81
+ end
82
+ end
83
+
84
+ def store_translations(locale, data)
85
+ locale = locale.to_sym
86
+ if !I18n.available_locales.include?(locale)
87
+ return data
88
+ end
89
+ translations[locale] ||= {}
90
+ data.symbolize_keys!
91
+ translations[locale].deep_merge!(data)
92
+ end
93
+
94
+ def translations
95
+ @translations
96
+ end
97
+
98
+ def translate(key, options = {})
99
+ locale ||= @default_locale
100
+ entry = lookup(locale, key)
101
+ interpolate(entry, options)
102
+ end
103
+
104
+ alias_method :t, :translate
105
+
106
+ def lookup(locale, key)
107
+ translations[locale][key] rescue nil
108
+ end
109
+
110
+ def interpolate(str, values)
111
+ return "" if str.nil?
112
+ str.gsub(INTERPOLATION_PATTERN) do |match|
113
+ if match == '%%'
114
+ '%'
115
+ else
116
+ key = $1.to_sym
117
+ if values.key?(key)
118
+ values[key]
119
+ else
120
+ raise I18n::InterpolateError.new(key, values, str)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ I18n.load_path += Dir["../../locale/*.yml"]
128
+ I18n.available_locales = [:en, :ja]
129
+ I18n.default_locale = :ja
130
+
131
+ end
@@ -28,7 +28,11 @@ module Cheepub
28
28
  end
29
29
 
30
30
  def make_file_list
31
- @content.to_enum(:each_content_with_filename, "xhtml").map{|html,filename| [filename, html]}.to_a
31
+ @content.map.with_index do |file, idx|
32
+ html = Cheepub::Markdown.new(file, ignore_images: true).to_html
33
+ filename = "bodymatter_#{idx}.xhtml"
34
+ [filename, html]
35
+ end.to_a
32
36
  end
33
37
  end
34
38
  end
@@ -1,3 +1,3 @@
1
1
  module Cheepub
2
- VERSION = "0.9.0"
2
+ VERSION = "0.14.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- require 'kramdown/parser/gfm'
1
+ require 'kramdown-parser-gfm'
2
2
 
3
3
  ## redefine TABLE_ROW_LINE
4
4
  class Kramdown::Parser::Kramdown
@@ -0,0 +1,164 @@
1
+ ---
2
+ author: ベアトリクス・ポッター
3
+ title: あなうさピーターのはなし
4
+ creator:
5
+ trl: おおくぼゆう
6
+ publisher: 青空文庫
7
+ license: CC-BY 2.1 JP http://creativecommons.org/licenses/by/2.1/jp/
8
+ ---
9
+
10
+ # あなうさピーターのはなし
11
+
12
+ ## THE TALE OF PETER RABBIT
13
+
14
+ ## ベアトリクス・ポッター Beatrix Potter
15
+
16
+ ## おおくぼゆう やく
17
+
18
+
19
+ ![表紙絵](fig51344_01.png)
20
+
21
+ --------
22
+
23
+ ![口絵1](fig51344_02.png)
24
+ ![口絵2](fig51344_03.png)
25
+
26
+ ![挿絵1](fig51344_04.png)
27
+
28
+  むかしむかし あるところに 4ひきの こうさぎが おりました。 なまえは それぞれ
29
+      フロプシー、
30
+     モプシー、
31
+    カトンテル、
32
+   ピーターです。
33
+
34
+  4ひきは おかあさんと いっしょに とってもおおきな モミのきの したにある あなのなかに すんでいました。
35
+
36
+ ![挿絵2](fig51344_05.png)
37
+
38
+  あるひの あさ、 あなうさママが いいました。
39
+
40
+ 「さあ おまえたち、 のはらのなかや こみちのさきで あそんでらっしゃい。 でも、 マグレガーおじさんの おにわには いっちゃダメよ。 むかし おとうさんが そこで ひょんなことから マグレガーおばさんに つかまって パイに されたんだから。」
41
+
42
+ ![挿絵3](fig51344_06.png)
43
+
44
+ 「いってらっしゃい、 きを つけるのよ。 おかあさん、 るすに してるから。」
45
+
46
+ ![挿絵4](fig51344_07.png)
47
+
48
+  それから あなうさママは かごと かさを てにもって、 もりの むこうの パンやさんへ むかいました。 かったのは 1きんの くろパンと ぶどうパンを 5つです。
49
+
50
+ ![挿絵5](fig51344_08.png)
51
+
52
+  フロプシーと モプシーと カトンテルは とっても いいこでしたので、 こみちを くだって クロイチゴつみに でかけました。
53
+
54
+ ![挿絵6](fig51344_09.png)
55
+
56
+  けれども ピーターは ひどく やんちゃでしたので、 そのまま マグレガーおじさんの おにわに いちもくさん、 いりぐちの さくの したを むりくり くぐりぬけたのです!
57
+
58
+ ![挿絵7](fig51344_10.png)
59
+
60
+  すぐさま レタスと インゲンを かじって おまけに ハツカダイコンまで。
61
+
62
+ ![挿絵8](fig51344_11.png)
63
+
64
+  すると どうも きぶんが わるくなったので おくすりの パセリを さがすことに しました。
65
+
66
+ ![挿絵9](fig51344_12.png)
67
+
68
+  ところが キュウリの なえばこを まわったところで でくわしたのが、 なんと マグレガーおじさん!
69
+
70
+ ![挿絵10](fig51344_13.png)
71
+
72
+  マグレガーおじさんは よつんばいで キャベツのなえを うえていたのですが、 とびあがって ピーターを おいかけます。 くわを ふりふり さけぶのです。 「まてえ、 ぬすっと!」
73
+
74
+ ![挿絵11](fig51344_14.png)
75
+
76
+  ピーターは もう びっくりして ふるえあがって にわじゅうを かけまわりました。 それというのも いりぐちが どこにあったのか わからなくなったのです。
77
+  しかも キャベツばたけで くつを かたっぽ、 ジャガイモばたけで もうかたっぽを なくしてしまいました。
78
+
79
+ ![挿絵12](fig51344_15.png)
80
+
81
+  くつも ないので よつあしで はしると ぐんぐん はやくなって、 うまくいけば にげられたと おもうのですが、 うんわるく スグリの あみに つっこんでしまい、 うわぎの おおきな ボタンが ひっかかってしまったのです。 ちなみに あおの うわぎで しんちゅうの ボタンつき おろしたての ものでした。
82
+
83
+ ![挿絵13](fig51344_16.png)
84
+
85
+  ぼくは もう しぬんだな、 ピーターは おおつぶの なみだを ながしました。 でも そのなきごえが たまたま やさしい すずめたちにも きこえて、 そして あわてて そばに とんできて あきらめないでと いうのです。
86
+
87
+ ![挿絵14](fig51344_17.png)
88
+
89
+  マグレガーおじさんが やってきて もってきた ふるいを ピーターの うえから ぱっと かぶせようと しましたが、 ピーターは すんでのところで うわぎを ぬぎぬぎ あとに のこして にげだしました。
90
+
91
+ ![挿絵15](fig51344_18.png)
92
+
93
+  そして ものおきごやに かけこんで じょうろのなかに とびこみました。 とってもいい かくればだと おもったのに みずが たくさん はいっているなんて。
94
+
95
+ ![挿絵16](fig51344_19.png)
96
+
97
+  マグレガーおじさんには まるわかりでした。 ピーターは ぜったい ものおきごやの どこかに いる。 もしかすると うえきばちの なかかもしれない。 やがて そろりと もちあげて ひとつずつ なかを みるのです。
98
+  まさに そのとき ピーターが くしゃみを ——「はっくしゅん!」 マグレガーおじさんが たちまち ちかづきます。
99
+
100
+ ![挿絵17](fig51344_20.png)
101
+
102
+  あしで ふみつけられそうに なりましたが、 ピーターは まどの そとへと とびだして ついでに うえきを 3つ たおしました。 まどが ちいさすぎたので、 マグレガーおじさんも ピーターを おいかけるのを あきらめて のらしごとへ もどることに しました。
103
+
104
+ ![挿絵18](fig51344_21.png)
105
+
106
+  ピーターは ほっとして こしを おちつけます。 いきも きれぎれ、 こころも ぶるぶる、 どっちへいったら いいのか ちっとも わかりません。 しかも じょうろのなかに いたので もう ずぶぬれです。
107
+  しばらくして うろちょろ しはじめましたが、 とぼとぼ —— とぼとぼ —— ゆっくりと あるいて きょろきょろ。
108
+
109
+ ![挿絵19](fig51344_22.png)
110
+
111
+  かべに ドアを みつけましたが、 かぎが しまっていて したを くぐりぬけようにも ぷっくりした こうさぎの とおる すきまは ありません。
112
+  おかあさんねずみが いしの とぐちを はいったり でたりして きのなかで まっている かぞくに おまめを はこんでいます。 ピーターは そのねずみに いりぐちへの いきかたを ききましたが、 くちに おおきな おまめを くわえていましたので ねずみは なにも へんじが できません。 ただ くびを ふるだけなので、 ピーターは なみだが でてきました。
113
+
114
+ ![挿絵20](fig51344_23.png)
115
+
116
+  それから おにわを つっきって かえりみちを さがそうと しましたが、 よけいに まよってしまいました。 やがて マグレガーおじさんが みずくみをする ためいけのところへ たどりつきます。 しろい ねこが きんぎょを じっと にらんでいて ぴくりとも うごきませんが ときたま しっぽの さきが いきものみたいに くねくねと していました。 ピーターは そっとしておくのが いちばんだと おもいました。 いとこの ばにばにベンジャミンくんから ねこのことは それなりに きいていたのです。
117
+
118
+ ![挿絵21](fig51344_24.png)
119
+
120
+  ものおきごやに もどろうとすると いきなり すぐそばから くわの おとが きこえてきました。 さっくり、 さくさく、 さっくり。 ピーターは しげみのしたを あたふたと はしりまわります。 けれども なんということも ないので すぐに でていって ておしぐるまの うえへ のぼり ようすを うかがってみました。 まず みえたのが タマネギばたけを たがやす マグレガーおじさん、 ピーターには せなかを むけていて なんと そのむこうに いりぐちが あるのです!
121
+
122
+ ![挿絵22](fig51344_25.png)
123
+
124
+  ピーターは おとも たてずに ておしぐるまを おりて ぜんそくりょくで はしりだしました。 クロスグリの しげみのうら まっすぐ みちを すすみます。 かどのところで マグレガーおじさんに みつかりましたが ピーターは かまいません。 いりぐちのしたに すべりこんで とうとう にわのそと、 もりに はいれば あんぜんです。
125
+
126
+ ![挿絵23](fig51344_26.png)
127
+
128
+  マグレガーおじさんは ちいさな うわぎと くつを ぼうに ひっかけ からすよけの かかしに しました。 ピーターは そのままずっと はしりっぱなしで ふりかえることもなく おおきな モミのきの おうちまで かえりました。
129
+
130
+ ![挿絵24](fig51344_27.png)
131
+
132
+  もう くたくたなので うさぎあなの ふかふかした やわらかい つちの じめんに ねっころがると まぶたが すぐに おちます。 おかあさんは おりょうりの さいちゅうで てが はなせませんでしたが、 みにつけていたものは どうしたのかしらと くびを かしげました。 つい このあいだも うわぎと くつを なくしたっていうのに。
133
+
134
+ ![挿絵25](fig51344_28.png)
135
+
136
+  なんといったら いいのか、 ピーターは そのひの ばんは ずっと ぐあいが よくありませんでした。 おかあさんは ベッドに ねかしつけ カモミールの おちゃを つくってあげました。 ピーターへの おくすりと いうわけです!
137
+ 「ねるまえに おおさじいっぱい のむこと。」
138
+
139
+ ![挿絵26](fig51344_29.png)
140
+
141
+  かたや フロプシーと モプシーと カトンテルは ばんごはんに パンと ぎゅうにゅうと クロイチゴを たべました。
142
+
143
+
144
+ {: text-right}
145
+ (おしまい)
146
+
147
+ ------
148
+
149
+ 翻訳の底本:Beatrix Potter (1902) "The Tale of Peter Rabbit"
150
+    上記の翻訳底本は、著作権が失効しています。
151
+    2009(平成21)年11月12日翻訳
152
+    2010(平成22)年2月10日修正
153
+    2011(平成23)年8月9日微修正
154
+    2013(平成25)年9月1日修正
155
+ ※この翻訳は[「クリエイティブ・コモンズ 表示 2.1 日本 ライセンス」(http://creativecommons.org/licenses/by/2.1/jp/)](http://creativecommons.org/licenses/by/2.1/jp/)によって公開されています。
156
+ [![Creative Commons License](http://i.creativecommons.org/l/by/2.1/jp/88x31.png)](http://creativecommons.org/licenses/by/2.1/jp/)
157
+ 上記のライセンスに従って、訳者に断りなく自由に利用・複製・再配布することができます。
158
+ ※翻訳についてのお問い合わせは、青空文庫ではなく、[訳者本人(http://www.alz.jp/221b/)](http://www.alz.jp/221b/)までお願いします。
159
+ 翻訳者:大久保ゆう
160
+ 2014年3月26日作成
161
+ 青空文庫収録ファイル:
162
+ このファイルは、著作権者自らの意思により、インターネットの図書館、[青空文庫(http://www.aozora.gr.jp/)](http://www.aozora.gr.jp/)に収録されています。
163
+
164
+ 原文: [https://www.aozora.gr.jp/cards/001505/card51344.html](https://www.aozora.gr.jp/cards/001505/card51344.html)
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: 山月記
3
+ author: 中島 敦
4
+ publisher: 青空文庫
5
+ pageDirection: rtl
6
+ license: public domain
7
+ colophon_before: "一九九八年十一月十二日 公開\n二〇一〇年十一月 二日 修正"
8
+ colophon_after: "青空文庫作成ファイル\nこのファイルは、インターネットの図書館、青空文庫(http://www.aozora.gr.jp/)で作られました。入力、校正、制作にあたったのは、ボランティアの皆さんです。\n(原文: https://www.aozora.gr.jp/cards/000119/card624.html)"
9
+ colophon:
10
+ 著 者: 中島 敦
11
+ 底 本:
12
+ - 「李陵・山月記」新潮文庫、新潮社
13
+ - 一九六九(昭和四十四)年九月二〇日発行
14
+ 入 力: 平松大樹
15
+ 校 正: 林めぐみ
16
+ 発 行: 青空文庫
17
+ ---
18
+
19
+ # 山月記
20
+
21
+  {隴西|ろうさい}の{李徴|りちょう}は博学{才穎|さいえい}、天宝の末年、若くして名を{虎榜|こぼう}に連ね、ついで{江南尉|こうなんい}に補せられたが、性、{狷介|けんかい}、{自|みずか}ら{恃|たの}むところ{頗|すこぶ}る厚く、{賤吏|せんり}に甘んずるを{潔|いさぎよ}しとしなかった。いくばくもなく官を退いた後は、{故山|こざん}、{虢略|かくりゃく}に{帰臥|きが}し、人と{交|まじわり}を絶って、ひたすら詩作に{耽|ふけ}った。下吏となって長く{膝|ひざ}を俗悪な大官の前に屈するよりは、詩家としての名を死後百年に{遺|のこ}そうとしたのである。しかし、文名は容易に揚らず、生活は日を{逐|お}うて苦しくなる。李徴は{漸|ようや}く{焦躁|しょうそう}に駆られて来た。この{頃|ころ}からその{容貌|ようぼう}も{峭刻|しょうこく}となり、肉落ち骨{秀|ひい}で、眼光のみ{徒|いたず}らに{炯々|けいけい}として、{曾|かつ}て進士に{登第|とうだい}した頃の{豊頬|ほうきょう}の美少年の{俤|おもかげ}は、{何処|どこ}に求めようもない。数年の後、貧窮に{堪|た}えず、妻子の衣食のために{遂|つい}に節を屈して、再び東へ赴き、一地方官吏の職を奉ずることになった。一方、これは、{己|おのれ}の詩業に半ば絶望したためでもある。曾ての同輩は既に{遥|はる}か高位に進み、彼が昔、鈍物として{歯牙|しが}にもかけなかったその連中の下命を拝さねばならぬことが、往年の{儁才|しゅんさい}李徴の自尊心を{如何|いか}に{傷|きずつ}けたかは、想像に{難|かた}くない。彼は{怏々|おうおう}として楽しまず、{狂悖|きょうはい}の性は{愈々|いよいよ}抑え{難|がた}くなった。一年の後、公用で旅に出、{汝水|じょすい}のほとりに宿った時、遂に発狂した。{或|ある}夜半、急に顔色を変えて寝床から起上ると、何か訳の分らぬことを叫びつつそのまま下にとび下りて、{闇|やみ}の中へ{駈出|かけだ}した。彼は二度と{戻|もど}って来なかった。附近の山野を捜索しても、何の手掛りもない。その後李徴がどうなったかを知る者は、{誰|だれ}もなかった。
22
+
23
+  翌年、{監察御史|かんさつぎょし}、{陳郡|ちんぐん}の{袁傪|えんさん}という者、勅命を奉じて{嶺南|れいなん}に{使|つかい}し、{途|みち}に{商於|しょうお}の地に宿った。次の朝{未|ま}だ暗い{中|うち}に出発しようとしたところ、駅吏が言うことに、これから先の道に{人喰虎|ひとくいどら}が出る{故|ゆえ}、旅人は白昼でなければ、通れない。今はまだ朝が早いから、今少し待たれたが{宜|よろ}しいでしょうと。袁傪は、しかし、{供廻|ともまわ}りの多勢なのを恃み、駅吏の言葉を{斥|しりぞ}けて、出発した。残月の光をたよりに林中の草地を通って行った時、果して一匹の{猛虎|もうこ}が{叢|くさむら}の中から躍り出た。虎は、あわや袁傪に躍りかかるかと見えたが、{忽|たちま}ち身を{飜|ひるがえ}して、元の叢に隠れた。叢の中から人間の声で「あぶないところだった」と繰返し{呟|つぶや}くのが聞えた。その声に袁傪は聞き{憶|おぼ}えがあった。{驚懼|きょうく}の中にも、彼は{咄嗟|とっさ}に思いあたって、叫んだ。「その声は、我が友、李徴子ではないか?」袁傪は李徴と同年に進士の第に登り、友人の少かった李徴にとっては、最も親しい友であった。温和な袁傪の性格が、{峻峭|しゅんしょう}な李徴の性情と衝突しなかったためであろう。
24
+
25
+  叢の中からは、{暫|しばら}く返辞が無かった。しのび泣きかと思われる{微|かす}かな声が時々{洩|も}れるばかりである。ややあって、低い声が答えた。「如何にも自分は隴西の李徴である」と。
26
+
27
+  袁傪は恐怖を忘れ、馬から下りて叢に近づき、{懐|なつ}かしげに{久闊|きゅうかつ}を叙した。そして、{何故|なぜ}叢から出て来ないのかと問うた。李徴の声が答えて言う。自分は今や異類の身となっている。どうして、おめおめと{故人|とも}の前にあさましい姿をさらせようか。かつ又、自分が姿を現せば、必ず君に{畏怖嫌厭|いふけんえん}の情を起させるに決っているからだ。しかし、今、図らずも故人に{遇|あ}うことを得て、{愧赧|きたん}の念をも忘れる程に懐かしい。どうか、ほんの暫くでいいから、我が醜悪な今の外形を{厭|いと}わず、曾て君の友李徴であったこの自分と話を交してくれないだろうか。
28
+
29
+  後で考えれば不思議だったが、その時、袁傪は、この超自然の怪異を、実に素直に{受容|うけい}れて、少しも怪もうとしなかった。彼は部下に命じて行列の進行を{停|と}め、自分は叢の{傍|かたわら}に立って、見えざる声と対談した。都の{噂|うわさ}、旧友の消息、袁傪が現在の地位、それに対する李徴の祝辞。青年時代に親しかった者同志の、あの隔てのない語調で、それ{等|ら}が語られた後、袁傪は、李徴がどうして今の身となるに至ったかを{訊|たず}ねた。草中の声は次のように語った。
30
+
31
+  今から一年程前、自分が旅に出て汝水のほとりに泊った夜のこと、一睡してから、ふと{眼|め}を覚ますと、戸外で誰かが我が名を呼んでいる。声に応じて外へ出て見ると、声は闇の中から{頻|しき}りに自分を招く。覚えず、自分は声を追うて走り出した。無我夢中で駈けて行く中に、{何時|いつ}しか途は山林に入り、しかも、知らぬ間に自分は左右の手で地を{攫|つか}んで走っていた。何か{身体|からだ}中に力が{充|み}ち満ちたような感じで、軽々と岩石を跳び越えて行った。気が付くと、手先や{肱|ひじ}のあたりに毛を生じているらしい。少し明るくなってから、谷川に臨んで姿を映して見ると、既に虎となっていた。自分は初め眼を信じなかった。次に、これは夢に違いないと考えた。夢の中で、これは夢だぞと知っているような夢を、自分はそれまでに見たことがあったから。どうしても夢でないと悟らねばならなかった時、自分は{茫然|ぼうぜん}とした。そうして{懼|おそ}れた。全く、どんな事でも起り得るのだと思うて、深く懼れた。しかし、何故こんな事になったのだろう。分らぬ。全く何事も我々には{判|わか}らぬ。理由も分らずに押付けられたものを大人しく受取って、理由も分らずに生きて行くのが、我々生きものの*さだめ*だ。自分は{直|す}ぐに死を{想|おも}うた。しかし、その時、眼の前を一匹の{兎|うさぎ}が駈け過ぎるのを見た途端に、自分の中の*人間*は忽ち姿を消した。再び自分の中の*人間*が目を覚ました時、自分の口は兎の血に{塗|まみ}れ、あたりには兎の毛が散らばっていた。これが虎としての最初の経験であった。それ以来今までにどんな所行をし続けて来たか、それは到底語るに忍びない。ただ、一日の中に必ず数時間は、人間の心が{還|かえ}って来る。そういう時には、曾ての日と同じく、人語も{操|あやつ}れれば、複雑な思考にも堪え得るし、{経書|けいしょ}の章句を{誦|そら}んずることも出来る。その人間の心で、虎としての{己|おのれ}の{残虐|ざんぎゃく}な{行|おこない}のあとを見、己の運命をふりかえる時が、最も情なく、恐しく、{憤|いきどお}ろしい。しかし、その、人間にかえる数時間も、日を経るに従って次第に短くなって行く。今までは、どうして虎などになったかと怪しんでいたのに、この間ひょいと気が付いて見たら、{己|おれ}はどうして以前、人間だったのかと考えていた。これは恐しいことだ。今少し{経|た}てば、{己|おれ}の中の人間の心は、獣としての習慣の中にすっかり{埋|うも}れて消えて{了|しま}うだろう。ちょうど、古い宮殿の{礎|いしずえ}が次第に土砂に埋没するように。そうすれば、しまいに己は自分の過去を忘れ果て、一匹の虎として狂い廻り、今日のように途で君と出会っても{故人|とも}と認めることなく、君を裂き{喰|くろ}うて何の悔も感じないだろう。一体、獣でも人間でも、もとは何か{他|ほか}のものだったんだろう。初めはそれを憶えているが、次第に忘れて了い、初めから今の形のものだったと思い込んでいるのではないか? いや、そんな事はどうでもいい。己の中の人間の心がすっかり消えて了えば、恐らく、その方が、己は*しあわせ*になれるだろう。だのに、己の中の人間は、その事を、この上なく恐しく感じているのだ。ああ、全く、どんなに、恐しく、{哀|かな}しく、切なく思っているだろう! 己が人間だった記憶のなくなることを。この気持は誰にも分らない。誰にも分らない。己と同じ身の上に成った者でなければ。ところで、そうだ。己がすっかり人間でなくなって了う前に、一つ頼んで置きたいことがある。
32
+
33
+  袁傪はじめ一行は、息をのんで、{叢中|そうちゅう}の声の語る不思議に聞入っていた。声は続けて言う。
34
+
35
+  他でもない。自分は元来詩人として名を成す積りでいた。しかも、業{未|いま}だ成らざるに、この運命に立至った。曾て作るところの詩数百{篇|ぺん}、{固|もと}より、まだ世に行われておらぬ。遺稿の所在も{最早|もはや}判らなくなっていよう。ところで、その中、今も{尚|なお}{記誦|きしょう}せるものが数十ある。これを我が{為|ため}に伝録して{戴|いただ}きたいのだ。何も、これに{仍|よ}って一人前の詩人{面|づら}をしたいのではない。作の巧拙は知らず、とにかく、産を破り心を狂わせてまで自分が{生涯|しょうがい}それに執着したところのものを、一部なりとも後代に伝えないでは、死んでも死に切れないのだ。
36
+
37
+  袁傪は部下に命じ、筆を執って叢中の声に{随|したが}って書きとらせた。李徴の声は叢の中から朗々と響いた。長短{凡|およ}そ三十篇、格調高雅、意趣卓逸、一読して作者の才の非凡を思わせるものばかりである。しかし、袁傪は感嘆しながらも{漠然|ばくぜん}と次のように感じていた。{成程|なるほど}、作者の素質が第一流に属するものであることは疑いない。しかし、このままでは、第一流の作品となるのには、{何処|どこ}か(非常に微妙な点に{於|おい}て)欠けるところがあるのではないか、と。
38
+
39
+  旧詩を吐き終った李徴の声は、突然調子を変え、自らを{嘲|あざけ}るか{如|ごと}くに言った。
40
+
41
+  {羞|はずか}しいことだが、今でも、こんな*あさましい*身と成り果てた今でも、{己|おれ}は、己の詩集が{長安|ちょうあん}風流人士の机の上に置かれている様を、夢に見ることがあるのだ。{岩窟|がんくつ}の中に横たわって見る夢にだよ。{嗤|わら}ってくれ。詩人に成りそこなって虎になった哀れな男を。(袁傪は昔の青年李徴の{自嘲癖|じちょうへき}を思出しながら、哀しく聞いていた。)そうだ。お笑い草ついでに、今の{懐|おもい}を即席の詩に述べて見ようか。この虎の中に、まだ、曾ての李徴が生きている*しるし*に。
42
+
43
+  袁傪は又下吏に命じてこれを書きとらせた。その詩に言う。
44
+
45
+    偶因狂疾成殊類 災患相仍不可逃
46
+    今日爪牙誰敢敵 当時声跡共相高
47
+    我為異物蓬茅下 君已乗軺気勢豪
48
+    此夕渓山対明月 不成長嘯但成嘷
49
+
50
+  時に、残月、光{冷|ひや}やかに、白露は地に{滋|しげ}く、樹間を渡る冷風は既に暁の近きを告げていた。人々は最早、事の奇異を忘れ、粛然として、この詩人の{薄倖|はっこう}を嘆じた。李徴の声は再び続ける。
51
+
52
+  {何故|なぜ}こんな運命になったか判らぬと、先刻は言ったが、しかし、考えように{依|よ}れば、思い当ることが全然ないでもない。人間であった時、{己|おれ}は努めて人との{交|まじわり}を避けた。人々は己を{倨傲|きょごう}だ、尊大だといった。実は、それが{殆|ほとん}ど{羞恥心|しゅうちしん}に近いものであることを、人々は知らなかった。{勿論|もちろん}、曾ての{郷党|きょうとう}の鬼才といわれた自分に、自尊心が無かったとは{云|い}わない。しかし、それは{臆病|おくびょう}な自尊心とでもいうべきものであった。己は詩によって名を成そうと思いながら、進んで師に就いたり、求めて詩友と交って{切磋琢磨|せっさたくま}に努めたりすることをしなかった。かといって、又、己は俗物の間に{伍|ご}することも{潔|いさぎよ}しとしなかった。共に、我が臆病な自尊心と、尊大な羞恥心との{所為|せい}である。{己|おのれ}の{珠|たま}に{非|あら}ざることを{惧|おそ}れるが{故|ゆえ}に、{敢|あえ}て刻苦して{磨|みが}こうともせず、又、己の珠なるべきを半ば信ずるが故に、{碌々|ろくろく}として{瓦|かわら}に伍することも出来なかった。{己|おれ}は次第に世と離れ、人と遠ざかり、{憤悶|ふんもん}と{慙恚|ざんい}とによって{益々|ますます}{己|おのれ}の内なる臆病な自尊心を飼い*ふとらせる*結果になった。人間は誰でも猛獣使であり、その猛獣に当るのが、各人の性情だという。{己|おれ}の場合、この尊大な羞恥心が猛獣だった。虎だったのだ。これが己を損い、妻子を苦しめ、友人を傷つけ、果ては、己の外形をかくの如く、内心にふさわしいものに変えて了ったのだ。今思えば、全く、己は、己の{有|も}っていた{僅|わず}かばかりの才能を空費して了った訳だ。人生は何事をも{為|な}さぬには余りに長いが、何事かを為すには余りに短いなどと口先ばかりの警句を{弄|ろう}しながら、事実は、才能の不足を{暴露|ばくろ}するかも知れないとの{卑怯|ひきょう}な{危惧|きぐ}と、刻苦を{厭|いと}う怠惰とが己の{凡|すべ}てだったのだ。己よりも遥かに乏しい才能でありながら、それを専一に磨いたがために、堂々たる詩家となった者が幾らでもいるのだ。虎と成り果てた今、己は{漸|ようや}くそれに気が付いた。それを思うと、己は今も胸を{灼|や}かれるような悔を感じる。己には最早人間としての生活は出来ない。たとえ、今、己が頭の中で、どんな優れた詩を作ったにしたところで、どういう手段で発表できよう。まして、己の頭は{日毎|ひごと}に虎に近づいて行く。どうすればいいのだ。己の空費された過去は? 己は{堪|たま}らなくなる。そういう時、己は、向うの山の頂の{巖|いわ}に上り、{空谷|くうこく}に向って{吼|ほ}える。この胸を灼く悲しみを誰かに訴えたいのだ。己は昨夕も、{彼処|あそこ}で月に向って{咆|ほ}えた。誰かにこの苦しみが分って{貰|もら}えないかと。しかし、獣どもは己の声を聞いて、{唯|ただ}、{懼|おそ}れ、ひれ伏すばかり。山も{樹|き}も月も露も、一匹の虎が怒り狂って、{哮|たけ}っているとしか考えない。天に躍り地に伏して嘆いても、誰一人己の気持を分ってくれる者はない。ちょうど、人間だった頃、己の傷つき{易|やす}い内心を誰も理解してくれなかったように。己の毛皮の{濡|ぬ}れたのは、夜露のためばかりではない。
53
+
54
+  漸く{四辺|あたり}の暗さが薄らいで来た。木の間を伝って、{何処|どこ}からか、{暁角|ぎょうかく}が哀しげに響き始めた。
55
+
56
+  最早、別れを告げねばならぬ。酔わねばならぬ時が、(虎に還らねばならぬ時が)近づいたから、と、李徴の声が言った。だが、お別れする前にもう一つ頼みがある。それは我が妻子のことだ。{彼等|かれら}は{未|ま}だ{虢略|かくりゃく}にいる。固より、己の運命に就いては知る{筈|はず}がない。君が南から帰ったら、己は既に死んだと彼等に告げて貰えないだろうか。決して今日のことだけは明かさないで欲しい。厚かましいお願だが、彼等の孤弱を{憐|あわ}れんで、今後とも{道塗|どうと}に{飢凍|きとう}することのないように計らって戴けるならば、自分にとって、{恩倖|おんこう}、これに過ぎたるは{莫|な}い。
57
+
58
+  言終って、叢中から{慟哭|どうこく}の声が聞えた。袁もまた涙を{泛|うか}べ、{欣|よろこ}んで李徴の意に{副|そ}いたい{旨|むね}を答えた。李徴の声はしかし{忽|たちま}ち又先刻の自嘲的な調子に{戻|もど}って、言った。
59
+
60
+  本当は、{先|ま}ず、この事の方を先にお願いすべきだったのだ、己が人間だったなら。飢え凍えようとする妻子のことよりも、{己|おのれ}の乏しい詩業の方を気にかけているような男だから、こんな獣に身を{堕|おと}すのだ。
61
+
62
+  そうして、{附加|つけくわ}えて言うことに、袁傪が嶺南からの帰途には決してこの{途|みち}を通らないで欲しい、その時には自分が酔っていて{故人|とも}を認めずに襲いかかるかも知れないから。又、今別れてから、前方百歩の所にある、あの丘に上ったら、{此方|こちら}を振りかえって見て貰いたい。自分は今の姿をもう一度お目に掛けよう。勇に誇ろうとしてではない。我が醜悪な姿を示して、{以|もっ}て、再び{此処|ここ}を過ぎて自分に会おうとの気持を君に起させない為であると。
63
+
64
+  袁傪は叢に向って、{懇|ねんご}ろに別れの言葉を述べ、馬に上った。叢の中からは、又、{堪|た}え得ざるが如き{悲泣|ひきゅう}の声が{洩|も}れた。袁傪も幾度か叢を振返りながら、涙の中に出発した。
65
+
66
+  一行が丘の上についた時、彼等は、言われた通りに振返って、先程の林間の草地を{眺|なが}めた。忽ち、一匹の虎が草の茂みから道の上に躍り出たのを彼等は見た。虎は、既に白く光を失った月を仰いで、二声三声{咆哮|ほうこう}したかと思うと、又、元の叢に躍り入って、再びその姿を見なかった。
67
+
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE html>
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="ja" lang="ja">
4
+ <head>
5
+ <meta charset="utf-8" />
6
+ <link rel="stylesheet" href="style.css" type="text/css" />
7
+ <style type="text/css">
8
+ html {
9
+ -epub-writing-mode: horizontal-tb;
10
+ -webkit-writing-mode: horizontal-tb;
11
+ writing-mode: horizontal-tb;
12
+ font-family: sans-serif;
13
+ }
14
+ h1, h2, h3 {
15
+ font-size: 1em;
16
+ }
17
+ .colophonpage {
18
+ margin: 0 auto;
19
+ width: 100%;
20
+ text-align: center;
21
+ }
22
+ .colophon-table {
23
+ margin: 0 auto;
24
+ text-align: center;
25
+ }
26
+ .colophon-table th {
27
+ font-size: 1em;
28
+ font-weight: normal;
29
+ font-family: serif, sans-serif;
30
+ }
31
+ .colophon-title-main {
32
+ font-size: 1.2em;
33
+ font-weight: normal;
34
+ }
35
+ .colophon-creator {
36
+ margin: 0 auto;
37
+ padding: 1em 0;
38
+ border:solid #999;
39
+ border-width:1px 0 0 0;
40
+ margin: 0 auto;
41
+ font-size: 1em;
42
+ line-height: 1.2;
43
+ font-family: serif, sans-serif;
44
+ width: 70%;
45
+ }
46
+ </style>
47
+ <title><%= @book.title %></title>
48
+ </head>
49
+ <body class="backmatter" epub:type="backmatter">
50
+ <section class="colophonpage" epub:type="colophonpage" title="奥付">
51
+ <div class="colophon-title-before"></div>
52
+ <div class="colophon-title-main">
53
+ <h1 class="maintitle" epub:type="title"><%= @book.title %></h1>
54
+ </div>
55
+ <div class="titlepage-title-after"></div>
56
+ <div class="colophon-table-before">
57
+ <p><%= @colophon_before.gsub(/\n/m, "<br />") %></p>
58
+ </div>
59
+ <table class="colophon-table">
60
+ <% @colophon.each do |key, val| %>
61
+ <% val = val.join("<br />") if val.kind_of?(Array) %>
62
+ <tr><th><%= key %></th><td><%= val %></td></tr>
63
+ <% end %>
64
+ </table>
65
+ <div class="colophon-table-after">
66
+ <p><%= @colophon_after.gsub(/\n/m, "<br />") %></p>
67
+ </div>
68
+ </section>
69
+ </body>
70
+ </html>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheepub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - takahashim
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-12 00:00:00.000000000 Z
11
+ date: 2020-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gepub
@@ -16,28 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.7'
19
+ version: 1.0.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.7'
26
+ version: 1.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: kramdown
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: kramdown-parser-gfm
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '1.16'
47
+ version: 1.0.1
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '1.16'
54
+ version: 1.0.1
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: clamp
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -98,58 +112,58 @@ dependencies:
98
112
  name: rb_latex
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
- version: 0.2.1
117
+ version: '0'
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - "~>"
122
+ - - ">="
109
123
  - !ruby/object:Gem::Version
110
- version: 0.2.1
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rufo
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - "~>"
129
+ - - ">="
116
130
  - !ruby/object:Gem::Version
117
- version: '0.3'
131
+ version: '0'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - "~>"
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
- version: '0.3'
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: bundler
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - "~>"
143
+ - - ">="
130
144
  - !ruby/object:Gem::Version
131
- version: '1.16'
145
+ version: '0'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - "~>"
150
+ - - ">="
137
151
  - !ruby/object:Gem::Version
138
- version: '1.16'
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: rake
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - "~>"
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
- version: '12.0'
159
+ version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
- version: '12.0'
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: test-unit
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +206,7 @@ dependencies:
192
206
  - - ">="
193
207
  - !ruby/object:Gem::Version
194
208
  version: '0'
195
- description: Simple EPUB generator from Markdown. Inspired by denden converter
209
+ description: Simple EPUB/PDF generator from Markdown. Inspired by denden converter
196
210
  email:
197
211
  - maki@rubycolor.org
198
212
  executables:
@@ -200,8 +214,8 @@ executables:
200
214
  extensions: []
201
215
  extra_rdoc_files: []
202
216
  files:
217
+ - ".github/workflows/ruby.yml"
203
218
  - ".gitignore"
204
- - ".travis.yml"
205
219
  - Gemfile
206
220
  - LICENSE
207
221
  - README.md
@@ -212,8 +226,10 @@ files:
212
226
  - doc/README_ja.md
213
227
  - exe/cheepub
214
228
  - lib/cheepub.rb
229
+ - lib/cheepub/asset_store.rb
215
230
  - lib/cheepub/cli.rb
216
231
  - lib/cheepub/content.rb
232
+ - lib/cheepub/converter/cheehtml.rb
217
233
  - lib/cheepub/converter/cheelatex.rb
218
234
  - lib/cheepub/error.rb
219
235
  - lib/cheepub/ext_hash.rb
@@ -223,14 +239,46 @@ files:
223
239
  - lib/cheepub/heading_item.rb
224
240
  - lib/cheepub/heading_parser.rb
225
241
  - lib/cheepub/heading_parser/handler.rb
242
+ - lib/cheepub/i18n.rb
226
243
  - lib/cheepub/markdown.rb
227
244
  - lib/cheepub/nav.rb
228
245
  - lib/cheepub/version.rb
229
246
  - lib/kramdown/parser/cheemarkdown.rb
230
247
  - misc/conv_entity.rb
231
248
  - misc/conv_ruby.rb
249
+ - samples/anausa_perter/anausa_peterno_hanashi.md
250
+ - samples/anausa_perter/fig51344_01.png
251
+ - samples/anausa_perter/fig51344_02.png
252
+ - samples/anausa_perter/fig51344_03.png
253
+ - samples/anausa_perter/fig51344_04.png
254
+ - samples/anausa_perter/fig51344_05.png
255
+ - samples/anausa_perter/fig51344_06.png
256
+ - samples/anausa_perter/fig51344_07.png
257
+ - samples/anausa_perter/fig51344_08.png
258
+ - samples/anausa_perter/fig51344_09.png
259
+ - samples/anausa_perter/fig51344_10.png
260
+ - samples/anausa_perter/fig51344_11.png
261
+ - samples/anausa_perter/fig51344_12.png
262
+ - samples/anausa_perter/fig51344_13.png
263
+ - samples/anausa_perter/fig51344_14.png
264
+ - samples/anausa_perter/fig51344_15.png
265
+ - samples/anausa_perter/fig51344_16.png
266
+ - samples/anausa_perter/fig51344_17.png
267
+ - samples/anausa_perter/fig51344_18.png
268
+ - samples/anausa_perter/fig51344_19.png
269
+ - samples/anausa_perter/fig51344_20.png
270
+ - samples/anausa_perter/fig51344_21.png
271
+ - samples/anausa_perter/fig51344_22.png
272
+ - samples/anausa_perter/fig51344_23.png
273
+ - samples/anausa_perter/fig51344_24.png
274
+ - samples/anausa_perter/fig51344_25.png
275
+ - samples/anausa_perter/fig51344_26.png
276
+ - samples/anausa_perter/fig51344_27.png
277
+ - samples/anausa_perter/fig51344_28.png
278
+ - samples/anausa_perter/fig51344_29.png
232
279
  - samples/jlreq-readme-ja.md
233
280
  - samples/sangetsuki.md
281
+ - samples/sangetsuki_colophon.md
234
282
  - samples/thelastleaf.md
235
283
  - samples/thelastleaf_ja.md
236
284
  - samples/thelastleaf_ja_luatex.md
@@ -238,6 +286,7 @@ files:
238
286
  - samples/yume_juya_luatex.md
239
287
  - templates/bodymatter.html.erb
240
288
  - templates/bodymatter.tex.erb
289
+ - templates/colophon.xhtml.erb
241
290
  - templates/nav.xhtml.erb
242
291
  - templates/style.css.erb
243
292
  - templates/titlepage.xhtml.erb
@@ -259,9 +308,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
259
308
  - !ruby/object:Gem::Version
260
309
  version: '0'
261
310
  requirements: []
262
- rubyforge_project:
263
- rubygems_version: 2.7.3
311
+ rubygems_version: 3.1.2
264
312
  signing_key:
265
313
  specification_version: 4
266
- summary: Simple EPUB generator from Markdown
314
+ summary: Simple EPUB/PDF generator from Markdown
267
315
  test_files: []
@@ -1,10 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.4.1
5
- - 2.5.1
6
- before_install:
7
- - gem install bundler -v 1.16.1
8
- branches:
9
- only:
10
- - master