review 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +90 -66
- data/.travis.yml +1 -1
- data/Gemfile +0 -1
- data/NEWS.ja.md +82 -0
- data/NEWS.md +83 -0
- data/README.md +5 -3
- data/Rakefile +8 -8
- data/bin/review +1 -5
- data/bin/review-catalog-converter +22 -27
- data/bin/review-check +36 -43
- data/bin/review-checkdep +10 -15
- data/bin/review-compile +37 -55
- data/bin/review-epubmaker +4 -5
- data/bin/review-index +21 -29
- data/bin/review-init +26 -37
- data/bin/review-pdfmaker +0 -2
- data/bin/review-preproc +25 -45
- data/bin/review-validate +19 -18
- data/bin/review-vol +15 -27
- data/doc/config.yml.sample +5 -2
- data/doc/format.ja.md +20 -1
- data/doc/format.md +21 -5
- data/doc/images/review-generate.png +0 -0
- data/lib/epubmaker.rb +1 -3
- data/lib/epubmaker/content.rb +24 -27
- data/lib/epubmaker/epubcommon.rb +135 -148
- data/lib/epubmaker/epubv2.rb +39 -46
- data/lib/epubmaker/epubv3.rb +93 -103
- data/lib/epubmaker/producer.rb +138 -151
- data/lib/epubmaker/zip_exporter.rb +21 -26
- data/lib/review/book.rb +3 -6
- data/lib/review/book/base.rb +78 -103
- data/lib/review/book/chapter.rb +36 -40
- data/lib/review/book/compilable.rb +28 -31
- data/lib/review/book/image_finder.rb +6 -13
- data/lib/review/book/index.rb +100 -121
- data/lib/review/book/page_metric.rb +2 -7
- data/lib/review/book/part.rb +18 -20
- data/lib/review/book/volume.rb +9 -13
- data/lib/review/builder.rb +81 -116
- data/lib/review/catalog.rb +15 -19
- data/lib/review/compiler.rb +64 -83
- data/lib/review/configure.rb +87 -97
- data/lib/review/converter.rb +2 -7
- data/lib/review/epubbuilder.rb +1 -3
- data/lib/review/epubmaker.rb +213 -205
- data/lib/review/exception.rb +2 -4
- data/lib/review/extentions.rb +0 -1
- data/lib/review/extentions/hash.rb +2 -2
- data/lib/review/extentions/string.rb +5 -30
- data/lib/review/htmlbuilder.rb +320 -375
- data/lib/review/htmltoc.rb +4 -7
- data/lib/review/htmlutils.rb +29 -32
- data/lib/review/i18n.rb +33 -44
- data/lib/review/i18n.yml +3 -3
- data/lib/review/idgxmlbuilder.rb +309 -345
- data/lib/review/latexbuilder.rb +175 -212
- data/lib/review/latexindex.rb +2 -8
- data/lib/review/latexutils.rb +33 -43
- data/lib/review/lineinput.rb +1 -1
- data/lib/review/logger.rb +21 -0
- data/lib/review/makerhelper.rb +1 -4
- data/lib/review/markdownbuilder.rb +44 -53
- data/lib/review/md2inaobuilder.rb +6 -12
- data/lib/review/pdfmaker.rb +143 -173
- data/lib/review/preprocessor.rb +64 -101
- data/lib/review/rstbuilder.rb +126 -158
- data/lib/review/sec_counter.rb +18 -34
- data/lib/review/template.rb +4 -5
- data/lib/review/textbuilder.rb +2 -3
- data/lib/review/textutils.rb +7 -13
- data/lib/review/tocparser.rb +31 -56
- data/lib/review/tocprinter.rb +26 -52
- data/lib/review/topbuilder.rb +219 -247
- data/lib/review/unfold.rb +15 -24
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +75 -99
- data/lib/review/webtocprinter.rb +15 -20
- data/lib/review/yamlloader.rb +13 -15
- data/review.gemspec +20 -22
- data/templates/latex/layout.tex.erb +2 -2
- data/templates/opf/epubv2.opf.erb +7 -7
- data/templates/opf/epubv3.opf.erb +7 -7
- data/templates/web/html/layout-html5.html.erb +2 -2
- data/test/assets/black.eps +280 -0
- data/test/assets/fit.png +0 -0
- data/test/assets/large.gif +0 -0
- data/test/assets/large.jpg +0 -0
- data/test/assets/large.png +0 -0
- data/test/assets/large.svg +65 -0
- data/test/assets/test_template.tex +1 -1
- data/test/book_test_helper.rb +2 -2
- data/test/run_test.rb +4 -4
- data/test/sample-book/src/Rakefile +21 -22
- data/test/syntax-book/Gemfile +4 -0
- data/test/syntax-book/Rakefile +72 -0
- data/test/syntax-book/appA.re +22 -0
- data/test/syntax-book/bib.re +6 -0
- data/test/syntax-book/catalog.yml +15 -0
- data/test/syntax-book/ch01.re +136 -0
- data/test/syntax-book/ch02.re +351 -0
- data/test/syntax-book/ch03.re +82 -0
- data/test/syntax-book/config.yml +35 -0
- data/test/syntax-book/images/ball.png +0 -0
- data/test/syntax-book/images/cover.jpg +0 -0
- data/test/syntax-book/images/fractal.png +0 -0
- data/test/syntax-book/images/img3-1.png +0 -0
- data/test/syntax-book/images/inlineicon.jpg +0 -0
- data/test/syntax-book/images/logic.png +0 -0
- data/test/syntax-book/images/logic2.png +0 -0
- data/test/syntax-book/images/puzzle.jpg +0 -0
- data/test/syntax-book/images/table.jpg +0 -0
- data/test/syntax-book/part2.re +6 -0
- data/test/syntax-book/pre01.re +26 -0
- data/test/syntax-book/review-ext.rb +14 -0
- data/test/syntax-book/sty/jumoline.sty +310 -0
- data/test/syntax-book/sty/reviewmacro.sty +39 -0
- data/test/syntax-book/style.css +494 -0
- data/test/syntax-book/syntax.dic +2 -0
- data/test/test_book.rb +106 -111
- data/test/test_book_chapter.rb +21 -22
- data/test/test_book_part.rb +3 -5
- data/test/test_builder.rb +11 -22
- data/test/test_catalog.rb +17 -18
- data/test/test_catalog_converter_cmd.rb +5 -5
- data/test/test_compiler.rb +18 -16
- data/test/test_configure.rb +35 -38
- data/test/test_converter.rb +3 -4
- data/test/test_epub3maker.rb +136 -117
- data/test/test_epubmaker.rb +107 -114
- data/test/test_epubmaker_cmd.rb +2 -4
- data/test/test_extentions_hash.rb +32 -33
- data/test/test_helper.rb +9 -11
- data/test/test_htmlbuilder.rb +454 -420
- data/test/test_htmltoc.rb +8 -12
- data/test/test_htmlutils.rb +0 -2
- data/test/test_i18n.rb +159 -150
- data/test/test_idgxmlbuilder.rb +190 -197
- data/test/test_image_finder.rb +21 -22
- data/test/test_index.rb +24 -29
- data/test/test_latexbuilder.rb +274 -264
- data/test/test_lineinput.rb +7 -10
- data/test/test_location.rb +7 -7
- data/test/test_makerhelper.rb +13 -25
- data/test/test_markdownbuilder.rb +23 -26
- data/test/test_md2inaobuilder.rb +8 -11
- data/test/test_pdfmaker.rb +114 -123
- data/test/test_pdfmaker_cmd.rb +1 -3
- data/test/test_review_ext.rb +3 -5
- data/test/test_rstbuilder.rb +92 -97
- data/test/test_template.rb +3 -7
- data/test/test_textutils.rb +27 -27
- data/test/test_tocparser.rb +2 -2
- data/test/test_topbuilder.rb +98 -103
- data/test/test_webtocprinter.rb +5 -6
- data/test/test_yamlloader.rb +42 -42
- data/test/test_zip_exporter.rb +12 -18
- metadata +86 -9
- data/lib/review/ewbbuilder.rb +0 -382
data/lib/review/htmltoc.rb
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
module ReVIEW
|
2
2
|
class HTMLToc
|
3
3
|
def initialize(basedir)
|
4
|
-
@tochtmltxt =
|
4
|
+
@tochtmltxt = 'toc-html.txt'
|
5
5
|
@basedir = basedir
|
6
6
|
end
|
7
7
|
|
8
8
|
def add_item(level, filename, title, args)
|
9
9
|
args_str = encode_args(args)
|
10
10
|
line = [level, filename, title, args_str].join("\t")
|
11
|
-
File.open(tocfilename,
|
12
|
-
f.write "#{line}\n"
|
13
|
-
end
|
11
|
+
File.open(tocfilename, 'a') { |f| f.write "#{line}\n" }
|
14
12
|
end
|
15
13
|
|
16
14
|
def each_item
|
@@ -30,15 +28,14 @@ module ReVIEW
|
|
30
28
|
def decode_args(args_str)
|
31
29
|
args = {}
|
32
30
|
args_str.split(/,\s*/).each do |pair|
|
33
|
-
key, val = pair.split(
|
31
|
+
key, val = pair.split('=')
|
34
32
|
args[key.to_sym] = val
|
35
33
|
end
|
36
34
|
args
|
37
35
|
end
|
38
36
|
|
39
37
|
def encode_args(args)
|
40
|
-
args.delete_if {|
|
38
|
+
args.delete_if { |_k, v| v.nil? }.map { |k, v| "#{k}=#{v}" }.join(',')
|
41
39
|
end
|
42
40
|
end
|
43
41
|
end
|
44
|
-
|
data/lib/review/htmlutils.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# Copyright (c) 2002-2006 Minero Aoki
|
2
|
+
# Copyright (c) 2006-2017 Minero Aoki, Kenshi Muto
|
3
|
+
# 2002-2006 Minero Aoki
|
5
4
|
#
|
6
5
|
# This program is free software.
|
7
6
|
# You can distribute or modify this program under the terms of
|
@@ -10,18 +9,17 @@
|
|
10
9
|
|
11
10
|
require 'cgi/util'
|
12
11
|
module ReVIEW
|
13
|
-
|
14
12
|
module HTMLUtils
|
15
13
|
ESC = {
|
16
14
|
'&' => '&',
|
17
15
|
'<' => '<',
|
18
16
|
'>' => '>',
|
19
17
|
'"' => '"'
|
20
|
-
}
|
18
|
+
} # .freeze
|
21
19
|
|
22
20
|
def escape_html(str)
|
23
21
|
t = ESC
|
24
|
-
str.gsub(/[&"<>]/) {|c| t[c] }
|
22
|
+
str.gsub(/[&"<>]/) { |c| t[c] }
|
25
23
|
end
|
26
24
|
|
27
25
|
alias_method :escape, :escape_html
|
@@ -35,7 +33,7 @@ module ReVIEW
|
|
35
33
|
alias_method :unescape, :unescape_html
|
36
34
|
|
37
35
|
def strip_html(str)
|
38
|
-
str.gsub(
|
36
|
+
str.gsub(%r{</?[^>]*>}, '')
|
39
37
|
end
|
40
38
|
|
41
39
|
def escape_comment(str)
|
@@ -43,40 +41,40 @@ module ReVIEW
|
|
43
41
|
end
|
44
42
|
|
45
43
|
def highlight?
|
46
|
-
@book.config[
|
47
|
-
@book.config[
|
44
|
+
@book.config['highlight'] &&
|
45
|
+
@book.config['highlight']['html']
|
48
46
|
end
|
49
47
|
|
50
48
|
def highlight(ops)
|
51
|
-
if @book.config[
|
52
|
-
raise ReVIEW::ConfigError,
|
49
|
+
if @book.config['pygments'].present?
|
50
|
+
raise ReVIEW::ConfigError, %Q('pygments:' in config.yml is obsoleted.)
|
53
51
|
end
|
54
|
-
return ops[:body].to_s
|
52
|
+
return ops[:body].to_s unless highlight?
|
55
53
|
|
56
|
-
if @book.config[
|
54
|
+
if @book.config['highlight']['html'] == 'pygments'
|
57
55
|
highlight_pygments(ops)
|
58
|
-
elsif @book.config[
|
56
|
+
elsif @book.config['highlight']['html'] == 'rouge'
|
59
57
|
highlight_rouge(ops)
|
60
58
|
else
|
61
|
-
raise ReVIEW::ConfigError, "unknown highlight method #{@book.config[
|
59
|
+
raise ReVIEW::ConfigError, "unknown highlight method #{@book.config['highlight']['html']} in config.yml."
|
62
60
|
end
|
63
61
|
end
|
64
62
|
|
65
63
|
def highlight_pygments(ops)
|
66
64
|
body = ops[:body] || ''
|
67
|
-
if @book.config[
|
68
|
-
lexer = @book.config[
|
65
|
+
if @book.config['highlight'] && @book.config['highlight']['lang']
|
66
|
+
lexer = @book.config['highlight']['lang'] # default setting
|
69
67
|
else
|
70
68
|
lexer = 'text'
|
71
69
|
end
|
72
70
|
lexer = ops[:lexer] if ops[:lexer].present?
|
73
71
|
format = ops[:format] || ''
|
74
|
-
options = {:
|
72
|
+
options = { nowrap: true, noclasses: true }
|
75
73
|
if ops[:linenum]
|
76
74
|
options[:nowrap] = false
|
77
75
|
options[:linenos] = 'inline'
|
78
76
|
end
|
79
|
-
if ops[:options] && ops[:options].
|
77
|
+
if ops[:options] && ops[:options].is_a?(Hash)
|
80
78
|
options.merge!(ops[:options])
|
81
79
|
end
|
82
80
|
|
@@ -84,9 +82,9 @@ module ReVIEW
|
|
84
82
|
require 'pygments'
|
85
83
|
begin
|
86
84
|
Pygments.highlight(unescape_html(body),
|
87
|
-
:
|
88
|
-
:
|
89
|
-
:
|
85
|
+
options: options,
|
86
|
+
formatter: format,
|
87
|
+
lexer: lexer)
|
90
88
|
rescue MentosError
|
91
89
|
body
|
92
90
|
end
|
@@ -99,12 +97,12 @@ module ReVIEW
|
|
99
97
|
body = ops[:body] || ''
|
100
98
|
if ops[:lexer].present?
|
101
99
|
lexer = ops[:lexer]
|
102
|
-
elsif @book.config[
|
103
|
-
lexer = @book.config[
|
100
|
+
elsif @book.config['highlight'] && @book.config['highlight']['lang']
|
101
|
+
lexer = @book.config['highlight']['lang'] # default setting
|
104
102
|
else
|
105
103
|
lexer = 'text'
|
106
104
|
end
|
107
|
-
format = ops[:format] || ''
|
105
|
+
# format = ops[:format] || ''
|
108
106
|
|
109
107
|
first_line_num = 1 ## default
|
110
108
|
if ops[:options] && ops[:options][:linenostart]
|
@@ -115,11 +113,11 @@ module ReVIEW
|
|
115
113
|
lexer = Rouge::Lexer.find(lexer)
|
116
114
|
raise "unknown lexer #{lexer}" unless lexer
|
117
115
|
|
118
|
-
formatter = Rouge::Formatters::HTML.new(:
|
116
|
+
formatter = Rouge::Formatters::HTML.new(css_class: 'highlight')
|
119
117
|
if ops[:linenum]
|
120
118
|
formatter = Rouge::Formatters::HTMLTable.new(formatter,
|
121
|
-
:
|
122
|
-
:
|
119
|
+
table_class: 'highlight rouge-table',
|
120
|
+
start_line: first_line_num)
|
123
121
|
end
|
124
122
|
raise "unknown formatter #{formatter}" unless formatter
|
125
123
|
|
@@ -129,13 +127,12 @@ module ReVIEW
|
|
129
127
|
|
130
128
|
def normalize_id(id)
|
131
129
|
if id =~ /\A[a-z][a-z0-9_.-]*\Z/i
|
132
|
-
|
130
|
+
id
|
133
131
|
elsif id =~ /\A[0-9_.-][a-z0-9_.-]*\Z/i
|
134
|
-
|
132
|
+
"id_#{id}" # dummy prefix
|
135
133
|
else
|
136
|
-
|
134
|
+
"id_#{CGI.escape(id.gsub('_', '__')).gsub('%', '_').gsub('+', '-')}" # escape all
|
137
135
|
end
|
138
136
|
end
|
139
137
|
end
|
140
|
-
|
141
138
|
end # module ReVIEW
|
data/lib/review/i18n.rb
CHANGED
@@ -1,20 +1,19 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
require 'yaml'
|
3
2
|
|
4
3
|
module ReVIEW
|
5
4
|
class I18n
|
6
|
-
ALPHA_U = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
|
7
|
-
ALPHA_L = %w[0 a b c d e f g h i j k l m n o p q r s t u v w x y z]
|
8
|
-
ROMAN_U = %w[0 I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII]
|
9
|
-
ROMAN_L = %w[0 i ii iii iv v vi vii viii ix x xi xii xiii xiv xv xvi xvii xviii xix xx xxi xxii xxiii xxiv xxv xxvi xxvii]
|
10
|
-
ALPHA_UW = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
|
11
|
-
ALPHA_LW = %w[0 a b c d e f g h i j k l m n o p q r s t u v w x y z]
|
12
|
-
ROMAN_UW = %w[0 Ⅰ Ⅱ Ⅲ Ⅳ V Ⅵ Ⅶ Ⅷ Ⅸ X Ⅺ Ⅻ]
|
13
|
-
ARABIC_UW = %w[〇 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27]
|
14
|
-
ARABIC_LW = %w[〇 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27]
|
15
|
-
JAPAN = %w[〇 一 二 三 四 五 六 七 八 九 十 十一 十二 十三 十四 十五 十六 十七 十八 十九 二十 二十一 二十二 二十三 二十四 二十五 二十六 二十七]
|
16
|
-
|
17
|
-
def self.setup(locale=
|
5
|
+
ALPHA_U = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z].freeze
|
6
|
+
ALPHA_L = %w[0 a b c d e f g h i j k l m n o p q r s t u v w x y z].freeze
|
7
|
+
ROMAN_U = %w[0 I II III IV V VI VII VIII IX X XI XII XIII XIV XV XVI XVII XVIII XIX XX XXI XXII XXIII XXIV XXV XXVI XXVII].freeze
|
8
|
+
ROMAN_L = %w[0 i ii iii iv v vi vii viii ix x xi xii xiii xiv xv xvi xvii xviii xix xx xxi xxii xxiii xxiv xxv xxvi xxvii].freeze
|
9
|
+
ALPHA_UW = %w[0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z].freeze
|
10
|
+
ALPHA_LW = %w[0 a b c d e f g h i j k l m n o p q r s t u v w x y z].freeze
|
11
|
+
ROMAN_UW = %w[0 Ⅰ Ⅱ Ⅲ Ⅳ V Ⅵ Ⅶ Ⅷ Ⅸ X Ⅺ Ⅻ].freeze
|
12
|
+
ARABIC_UW = %w[〇 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27].freeze
|
13
|
+
ARABIC_LW = %w[〇 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27].freeze
|
14
|
+
JAPAN = %w[〇 一 二 三 四 五 六 七 八 九 十 十一 十二 十三 十四 十五 十六 十七 十八 十九 二十 二十一 二十二 二十三 二十四 二十五 二十六 二十七].freeze
|
15
|
+
|
16
|
+
def self.setup(locale = 'ja', ymlfile = 'locale.yml')
|
18
17
|
@i18n = ReVIEW::I18n.new(locale)
|
19
18
|
|
20
19
|
lfile = nil
|
@@ -22,18 +21,14 @@ module ReVIEW
|
|
22
21
|
lfile = File.expand_path(ymlfile, Dir.pwd)
|
23
22
|
|
24
23
|
# backward compatibility
|
25
|
-
if !File.exist?(lfile) && (ymlfile ==
|
26
|
-
raise ReVIEW::ConfigError, "locale.yaml is obsoleted. Please use locale.yml."
|
27
|
-
end
|
24
|
+
raise ReVIEW::ConfigError, 'locale.yaml is obsoleted. Please use locale.yml.' if !File.exist?(lfile) && (ymlfile == 'locale.yml') && File.exist?(File.expand_path('locale.yaml', Dir.pwd))
|
28
25
|
end
|
29
26
|
|
30
|
-
if lfile && File.file?(lfile)
|
31
|
-
@i18n.update_localefile(lfile)
|
32
|
-
end
|
27
|
+
@i18n.update_localefile(lfile) if lfile && File.file?(lfile)
|
33
28
|
end
|
34
29
|
|
35
|
-
def self.i18n(*
|
36
|
-
raise NotImplementedError,
|
30
|
+
def self.i18n(*_args)
|
31
|
+
raise NotImplementedError, 'I18n.i18n is obsoleted. Please use I18n.setup(locale, [ymlfile])'
|
37
32
|
end
|
38
33
|
|
39
34
|
def self.t(str, args = nil)
|
@@ -68,7 +63,7 @@ module ReVIEW
|
|
68
63
|
end
|
69
64
|
|
70
65
|
def load_default
|
71
|
-
load_file(File.expand_path(
|
66
|
+
load_file(File.expand_path('i18n.yml', File.dirname(__FILE__)))
|
72
67
|
end
|
73
68
|
|
74
69
|
def load_file(path)
|
@@ -77,9 +72,9 @@ module ReVIEW
|
|
77
72
|
|
78
73
|
def update_localefile(path)
|
79
74
|
user_i18n = YAML.load_file(path)
|
80
|
-
locale = user_i18n[
|
75
|
+
locale = user_i18n['locale']
|
81
76
|
if locale
|
82
|
-
user_i18n.delete(
|
77
|
+
user_i18n.delete('locale')
|
83
78
|
if @store[locale]
|
84
79
|
@store[locale].merge!(user_i18n)
|
85
80
|
else
|
@@ -87,7 +82,7 @@ module ReVIEW
|
|
87
82
|
end
|
88
83
|
else
|
89
84
|
user_i18n.each do |key, values|
|
90
|
-
raise KeyError, "Invalid locale file: #{path}" unless values.
|
85
|
+
raise KeyError, "Invalid locale file: #{path}" unless values.is_a? Hash
|
91
86
|
@store[key].merge!(values)
|
92
87
|
end
|
93
88
|
end
|
@@ -111,56 +106,50 @@ module ReVIEW
|
|
111
106
|
frmt = @store[@locale][str].dup
|
112
107
|
frmt.gsub!('%%', '##')
|
113
108
|
|
114
|
-
|
115
|
-
|
116
|
-
args = []
|
117
|
-
else
|
118
|
-
args = [args]
|
119
|
-
end
|
109
|
+
unless args.is_a?(Array)
|
110
|
+
args = args.nil? && frmt !~ /\%/ ? [] : [args]
|
120
111
|
end
|
121
112
|
|
122
113
|
percents = frmt.scan(/%[A-Za-z]{1,3}/)
|
123
114
|
remove_args = []
|
124
115
|
percents.each_with_index do |i, idx|
|
125
116
|
case i
|
126
|
-
when
|
117
|
+
when '%pA'
|
127
118
|
frmt.sub!(i, ALPHA_U[args[idx]])
|
128
119
|
remove_args << idx
|
129
|
-
when
|
120
|
+
when '%pa'
|
130
121
|
frmt.sub!(i, ALPHA_L[args[idx]])
|
131
122
|
remove_args << idx
|
132
|
-
when
|
123
|
+
when '%pAW'
|
133
124
|
frmt.sub!(i, ALPHA_UW[args[idx]])
|
134
125
|
remove_args << idx
|
135
|
-
when
|
126
|
+
when '%paW'
|
136
127
|
frmt.sub!(i, ALPHA_LW[args[idx]])
|
137
128
|
remove_args << idx
|
138
|
-
when
|
129
|
+
when '%pR'
|
139
130
|
frmt.sub!(i, ROMAN_U[args[idx]])
|
140
131
|
remove_args << idx
|
141
|
-
when
|
132
|
+
when '%pr'
|
142
133
|
frmt.sub!(i, ROMAN_L[args[idx]])
|
143
134
|
remove_args << idx
|
144
|
-
when
|
135
|
+
when '%pRW'
|
145
136
|
frmt.sub!(i, ROMAN_UW[args[idx]])
|
146
137
|
remove_args << idx
|
147
|
-
when
|
138
|
+
when '%pJ'
|
148
139
|
frmt.sub!(i, JAPAN[args[idx]])
|
149
140
|
remove_args << idx
|
150
|
-
when
|
141
|
+
when '%pdW'
|
151
142
|
frmt.sub!(i, ARABIC_LW[args[idx]])
|
152
143
|
remove_args << idx
|
153
|
-
when
|
144
|
+
when '%pDW'
|
154
145
|
frmt.sub!(i, ARABIC_UW[args[idx]])
|
155
146
|
remove_args << idx
|
156
|
-
else
|
157
|
-
# do nothing
|
158
147
|
end
|
159
148
|
end
|
160
149
|
remove_args.reverse_each do |idx|
|
161
150
|
args.delete_at idx
|
162
151
|
end
|
163
|
-
args_matched = (frmt.count(
|
152
|
+
args_matched = (frmt.count('%') <= args.size)
|
164
153
|
frmt.gsub!('##', '%%')
|
165
154
|
args_matched ? (frmt % args) : frmt
|
166
155
|
rescue
|
data/lib/review/i18n.yml
CHANGED
@@ -5,7 +5,7 @@ ja:
|
|
5
5
|
column: "コラム「%s」"
|
6
6
|
columnname: "コラム"
|
7
7
|
column_head: "■コラム"
|
8
|
-
part: 第%
|
8
|
+
part: 第%pR部
|
9
9
|
part_short: "%pR"
|
10
10
|
chapter: 第%d章
|
11
11
|
chapter_short: "%d"
|
@@ -67,7 +67,7 @@ en:
|
|
67
67
|
column: "Column %s"
|
68
68
|
columnname: "Column"
|
69
69
|
column_head: "Column"
|
70
|
-
part: "Part %
|
70
|
+
part: "Part %pR"
|
71
71
|
part_short: "%pR"
|
72
72
|
chapter: Chapter %d
|
73
73
|
chapter_short: "%d"
|
@@ -126,7 +126,7 @@ zh-TW:
|
|
126
126
|
image: 圖
|
127
127
|
table: 表
|
128
128
|
list: List
|
129
|
-
part: 第%
|
129
|
+
part: 第%pR部份
|
130
130
|
part_short: "%pR"
|
131
131
|
chapter: 第%d章
|
132
132
|
chapter_short: "%d"
|
data/lib/review/idgxmlbuilder.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
# Copyright (c) 2002-2007 Minero Aoki
|
4
|
-
# 2008-2017 Minero Aoki, Kenshi Muto
|
1
|
+
# Copyright (c) 2008-2017 Minero Aoki, Kenshi Muto
|
2
|
+
# 2002-2007 Minero Aoki
|
5
3
|
#
|
6
4
|
# This program is free software.
|
7
5
|
# You can distribute or modify this program under the terms of
|
@@ -14,13 +12,11 @@ require 'review/textutils'
|
|
14
12
|
require 'nkf'
|
15
13
|
|
16
14
|
module ReVIEW
|
17
|
-
|
18
15
|
class IDGXMLBuilder < Builder
|
19
|
-
|
20
16
|
include TextUtils
|
21
17
|
include HTMLUtils
|
22
18
|
|
23
|
-
[
|
19
|
+
%i[ttbold hint maru keytop labelref ref balloon].each { |e| Compiler.definline(e) }
|
24
20
|
Compiler.defsingle(:dtp, 1)
|
25
21
|
|
26
22
|
Compiler.defblock(:insn, 0..1)
|
@@ -65,19 +61,19 @@ module ReVIEW
|
|
65
61
|
@noindent = nil
|
66
62
|
@ol_num = nil
|
67
63
|
@first_line_num = nil
|
68
|
-
@rootelement =
|
64
|
+
@rootelement = 'doc'
|
69
65
|
@secttags = nil
|
70
66
|
@tsize = nil
|
71
67
|
@texblockequation = 0
|
72
68
|
@texinlineequation = 0
|
73
69
|
print %Q(<?xml version="1.0" encoding="UTF-8"?>\n)
|
74
70
|
print %Q(<#{@rootelement} xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">)
|
75
|
-
@secttags = true unless @book.config[
|
71
|
+
@secttags = true unless @book.config['structuredxml'].nil?
|
76
72
|
end
|
77
73
|
private :builder_init_file
|
78
74
|
|
79
75
|
def puts(arg)
|
80
|
-
if @book.config[
|
76
|
+
if @book.config['nolf'].present?
|
81
77
|
print arg
|
82
78
|
else
|
83
79
|
super
|
@@ -85,43 +81,25 @@ module ReVIEW
|
|
85
81
|
end
|
86
82
|
|
87
83
|
def result
|
88
|
-
s =
|
89
|
-
|
90
|
-
s +=
|
91
|
-
s +=
|
92
|
-
s +=
|
93
|
-
s +=
|
94
|
-
s +=
|
84
|
+
s = ''
|
85
|
+
if @secttags
|
86
|
+
s += '</sect4>' if @subsubsubsection > 0
|
87
|
+
s += '</sect3>' if @subsubsection > 0
|
88
|
+
s += '</sect2>' if @subsection > 0
|
89
|
+
s += '</sect>' if @section > 0
|
90
|
+
s += '</chapter>' if @chapter.number > 0
|
95
91
|
end
|
96
92
|
@output.string + s + "</#{@rootelement}>\n"
|
97
93
|
end
|
98
94
|
|
99
|
-
def warn(msg)
|
100
|
-
if @no_error
|
101
|
-
@warns.push [@location.filename, @location.lineno, msg]
|
102
|
-
puts "----WARNING: #{escape_html(msg)}----"
|
103
|
-
else
|
104
|
-
$stderr.puts "#{@location}: warning: #{msg}"
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def error(msg)
|
109
|
-
if @no_error
|
110
|
-
@errors.push [@location.filename, @location.lineno, msg]
|
111
|
-
puts "----ERROR: #{escape_html(msg)}----"
|
112
|
-
else
|
113
|
-
$stderr.puts "#{@location}: error: #{msg}"
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
95
|
def headline(level, label, caption)
|
118
96
|
case level
|
119
97
|
when 1
|
120
|
-
|
121
|
-
print
|
122
|
-
print
|
123
|
-
print
|
124
|
-
print
|
98
|
+
if @secttags
|
99
|
+
print '</sect4>' if @subsubsubsection > 0
|
100
|
+
print '</sect3>' if @subsubsection > 0
|
101
|
+
print '</sect2>' if @subsection > 0
|
102
|
+
print '</sect>' if @section > 0
|
125
103
|
end
|
126
104
|
|
127
105
|
print %Q(<chapter id="chap:#{@chapter.number}">) unless @secttags.nil?
|
@@ -131,11 +109,11 @@ module ReVIEW
|
|
131
109
|
@subsubsection = 0
|
132
110
|
@subsubsubsection = 0
|
133
111
|
when 2
|
134
|
-
|
135
|
-
print
|
136
|
-
print
|
137
|
-
print
|
138
|
-
print
|
112
|
+
if @secttags
|
113
|
+
print '</sect4>' if @subsubsubsection > 0
|
114
|
+
print '</sect3>' if @subsubsection > 0
|
115
|
+
print '</sect2>' if @subsection > 0
|
116
|
+
print '</sect>' if @section > 0
|
139
117
|
end
|
140
118
|
@section += 1
|
141
119
|
print %Q(<sect id="sect:#{@chapter.number}.#{@section}">) unless @secttags.nil?
|
@@ -144,10 +122,10 @@ module ReVIEW
|
|
144
122
|
@subsubsection = 0
|
145
123
|
@subsubsubsection = 0
|
146
124
|
when 3
|
147
|
-
|
148
|
-
print
|
149
|
-
print
|
150
|
-
print
|
125
|
+
if @secttags
|
126
|
+
print '</sect4>' if @subsubsubsection > 0
|
127
|
+
print '</sect3>' if @subsubsection > 0
|
128
|
+
print '</sect2>' if @subsection > 0
|
151
129
|
end
|
152
130
|
|
153
131
|
@subsection += 1
|
@@ -156,35 +134,33 @@ module ReVIEW
|
|
156
134
|
@subsubsection = 0
|
157
135
|
@subsubsubsection = 0
|
158
136
|
when 4
|
159
|
-
|
160
|
-
print
|
161
|
-
print
|
137
|
+
if @secttags
|
138
|
+
print '</sect4>' if @subsubsubsection > 0
|
139
|
+
print '</sect3>' if @subsubsection > 0
|
162
140
|
end
|
163
141
|
|
164
142
|
@subsubsection += 1
|
165
|
-
print %Q(<sect3 id="sect:#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}">)
|
143
|
+
print %Q(<sect3 id="sect:#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}">) if @secttags
|
166
144
|
|
167
145
|
@subsubsubsection = 0
|
168
146
|
when 5
|
169
|
-
|
170
|
-
print "</sect4>" if @subsubsubsection > 0
|
171
|
-
end
|
147
|
+
print '</sect4>' if @secttags && @subsubsubsection > 0
|
172
148
|
|
173
149
|
@subsubsubsection += 1
|
174
|
-
print %Q(<sect4 id="sect:#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection}">)
|
150
|
+
print %Q(<sect4 id="sect:#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection}">) if @secttags
|
175
151
|
else
|
176
152
|
raise "caption level too deep or unsupported: #{level}"
|
177
153
|
end
|
178
154
|
|
179
|
-
prefix,
|
155
|
+
prefix, _anchor = headline_prefix(level)
|
180
156
|
|
181
|
-
label = label.nil? ?
|
157
|
+
label = label.nil? ? '' : %Q( id="#{label}")
|
182
158
|
toccaption = escape_html(compile_inline(caption.gsub(/@<fn>\{.+?\}/, '')).gsub(/<[^>]+>/, ''))
|
183
159
|
puts %Q(<title#{label} aid:pstyle="h#{level}">#{prefix}#{compile_inline(caption)}</title><?dtp level="#{level}" section="#{prefix}#{toccaption}"?>)
|
184
160
|
end
|
185
161
|
|
186
162
|
def ul_begin
|
187
|
-
level = block_given? ? yield :
|
163
|
+
level = block_given? ? yield : ''
|
188
164
|
level = nil if level == 1
|
189
165
|
puts "<ul#{level == 1 ? nil : level}>"
|
190
166
|
end
|
@@ -194,36 +170,34 @@ module ReVIEW
|
|
194
170
|
end
|
195
171
|
|
196
172
|
def ul_item_end
|
197
|
-
puts
|
173
|
+
puts '</li>'
|
198
174
|
end
|
199
175
|
|
200
176
|
def choice_single_begin
|
201
|
-
puts
|
177
|
+
puts %Q(<choice type='single'>)
|
202
178
|
end
|
203
179
|
|
204
180
|
def choice_multi_begin
|
205
|
-
puts
|
181
|
+
puts %Q(<choice type='multi'>)
|
206
182
|
end
|
207
183
|
|
208
184
|
def choice_single_end
|
209
|
-
puts
|
185
|
+
puts '</choice>'
|
210
186
|
end
|
211
187
|
|
212
188
|
def choice_multi_end
|
213
|
-
puts
|
189
|
+
puts '</choice>'
|
214
190
|
end
|
215
191
|
|
216
192
|
def ul_end
|
217
|
-
level = block_given? ? yield :
|
193
|
+
level = block_given? ? yield : ''
|
218
194
|
level = nil if level == 1
|
219
195
|
puts "</ul#{level}>"
|
220
196
|
end
|
221
197
|
|
222
198
|
def ol_begin
|
223
199
|
puts '<ol>'
|
224
|
-
|
225
|
-
@ol_num = 1
|
226
|
-
end
|
200
|
+
@ol_num ||= 1
|
227
201
|
end
|
228
202
|
|
229
203
|
def ol_item(lines, num)
|
@@ -259,7 +233,7 @@ module ReVIEW
|
|
259
233
|
def paragraph(lines)
|
260
234
|
if @noindent.nil?
|
261
235
|
if lines[0] =~ /\A(\t+)/
|
262
|
-
puts %Q(<p inlist="#{$1.size}">#{lines.join
|
236
|
+
puts %Q(<p inlist="#{$1.size}">#{lines.join.sub(/\A\t+/, '')}</p>)
|
263
237
|
else
|
264
238
|
puts "<p>#{lines.join}</p>"
|
265
239
|
end
|
@@ -270,95 +244,96 @@ module ReVIEW
|
|
270
244
|
end
|
271
245
|
|
272
246
|
def read(lines)
|
273
|
-
puts %Q
|
247
|
+
puts %Q(<lead>#{split_paragraph(lines).join}</lead>)
|
274
248
|
end
|
275
249
|
|
276
250
|
alias_method :lead, :read
|
277
251
|
|
278
|
-
def column_label(id)
|
279
|
-
num =
|
252
|
+
def column_label(id, chapter = @chapter)
|
253
|
+
num = chapter.column(id).number
|
280
254
|
"column-#{num}"
|
281
255
|
end
|
282
256
|
private :column_label
|
283
257
|
|
284
258
|
def inline_column_chap(chapter, id)
|
285
|
-
if @book.config[
|
286
|
-
%Q(<link href="#{column_label(id)}">#{I18n.t(
|
259
|
+
if @book.config['chapterlink']
|
260
|
+
%Q(<link href="#{column_label(id, chapter)}">#{I18n.t('column', compile_inline(chapter.column(id).caption))}</link>)
|
287
261
|
else
|
288
|
-
I18n.t(
|
262
|
+
I18n.t('column', compile_inline(chapter.column(id).caption))
|
289
263
|
end
|
290
264
|
end
|
291
265
|
|
292
266
|
def inline_list(id)
|
293
267
|
chapter, id = extract_chapter_id(id)
|
294
268
|
if get_chap(chapter).nil?
|
295
|
-
"<span type='list'>#{I18n.t(
|
269
|
+
"<span type='list'>#{I18n.t('list')}#{I18n.t('format_number_without_chapter', [chapter.list(id).number])}</span>"
|
296
270
|
else
|
297
|
-
"<span type='list'>#{I18n.t(
|
271
|
+
"<span type='list'>#{I18n.t('list')}#{I18n.t('format_number', [get_chap(chapter), chapter.list(id).number])}</span>"
|
298
272
|
end
|
299
273
|
end
|
300
274
|
|
301
|
-
def list_header(id, caption,
|
302
|
-
puts
|
275
|
+
def list_header(id, caption, _lang)
|
276
|
+
puts '<codelist>'
|
277
|
+
return true unless caption.present?
|
303
278
|
if get_chap.nil?
|
304
|
-
puts %Q
|
279
|
+
puts %Q(<caption>#{I18n.t('list')}#{I18n.t('format_number_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
|
305
280
|
else
|
306
|
-
puts %Q
|
281
|
+
puts %Q(<caption>#{I18n.t('list')}#{I18n.t('format_number', [get_chap, @chapter.list(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
|
307
282
|
end
|
308
283
|
end
|
309
284
|
|
310
285
|
def codelines_body(lines)
|
311
286
|
no = 1
|
312
287
|
lines.each do |line|
|
313
|
-
|
314
|
-
print
|
315
|
-
print
|
316
|
-
print
|
317
|
-
print
|
288
|
+
if @book.config['listinfo']
|
289
|
+
print %Q(<listinfo line="#{no}")
|
290
|
+
print %Q( begin="1") if no == 1
|
291
|
+
print %Q( end="#{no}") if no == lines.size
|
292
|
+
print '>'
|
318
293
|
end
|
319
294
|
print detab(line)
|
320
295
|
print "\n"
|
321
|
-
print
|
296
|
+
print '</listinfo>' if @book.config['listinfo']
|
322
297
|
no += 1
|
323
298
|
end
|
324
299
|
end
|
325
300
|
|
326
|
-
def list_body(
|
327
|
-
print
|
301
|
+
def list_body(_id, lines, _lang)
|
302
|
+
print '<pre>'
|
328
303
|
codelines_body(lines)
|
329
|
-
puts
|
304
|
+
puts '</pre></codelist>'
|
330
305
|
end
|
331
306
|
|
332
|
-
def emlist(lines, caption = nil,
|
307
|
+
def emlist(lines, caption = nil, _lang = nil)
|
333
308
|
quotedlist lines, 'emlist', caption
|
334
309
|
end
|
335
310
|
|
336
|
-
def emlistnum(lines, caption = nil,
|
337
|
-
|
338
|
-
first_line_num =
|
311
|
+
def emlistnum(lines, caption = nil, _lang = nil)
|
312
|
+
lines2 = []
|
313
|
+
first_line_num = line_num
|
339
314
|
lines.each_with_index do |line, i|
|
340
|
-
|
315
|
+
lines2 << detab(%Q(<span type='lineno'>) + (i + first_line_num).to_s.rjust(2) + ': </span>' + line)
|
341
316
|
end
|
342
|
-
quotedlist
|
317
|
+
quotedlist lines2, 'emlistnum', caption
|
343
318
|
end
|
344
319
|
|
345
|
-
def listnum_body(lines,
|
346
|
-
print
|
320
|
+
def listnum_body(lines, _lang)
|
321
|
+
print '<pre>'
|
347
322
|
no = 1
|
348
|
-
first_line_num =
|
323
|
+
first_line_num = line_num
|
349
324
|
lines.each_with_index do |line, i|
|
350
|
-
|
351
|
-
print
|
352
|
-
print
|
353
|
-
print
|
354
|
-
print
|
325
|
+
if @book.config['listinfo']
|
326
|
+
print %Q(<listinfo line="#{no}")
|
327
|
+
print %Q( begin="1") if no == 1
|
328
|
+
print %Q( end="#{no}") if no == lines.size
|
329
|
+
print '>'
|
355
330
|
end
|
356
|
-
print detab(
|
331
|
+
print detab(%Q(<span type='lineno'>) + (i + first_line_num).to_s.rjust(2) + ': </span>' + line)
|
357
332
|
print "\n"
|
358
|
-
print
|
333
|
+
print '</listinfo>' if @book.config['listinfo']
|
359
334
|
no += 1
|
360
335
|
end
|
361
|
-
puts
|
336
|
+
puts '</pre></codelist>'
|
362
337
|
end
|
363
338
|
|
364
339
|
def cmd(lines, caption = nil)
|
@@ -366,20 +341,20 @@ module ReVIEW
|
|
366
341
|
end
|
367
342
|
|
368
343
|
def quotedlist(lines, css_class, caption)
|
369
|
-
print %Q
|
344
|
+
print %Q(<list type='#{css_class}'>)
|
370
345
|
puts "<caption aid:pstyle='#{css_class}-title'>#{compile_inline(caption)}</caption>" if caption.present?
|
371
|
-
print
|
346
|
+
print '<pre>'
|
372
347
|
no = 1
|
373
348
|
lines.each do |line|
|
374
|
-
|
375
|
-
print
|
376
|
-
print
|
377
|
-
print
|
378
|
-
print
|
349
|
+
if @book.config['listinfo']
|
350
|
+
print %Q(<listinfo line="#{no}")
|
351
|
+
print %Q( begin="1") if no == 1
|
352
|
+
print %Q( end="#{no}") if no == lines.size
|
353
|
+
print '>'
|
379
354
|
end
|
380
355
|
print detab(line)
|
381
356
|
print "\n"
|
382
|
-
print
|
357
|
+
print '</listinfo>' if @book.config['listinfo']
|
383
358
|
no += 1
|
384
359
|
end
|
385
360
|
puts '</pre></list>'
|
@@ -388,24 +363,24 @@ module ReVIEW
|
|
388
363
|
|
389
364
|
def quote(lines)
|
390
365
|
blocked_lines = split_paragraph(lines)
|
391
|
-
puts "<quote>#{blocked_lines.join
|
366
|
+
puts "<quote>#{blocked_lines.join}</quote>"
|
392
367
|
end
|
393
368
|
|
394
369
|
def inline_table(id)
|
395
370
|
chapter, id = extract_chapter_id(id)
|
396
371
|
if get_chap(chapter).nil?
|
397
|
-
"<span type='table'>#{I18n.t(
|
372
|
+
"<span type='table'>#{I18n.t('table')}#{I18n.t('format_number_without_chapter', [chapter.table(id).number])}</span>"
|
398
373
|
else
|
399
|
-
"<span type='table'>#{I18n.t(
|
374
|
+
"<span type='table'>#{I18n.t('table')}#{I18n.t('format_number', [get_chap(chapter), chapter.table(id).number])}</span>"
|
400
375
|
end
|
401
376
|
end
|
402
377
|
|
403
378
|
def inline_img(id)
|
404
379
|
chapter, id = extract_chapter_id(id)
|
405
380
|
if get_chap(chapter).nil?
|
406
|
-
"<span type='image'>#{I18n.t(
|
381
|
+
"<span type='image'>#{I18n.t('image')}#{I18n.t('format_number_without_chapter', [chapter.image(id).number])}</span>"
|
407
382
|
else
|
408
|
-
"<span type='image'>#{I18n.t(
|
383
|
+
"<span type='image'>#{I18n.t('image')}#{I18n.t('format_number', [get_chap(chapter), chapter.image(id).number])}</span>"
|
409
384
|
end
|
410
385
|
end
|
411
386
|
|
@@ -413,69 +388,66 @@ module ReVIEW
|
|
413
388
|
chapter, id = extract_chapter_id(id)
|
414
389
|
if chapter.image(id).caption.blank?
|
415
390
|
inline_img(id)
|
391
|
+
elsif get_chap(chapter).nil?
|
392
|
+
"<span type='image'>#{I18n.t('image')}#{I18n.t('format_number_without_chapter', [chapter.image(id).number])}#{I18n.t('image_quote', chapter.image(id).caption)}</span>"
|
416
393
|
else
|
417
|
-
|
418
|
-
"<span type='image'>#{I18n.t("image")}#{I18n.t("format_number_without_chapter", [chapter.image(id).number])}#{I18n.t('image_quote', chapter.image(id).caption)}</span>"
|
419
|
-
else
|
420
|
-
"<span type='image'>#{I18n.t("image")}#{I18n.t("format_number", [get_chap(chapter), chapter.image(id).number])}#{I18n.t('image_quote', chapter.image(id).caption)}</span>"
|
421
|
-
end
|
394
|
+
"<span type='image'>#{I18n.t('image')}#{I18n.t('format_number', [get_chap(chapter), chapter.image(id).number])}#{I18n.t('image_quote', chapter.image(id).caption)}</span>"
|
422
395
|
end
|
423
396
|
end
|
424
397
|
|
425
398
|
def handle_metric(str)
|
426
399
|
k, v = str.split('=', 2)
|
427
|
-
|
400
|
+
%Q(#{k}="#{v.sub(/\A["']/, '').sub(/["']\Z/, '')}")
|
428
401
|
end
|
429
402
|
|
430
403
|
def result_metric(array)
|
431
404
|
" #{array.join(' ')}"
|
432
405
|
end
|
433
406
|
|
434
|
-
def image_image(id, caption, metric=nil)
|
435
|
-
metrics = parse_metric(
|
436
|
-
puts
|
437
|
-
puts %Q
|
407
|
+
def image_image(id, caption, metric = nil)
|
408
|
+
metrics = parse_metric('idgxml', metric)
|
409
|
+
puts '<img>'
|
410
|
+
puts %Q(<Image href="file://#{@chapter.image(id).path.sub(%r{\A./}, '')}"#{metrics} />)
|
438
411
|
image_header id, caption
|
439
|
-
puts
|
412
|
+
puts '</img>'
|
440
413
|
end
|
441
414
|
|
442
415
|
def image_dummy(id, caption, lines)
|
443
|
-
puts
|
444
|
-
print %Q
|
416
|
+
puts '<img>'
|
417
|
+
print %Q(<pre aid:pstyle="dummyimage">)
|
445
418
|
lines.each do |line|
|
446
419
|
print detab(line)
|
447
420
|
print "\n"
|
448
421
|
end
|
449
|
-
print
|
422
|
+
print '</pre>'
|
450
423
|
image_header id, caption
|
451
|
-
puts
|
452
|
-
warn "
|
424
|
+
puts '</img>'
|
425
|
+
warn "image not bound: #{id}"
|
453
426
|
end
|
454
427
|
|
455
428
|
def image_header(id, caption)
|
429
|
+
return true unless caption.present?
|
456
430
|
if get_chap.nil?
|
457
|
-
puts %Q
|
431
|
+
puts %Q(<caption>#{I18n.t('image')}#{I18n.t('format_number_without_chapter', [@chapter.image(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
|
458
432
|
else
|
459
|
-
puts %Q
|
433
|
+
puts %Q(<caption>#{I18n.t('image')}#{I18n.t('format_number', [get_chap, @chapter.image(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
|
460
434
|
end
|
461
435
|
end
|
462
436
|
|
463
437
|
def texequation(lines)
|
464
438
|
@texblockequation += 1
|
465
|
-
puts %Q
|
439
|
+
puts %Q(<replace idref="texblock-#{@texblockequation}">)
|
466
440
|
puts '<pre>'
|
467
|
-
puts
|
441
|
+
puts lines.join("\n")
|
468
442
|
puts '</pre>'
|
469
443
|
puts '</replace>'
|
470
444
|
end
|
471
445
|
|
472
446
|
def table(lines, id = nil, caption = nil)
|
473
|
-
tablewidth = nil
|
447
|
+
tablewidth = @book.config['tableopt'] ? @book.config['tableopt'].split(',')[0].to_f / @book.config['pt_to_mm_unit'].to_f : nil
|
474
448
|
col = 0
|
475
|
-
|
476
|
-
|
477
|
-
end
|
478
|
-
puts "<table>"
|
449
|
+
|
450
|
+
puts '<table>'
|
479
451
|
rows = []
|
480
452
|
sepidx = nil
|
481
453
|
lines.each_with_index do |line, idx|
|
@@ -483,94 +455,90 @@ module ReVIEW
|
|
483
455
|
sepidx ||= idx
|
484
456
|
next
|
485
457
|
end
|
486
|
-
if tablewidth
|
487
|
-
rows.push(line.gsub(/\t\.\t/, "\
|
458
|
+
if tablewidth
|
459
|
+
rows.push(line.gsub(/\t\.\t/, "\tDUMMYCELLSPLITTER\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\tDUMMYCELLSPLITTER").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ''))
|
488
460
|
else
|
489
|
-
rows.push(line.gsub(/\t\.\t/, "\
|
461
|
+
rows.push(line.gsub(/\t\.\t/, "\t\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\t").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ''))
|
490
462
|
end
|
491
|
-
|
492
|
-
col =
|
463
|
+
col2 = rows[rows.length - 1].split(/\t/).length
|
464
|
+
col = col2 if col2 > col
|
493
465
|
end
|
494
466
|
|
495
467
|
cellwidth = []
|
496
|
-
|
468
|
+
if tablewidth
|
497
469
|
if @tsize.nil?
|
498
|
-
col.times {|n| cellwidth[n] = tablewidth / col }
|
470
|
+
col.times { |n| cellwidth[n] = tablewidth / col }
|
499
471
|
else
|
500
472
|
cellwidth = @tsize.split(/\s*,\s*/)
|
501
473
|
totallength = 0
|
502
474
|
cellwidth.size.times do |n|
|
503
|
-
cellwidth[n] = cellwidth[n].to_f / @book.config[
|
475
|
+
cellwidth[n] = cellwidth[n].to_f / @book.config['pt_to_mm_unit'].to_f
|
504
476
|
totallength += cellwidth[n]
|
505
477
|
warn "total length exceeds limit for table: #{id}" if totallength > tablewidth
|
506
478
|
end
|
507
479
|
if cellwidth.size < col
|
508
480
|
cw = (tablewidth - totallength) / (col - cellwidth.size)
|
509
481
|
warn "auto cell sizing exceeds limit for table: #{id}" if cw <= 0
|
510
|
-
(cellwidth.size..(col - 1)).each
|
511
|
-
cellwidth[i] = cw
|
512
|
-
end
|
482
|
+
(cellwidth.size..(col - 1)).each { |i| cellwidth[i] = cw }
|
513
483
|
end
|
514
484
|
end
|
515
485
|
end
|
516
486
|
|
517
487
|
begin
|
518
|
-
table_header id, caption
|
488
|
+
table_header id, caption if caption.present?
|
519
489
|
rescue KeyError
|
520
490
|
error "no such table: #{id}"
|
521
491
|
end
|
522
492
|
return if rows.empty?
|
523
493
|
|
524
494
|
if tablewidth.nil?
|
525
|
-
print
|
495
|
+
print '<tbody>'
|
526
496
|
else
|
527
|
-
print %Q
|
497
|
+
print %Q(<tbody xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="#{rows.length}" aid:tcols="#{col}">)
|
528
498
|
end
|
529
499
|
|
530
500
|
if sepidx
|
531
501
|
sepidx.times do |y|
|
532
502
|
if tablewidth.nil?
|
533
|
-
puts %Q
|
503
|
+
puts %Q(<tr type="header">#{rows.shift}</tr>)
|
534
504
|
else
|
535
505
|
i = 0
|
536
|
-
rows.shift.split(
|
537
|
-
print %Q
|
506
|
+
rows.shift.split("\t").each_with_index do |cell, x|
|
507
|
+
print %Q(<td xyh="#{x + 1},#{y + 1},#{sepidx}" aid:table="cell" aid:theader="1" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf('%.3f', cellwidth[i])}">#{cell.sub('DUMMYCELLSPLITTER', '')}</td>)
|
538
508
|
i += 1
|
539
509
|
end
|
540
510
|
end
|
541
511
|
end
|
542
512
|
end
|
543
513
|
trputs(tablewidth, rows, cellwidth, sepidx)
|
544
|
-
puts
|
514
|
+
puts '</tbody></table>'
|
545
515
|
@tsize = nil
|
546
516
|
end
|
547
517
|
|
548
518
|
def trputs(tablewidth, rows, cellwidth, sepidx)
|
549
519
|
sepidx = 0 if sepidx.nil?
|
550
|
-
if tablewidth
|
551
|
-
lastline = rows.pop
|
552
|
-
rows.each {|row| puts %Q[<tr>#{row}</tr>] }
|
553
|
-
puts %Q[<tr type="lastline">#{lastline}</tr>] unless lastline.nil?
|
554
|
-
else
|
520
|
+
if tablewidth
|
555
521
|
rows.each_with_index do |row, y|
|
556
522
|
i = 0
|
557
|
-
row.split(
|
558
|
-
print %Q
|
523
|
+
row.split("\t").each_with_index do |cell, x|
|
524
|
+
print %Q(<td xyh="#{x + 1},#{y + 1 + sepidx},#{sepidx}" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf('%.3f', cellwidth[i])}">#{cell.sub('DUMMYCELLSPLITTER', '')}</td>)
|
559
525
|
i += 1
|
560
526
|
end
|
561
527
|
end
|
528
|
+
else
|
529
|
+
lastline = rows.pop
|
530
|
+
rows.each { |row| puts "<tr>#{row}</tr>" }
|
531
|
+
puts %Q(<tr type="lastline">#{lastline}</tr>) if lastline
|
562
532
|
end
|
563
533
|
end
|
564
534
|
|
565
535
|
def table_header(id, caption)
|
566
536
|
if id.nil?
|
567
|
-
puts %Q
|
537
|
+
puts %Q(<caption>#{compile_inline(caption)}</caption>)
|
538
|
+
elsif get_chap
|
539
|
+
puts %Q(<caption>#{I18n.t('table')}#{I18n.t('format_number', [get_chap, @chapter.table(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
|
568
540
|
else
|
569
|
-
|
570
|
-
puts %Q[<caption>#{I18n.t("table")}#{I18n.t("format_number_without_chapter", [@chapter.table(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
|
571
|
-
else
|
572
|
-
puts %Q[<caption>#{I18n.t("table")}#{I18n.t("format_number", [get_chap, @chapter.table(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
|
573
|
-
end
|
541
|
+
puts %Q(<caption>#{I18n.t('table')}#{I18n.t('format_number_without_chapter', [@chapter.table(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
|
574
542
|
end
|
575
543
|
end
|
576
544
|
|
@@ -578,11 +546,11 @@ module ReVIEW
|
|
578
546
|
end
|
579
547
|
|
580
548
|
def tr(rows)
|
581
|
-
puts %Q
|
549
|
+
puts %Q(<tr>#{rows.join("\t")}</tr>)
|
582
550
|
end
|
583
551
|
|
584
552
|
def th(str)
|
585
|
-
%Q
|
553
|
+
%Q(<?dtp tablerow header?>#{str})
|
586
554
|
end
|
587
555
|
|
588
556
|
def td(str)
|
@@ -590,7 +558,7 @@ module ReVIEW
|
|
590
558
|
end
|
591
559
|
|
592
560
|
def table_end
|
593
|
-
print
|
561
|
+
print '<?dtp tablerow last?>'
|
594
562
|
end
|
595
563
|
|
596
564
|
def emtable(lines, caption = nil)
|
@@ -599,11 +567,11 @@ module ReVIEW
|
|
599
567
|
|
600
568
|
def imgtable(lines, id, caption = nil, metric = nil)
|
601
569
|
if @chapter.image(id).bound?
|
602
|
-
metrics = parse_metric(
|
603
|
-
puts
|
604
|
-
table_header id, caption
|
605
|
-
puts %Q
|
606
|
-
puts
|
570
|
+
metrics = parse_metric('idgxml', metric)
|
571
|
+
puts '<table>'
|
572
|
+
table_header id, caption if caption.present?
|
573
|
+
puts %Q(<imgtable><Image href="file://#{@chapter.image(id).path.sub(%r{\A./}, '')}"#{metrics} /></imgtable>)
|
574
|
+
puts '</table>'
|
607
575
|
else
|
608
576
|
warn "image not bound: #{id}" if @strict
|
609
577
|
image_dummy id, caption, lines
|
@@ -611,16 +579,15 @@ module ReVIEW
|
|
611
579
|
end
|
612
580
|
|
613
581
|
def comment(lines, comment = nil)
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
end
|
582
|
+
return true unless @book.config['draft']
|
583
|
+
lines ||= []
|
584
|
+
lines.unshift comment unless comment.blank?
|
585
|
+
str = lines.join("\n")
|
586
|
+
print "<msg>#{escape_html(str)}</msg>"
|
620
587
|
end
|
621
588
|
|
622
589
|
def inline_comment(str)
|
623
|
-
if @book.config[
|
590
|
+
if @book.config['draft']
|
624
591
|
%Q(<msg>#{escape_html(str)}</msg>)
|
625
592
|
else
|
626
593
|
''
|
@@ -632,11 +599,11 @@ module ReVIEW
|
|
632
599
|
end
|
633
600
|
|
634
601
|
def inline_fn(id)
|
635
|
-
%Q
|
602
|
+
%Q(<footnote>#{compile_inline(@chapter.footnote(id).content.strip)}</footnote>)
|
636
603
|
end
|
637
604
|
|
638
605
|
def compile_ruby(base, ruby)
|
639
|
-
%Q
|
606
|
+
%Q(<GroupRuby><aid:ruby xmlns:aid="http://ns.adobe.com/AdobeInDesign/3.0/"><aid:rb>#{escape_html(base.strip)}</aid:rb><aid:rt>#{escape_html(ruby.strip)}</aid:rt></aid:ruby></GroupRuby>)
|
640
607
|
end
|
641
608
|
|
642
609
|
def compile_kw(word, alt)
|
@@ -646,55 +613,55 @@ module ReVIEW
|
|
646
613
|
else escape_html(word)
|
647
614
|
end +
|
648
615
|
'</keyword>' +
|
649
|
-
%Q
|
616
|
+
%Q(<index value="#{escape_html(word)}" />) +
|
650
617
|
if alt
|
651
|
-
alt.split(/\s*,\s*/).collect! {|e| %Q
|
618
|
+
alt.split(/\s*,\s*/).collect! { |e| %Q(<index value="#{escape_html(e.strip)}" />) }.join
|
652
619
|
else
|
653
|
-
|
620
|
+
''
|
654
621
|
end
|
655
622
|
end
|
656
623
|
|
657
624
|
def compile_href(url, label)
|
658
|
-
%Q
|
625
|
+
%Q(<a linkurl='#{escape_html(url)}'>#{label.nil? ? escape_html(url) : escape_html(label)}</a>)
|
659
626
|
end
|
660
627
|
|
661
628
|
def inline_sup(str)
|
662
|
-
%Q
|
629
|
+
%Q(<sup>#{escape_html(str)}</sup>)
|
663
630
|
end
|
664
631
|
|
665
632
|
def inline_sub(str)
|
666
|
-
%Q
|
633
|
+
%Q(<sub>#{escape_html(str)}</sub>)
|
667
634
|
end
|
668
635
|
|
669
636
|
def inline_raw(str)
|
670
|
-
|
637
|
+
super(str).gsub('\\n', "\n")
|
671
638
|
end
|
672
639
|
|
673
640
|
def inline_hint(str)
|
674
|
-
if @book.config[
|
675
|
-
%Q
|
641
|
+
if @book.config['nolf']
|
642
|
+
%Q(<hint>#{escape_html(str)}</hint>)
|
676
643
|
else
|
677
|
-
%Q
|
644
|
+
%Q(\n<hint>#{escape_html(str)}</hint>)
|
678
645
|
end
|
679
646
|
end
|
680
647
|
|
681
648
|
def inline_maru(str)
|
682
649
|
if str =~ /\A\d+\Z/
|
683
|
-
sprintf(
|
650
|
+
sprintf('&#x%x;', 9311 + str.to_i)
|
684
651
|
elsif str =~ /\A[A-Z]\Z/
|
685
652
|
begin
|
686
|
-
sprintf(
|
653
|
+
sprintf('&#x%x;', 9398 + str.codepoints.to_a[0] - 65)
|
687
654
|
rescue NoMethodError
|
688
|
-
sprintf(
|
655
|
+
sprintf('&#x%x;', 9398 + str[0] - 65)
|
689
656
|
end
|
690
657
|
elsif str =~ /\A[a-z]\Z/
|
691
658
|
begin
|
692
|
-
sprintf(
|
659
|
+
sprintf('&#x%x;', 9392 + str.codepoints.to_a[0] - 65)
|
693
660
|
rescue NoMethodError
|
694
|
-
sprintf(
|
661
|
+
sprintf('&#x%x;', 9392 + str[0] - 65)
|
695
662
|
end
|
696
663
|
else
|
697
|
-
|
664
|
+
error "can't parse maru: #{str}"
|
698
665
|
end
|
699
666
|
end
|
700
667
|
|
@@ -738,42 +705,42 @@ module ReVIEW
|
|
738
705
|
|
739
706
|
def inline_icon(id)
|
740
707
|
begin
|
741
|
-
%Q
|
708
|
+
%Q(<Image href="file://#{@chapter.image(id).path.sub(%r{\A\./}, '')}" type="inline" />)
|
742
709
|
rescue
|
743
|
-
warn "
|
744
|
-
|
710
|
+
warn "image not bound: #{id}"
|
711
|
+
''
|
745
712
|
end
|
746
713
|
end
|
747
714
|
|
748
715
|
def inline_bou(str)
|
749
|
-
%Q
|
716
|
+
%Q(<bou>#{escape_html(str)}</bou>)
|
750
717
|
end
|
751
718
|
|
752
719
|
def inline_keytop(str)
|
753
|
-
%Q
|
720
|
+
%Q(<keytop>#{escape_html(str)}</keytop>)
|
754
721
|
end
|
755
722
|
|
756
723
|
def inline_labelref(idref)
|
757
|
-
%Q
|
724
|
+
%Q(<ref idref='#{escape_html(idref)}'>「#{I18n.t('label_marker')}#{escape_html(idref)}」</ref>) # FIXME: 節名とタイトルも込みで要出力
|
758
725
|
end
|
759
726
|
|
760
727
|
alias_method :inline_ref, :inline_labelref
|
761
728
|
|
762
729
|
def inline_pageref(idref)
|
763
|
-
%Q
|
730
|
+
%Q(<pageref idref='#{escape_html(idref)}'>●●</pageref>) # ページ番号を参照
|
764
731
|
end
|
765
732
|
|
766
733
|
def inline_balloon(str)
|
767
|
-
%Q
|
734
|
+
%Q(<balloon>#{escape_html(str).gsub(/@maru\[(\d+)\]/) { inline_maru($1) }}</balloon>)
|
768
735
|
end
|
769
736
|
|
770
737
|
def inline_uchar(str)
|
771
|
-
%Q
|
738
|
+
%Q(&#x#{str};)
|
772
739
|
end
|
773
740
|
|
774
741
|
def inline_m(str)
|
775
742
|
@texinlineequation += 1
|
776
|
-
%Q
|
743
|
+
%Q(<replace idref="texinline-#{@texinlineequation}"><pre>#{escape_html(str)}</pre></replace>)
|
777
744
|
end
|
778
745
|
|
779
746
|
def noindent
|
@@ -782,22 +749,22 @@ module ReVIEW
|
|
782
749
|
|
783
750
|
def linebreak
|
784
751
|
# FIXME: pが閉じちゃってるので一度戻らないといけないが、難しい…。
|
785
|
-
puts
|
752
|
+
puts '<br />'
|
786
753
|
end
|
787
754
|
|
788
755
|
def pagebreak
|
789
|
-
puts
|
756
|
+
puts '<pagebreak />'
|
790
757
|
end
|
791
758
|
|
792
|
-
def nonum_begin(level,
|
793
|
-
puts %Q
|
759
|
+
def nonum_begin(level, _label, caption)
|
760
|
+
puts %Q(<title aid:pstyle="h#{level}">#{compile_inline(caption)}</title><?dtp level="#{level}" section="#{escape_html(compile_inline(caption))}"?>)
|
794
761
|
end
|
795
762
|
|
796
763
|
def nonum_end(level)
|
797
764
|
end
|
798
765
|
|
799
|
-
def circle_begin(
|
800
|
-
puts %Q
|
766
|
+
def circle_begin(_level, _label, caption)
|
767
|
+
puts %Q(<title aid:pstyle="smallcircle">•#{compile_inline(caption)}</title>)
|
801
768
|
end
|
802
769
|
|
803
770
|
def circle_end(level)
|
@@ -805,233 +772,234 @@ module ReVIEW
|
|
805
772
|
|
806
773
|
def common_column_begin(type, caption)
|
807
774
|
@column += 1
|
808
|
-
a_id = %Q
|
775
|
+
a_id = %Q(id="column-#{@column}")
|
809
776
|
print "<#{type}column #{a_id}>"
|
810
|
-
puts %Q
|
777
|
+
puts %Q(<title aid:pstyle="#{type}column-title">#{compile_inline(caption)}</title><?dtp level="9" section="#{escape_html(compile_inline(caption))}"?>)
|
811
778
|
end
|
812
779
|
|
813
780
|
def common_column_end(type)
|
814
781
|
puts "</#{type}column>"
|
815
782
|
end
|
816
783
|
|
817
|
-
def column_begin(
|
818
|
-
common_column_begin(
|
784
|
+
def column_begin(_level, _label, caption)
|
785
|
+
common_column_begin('', caption)
|
819
786
|
end
|
820
787
|
|
821
|
-
def column_end(
|
822
|
-
common_column_end(
|
788
|
+
def column_end(_level)
|
789
|
+
common_column_end('')
|
823
790
|
end
|
824
791
|
|
825
|
-
def xcolumn_begin(
|
826
|
-
common_column_begin(
|
792
|
+
def xcolumn_begin(_level, _label, caption)
|
793
|
+
common_column_begin('x', caption)
|
827
794
|
end
|
828
795
|
|
829
|
-
def xcolumn_end(
|
830
|
-
common_column_end(
|
796
|
+
def xcolumn_end(_level)
|
797
|
+
common_column_end('x')
|
831
798
|
end
|
832
799
|
|
833
|
-
def world_begin(
|
834
|
-
common_column_begin(
|
800
|
+
def world_begin(_level, _label, caption)
|
801
|
+
common_column_begin('world', caption)
|
835
802
|
end
|
836
803
|
|
837
|
-
def world_end(
|
838
|
-
common_column_end(
|
804
|
+
def world_end(_level)
|
805
|
+
common_column_end('world')
|
839
806
|
end
|
840
807
|
|
841
|
-
def hood_begin(
|
842
|
-
common_column_begin(
|
808
|
+
def hood_begin(_level, _label, caption)
|
809
|
+
common_column_begin('hood', caption)
|
843
810
|
end
|
844
811
|
|
845
|
-
def hood_end(
|
846
|
-
common_column_end(
|
812
|
+
def hood_end(_level)
|
813
|
+
common_column_end('hood')
|
847
814
|
end
|
848
815
|
|
849
|
-
def edition_begin(
|
850
|
-
common_column_begin(
|
816
|
+
def edition_begin(_level, _label, caption)
|
817
|
+
common_column_begin('edition', caption)
|
851
818
|
end
|
852
819
|
|
853
|
-
def edition_end(
|
854
|
-
common_column_end(
|
820
|
+
def edition_end(_level)
|
821
|
+
common_column_end('edition')
|
855
822
|
end
|
856
823
|
|
857
|
-
def insideout_begin(
|
858
|
-
common_column_begin(
|
824
|
+
def insideout_begin(_level, _label, caption)
|
825
|
+
common_column_begin('insideout', caption)
|
859
826
|
end
|
860
827
|
|
861
|
-
def insideout_end(
|
862
|
-
common_column_end(
|
828
|
+
def insideout_end(_level)
|
829
|
+
common_column_end('insideout')
|
863
830
|
end
|
864
831
|
|
865
|
-
def ref_begin(
|
866
|
-
if
|
832
|
+
def ref_begin(_level, label, _caption)
|
833
|
+
if label
|
867
834
|
puts "<reference id='#{label}'>"
|
868
835
|
else
|
869
|
-
puts
|
836
|
+
puts '<reference>'
|
870
837
|
end
|
871
838
|
end
|
872
839
|
|
873
|
-
def ref_end(
|
874
|
-
puts
|
840
|
+
def ref_end(_level)
|
841
|
+
puts '</reference>'
|
875
842
|
end
|
876
843
|
|
877
|
-
def sup_begin(
|
878
|
-
if
|
844
|
+
def sup_begin(_level, label, _caption)
|
845
|
+
if label
|
879
846
|
puts "<supplement id='#{label}'>"
|
880
847
|
else
|
881
|
-
puts
|
848
|
+
puts '<supplement>'
|
882
849
|
end
|
883
850
|
end
|
884
851
|
|
885
|
-
def sup_end(
|
886
|
-
puts
|
852
|
+
def sup_end(_level)
|
853
|
+
puts '</supplement>'
|
887
854
|
end
|
888
855
|
|
889
856
|
def flushright(lines)
|
890
|
-
puts split_paragraph(lines).join.gsub(
|
857
|
+
puts split_paragraph(lines).join.gsub('<p>', %Q(<p align='right'>))
|
891
858
|
end
|
892
859
|
|
893
860
|
def centering(lines)
|
894
|
-
puts split_paragraph(lines).join.gsub(
|
861
|
+
puts split_paragraph(lines).join.gsub('<p>', %Q(<p align='center'>))
|
895
862
|
end
|
896
863
|
|
897
864
|
def captionblock(type, lines, caption, specialstyle = nil)
|
898
865
|
print "<#{type}>"
|
899
866
|
style = specialstyle.nil? ? "#{type}-title" : specialstyle
|
900
|
-
puts "<title aid:pstyle='#{style}'>#{compile_inline(caption)}</title>"
|
867
|
+
puts "<title aid:pstyle='#{style}'>#{compile_inline(caption)}</title>" if caption.present?
|
901
868
|
blocked_lines = split_paragraph(lines)
|
902
869
|
puts "#{blocked_lines.join}</#{type}>"
|
903
870
|
end
|
904
871
|
|
905
872
|
def note(lines, caption = nil)
|
906
|
-
captionblock(
|
873
|
+
captionblock('note', lines, caption)
|
907
874
|
end
|
908
875
|
|
909
876
|
def memo(lines, caption = nil)
|
910
|
-
captionblock(
|
877
|
+
captionblock('memo', lines, caption)
|
911
878
|
end
|
912
879
|
|
913
880
|
def tip(lines, caption = nil)
|
914
|
-
captionblock(
|
881
|
+
captionblock('tip', lines, caption)
|
915
882
|
end
|
916
883
|
|
917
884
|
def info(lines, caption = nil)
|
918
|
-
captionblock(
|
885
|
+
captionblock('info', lines, caption)
|
919
886
|
end
|
920
887
|
|
921
888
|
def planning(lines, caption = nil)
|
922
|
-
captionblock(
|
889
|
+
captionblock('planning', lines, caption)
|
923
890
|
end
|
924
891
|
|
925
892
|
def best(lines, caption = nil)
|
926
|
-
captionblock(
|
893
|
+
captionblock('best', lines, caption)
|
927
894
|
end
|
928
895
|
|
929
896
|
def important(lines, caption = nil)
|
930
|
-
captionblock(
|
897
|
+
captionblock('important', lines, caption)
|
931
898
|
end
|
932
899
|
|
933
900
|
def security(lines, caption = nil)
|
934
|
-
captionblock(
|
901
|
+
captionblock('security', lines, caption)
|
935
902
|
end
|
936
903
|
|
937
904
|
def caution(lines, caption = nil)
|
938
|
-
captionblock(
|
905
|
+
captionblock('caution', lines, caption)
|
939
906
|
end
|
940
907
|
|
941
908
|
def warning(lines, caption = nil)
|
942
|
-
captionblock(
|
909
|
+
captionblock('warning', lines, caption)
|
943
910
|
end
|
944
911
|
|
945
912
|
def term(lines)
|
946
|
-
captionblock(
|
913
|
+
captionblock('term', lines, nil)
|
947
914
|
end
|
948
915
|
|
949
916
|
def link(lines, caption = nil)
|
950
|
-
captionblock(
|
917
|
+
captionblock('link', lines, caption)
|
951
918
|
end
|
952
919
|
|
953
920
|
def notice(lines, caption = nil)
|
954
|
-
if caption
|
955
|
-
captionblock(
|
921
|
+
if caption
|
922
|
+
captionblock('notice-t', lines, caption, 'notice-title')
|
956
923
|
else
|
957
|
-
captionblock(
|
924
|
+
captionblock('notice', lines, nil)
|
958
925
|
end
|
959
926
|
end
|
960
927
|
|
961
928
|
def point(lines, caption = nil)
|
962
|
-
if caption
|
963
|
-
captionblock(
|
929
|
+
if caption
|
930
|
+
captionblock('point-t', lines, caption, 'point-title')
|
964
931
|
else
|
965
|
-
captionblock(
|
932
|
+
captionblock('point', lines, nil)
|
966
933
|
end
|
967
934
|
end
|
968
935
|
|
969
936
|
def shoot(lines, caption = nil)
|
970
|
-
if caption
|
971
|
-
captionblock(
|
937
|
+
if caption
|
938
|
+
captionblock('shoot-t', lines, caption, 'shoot-title')
|
972
939
|
else
|
973
|
-
captionblock(
|
940
|
+
captionblock('shoot', lines, nil)
|
974
941
|
end
|
975
942
|
end
|
976
943
|
|
977
944
|
def reference(lines)
|
978
|
-
captionblock(
|
945
|
+
captionblock('reference', lines, nil)
|
979
946
|
end
|
980
947
|
|
981
948
|
def practice(lines)
|
982
|
-
captionblock(
|
949
|
+
captionblock('practice', lines, nil)
|
983
950
|
end
|
984
951
|
|
985
952
|
def expert(lines)
|
986
|
-
captionblock(
|
953
|
+
captionblock('expert', lines, nil)
|
987
954
|
end
|
988
955
|
|
989
956
|
def syntaxblock(type, lines, caption)
|
990
|
-
if caption.
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
titleopentag = %Q[floattitle type="insn"]
|
997
|
-
titleclosetag = "floattitle"
|
957
|
+
if caption.present?
|
958
|
+
titleopentag = %Q(caption aid:pstyle="#{type}-title")
|
959
|
+
titleclosetag = 'caption'
|
960
|
+
if type == 'insn'
|
961
|
+
titleopentag = %Q(floattitle type="insn")
|
962
|
+
titleclosetag = 'floattitle'
|
998
963
|
end
|
999
|
-
puts %Q
|
964
|
+
puts %Q(<#{type}><#{titleopentag}>#{compile_inline(caption)}</#{titleclosetag}>)
|
965
|
+
else
|
966
|
+
puts "<#{type}>"
|
1000
967
|
end
|
968
|
+
|
1001
969
|
no = 1
|
1002
970
|
lines.each do |line|
|
1003
|
-
|
1004
|
-
print %Q
|
1005
|
-
print %Q
|
1006
|
-
print %Q
|
1007
|
-
print
|
971
|
+
if @book.config['listinfo']
|
972
|
+
print %Q(<listinfo line="#{no}")
|
973
|
+
print %Q( begin="1") if no == 1
|
974
|
+
print %Q( end="#{no}") if no == lines.size
|
975
|
+
print '>'
|
1008
976
|
end
|
1009
977
|
print detab(line)
|
1010
978
|
print "\n"
|
1011
|
-
print
|
979
|
+
print '</listinfo>' if @book.config['listinfo']
|
1012
980
|
no += 1
|
1013
981
|
end
|
1014
982
|
puts "</#{type}>"
|
1015
983
|
end
|
1016
984
|
|
1017
985
|
def insn(lines, caption = nil)
|
1018
|
-
syntaxblock(
|
986
|
+
syntaxblock('insn', lines, caption)
|
1019
987
|
end
|
1020
988
|
|
1021
989
|
def box(lines, caption = nil)
|
1022
|
-
syntaxblock(
|
990
|
+
syntaxblock('box', lines, caption)
|
1023
991
|
end
|
1024
992
|
|
1025
|
-
def indepimage(id, caption=nil, metric=nil)
|
1026
|
-
metrics = parse_metric(
|
1027
|
-
puts
|
993
|
+
def indepimage(_lines, id, caption = nil, metric = nil)
|
994
|
+
metrics = parse_metric('idgxml', metric)
|
995
|
+
puts '<img>'
|
1028
996
|
begin
|
1029
|
-
puts %Q
|
997
|
+
puts %Q(<Image href="file://#{@chapter.image(id).path.sub(%r{\A\./}, '')}"#{metrics} />)
|
1030
998
|
rescue
|
1031
|
-
warn %Q
|
999
|
+
warn %Q(image not bound: #{id})
|
1032
1000
|
end
|
1033
|
-
puts %Q
|
1034
|
-
puts
|
1001
|
+
puts %Q(<caption>#{compile_inline(caption)}</caption>) if caption.present?
|
1002
|
+
puts '</img>'
|
1035
1003
|
end
|
1036
1004
|
|
1037
1005
|
alias_method :numberlessimage, :indepimage
|
@@ -1046,11 +1014,11 @@ module ReVIEW
|
|
1046
1014
|
end
|
1047
1015
|
|
1048
1016
|
def hr
|
1049
|
-
print
|
1017
|
+
print '<hr />'
|
1050
1018
|
end
|
1051
1019
|
|
1052
1020
|
def bpo(lines)
|
1053
|
-
puts %Q
|
1021
|
+
puts %Q(<bpo>#{lines.join("\n")}</bpo>)
|
1054
1022
|
end
|
1055
1023
|
|
1056
1024
|
def inline_dtp(str)
|
@@ -1058,17 +1026,17 @@ module ReVIEW
|
|
1058
1026
|
end
|
1059
1027
|
|
1060
1028
|
def inline_code(str)
|
1061
|
-
%Q
|
1029
|
+
%Q(<tt type='inline-code'>#{escape_html(str)}</tt>)
|
1062
1030
|
end
|
1063
1031
|
|
1064
|
-
def inline_br(
|
1032
|
+
def inline_br(_str)
|
1065
1033
|
"\n"
|
1066
1034
|
end
|
1067
1035
|
|
1068
1036
|
def rawblock(lines)
|
1069
1037
|
no = 1
|
1070
1038
|
lines.each do |l|
|
1071
|
-
print l.gsub(
|
1039
|
+
print l.gsub('<', '<').gsub('>', '>').gsub('"', '"').gsub('&', '&')
|
1072
1040
|
print "\n" unless lines.length == no
|
1073
1041
|
no += 1
|
1074
1042
|
end
|
@@ -1079,17 +1047,17 @@ module ReVIEW
|
|
1079
1047
|
end
|
1080
1048
|
|
1081
1049
|
def inline_chapref(id)
|
1082
|
-
chs = [
|
1083
|
-
if @book.config[
|
1084
|
-
|
1085
|
-
if
|
1086
|
-
error
|
1050
|
+
chs = ['', '「', '」']
|
1051
|
+
if @book.config['chapref']
|
1052
|
+
chs2 = @book.config['chapref'].split(',')
|
1053
|
+
if chs2.size != 3
|
1054
|
+
error '--chapsplitter must have exactly 3 parameters with comma.'
|
1087
1055
|
else
|
1088
|
-
chs =
|
1056
|
+
chs = chs2
|
1089
1057
|
end
|
1090
1058
|
end
|
1091
1059
|
s = "#{chs[0]}#{@book.chapter_index.number(id)}#{chs[1]}#{@book.chapter_index.title(id)}#{chs[2]}"
|
1092
|
-
if @book.config[
|
1060
|
+
if @book.config['chapterlink']
|
1093
1061
|
%Q(<link href="#{id}">#{s}</link>)
|
1094
1062
|
else
|
1095
1063
|
s
|
@@ -1100,7 +1068,7 @@ module ReVIEW
|
|
1100
1068
|
end
|
1101
1069
|
|
1102
1070
|
def inline_chap(id)
|
1103
|
-
if @book.config[
|
1071
|
+
if @book.config['chapterlink']
|
1104
1072
|
%Q(<link href="#{id}">#{@book.chapter_index.number(id)}</link>)
|
1105
1073
|
else
|
1106
1074
|
@book.chapter_index.number(id)
|
@@ -1112,7 +1080,7 @@ module ReVIEW
|
|
1112
1080
|
|
1113
1081
|
def inline_title(id)
|
1114
1082
|
title = super
|
1115
|
-
if @book.config[
|
1083
|
+
if @book.config['chapterlink']
|
1116
1084
|
%Q(<link href="#{id}">#{title}</link>)
|
1117
1085
|
else
|
1118
1086
|
title
|
@@ -1123,31 +1091,29 @@ module ReVIEW
|
|
1123
1091
|
end
|
1124
1092
|
|
1125
1093
|
def source_header(caption)
|
1126
|
-
puts
|
1127
|
-
puts %Q
|
1094
|
+
puts '<source>'
|
1095
|
+
puts %Q(<caption>#{compile_inline(caption)}</caption>) if caption.present?
|
1128
1096
|
end
|
1129
1097
|
|
1130
|
-
def source_body(lines,
|
1131
|
-
puts
|
1098
|
+
def source_body(lines, _lang)
|
1099
|
+
puts '<pre>'
|
1132
1100
|
codelines_body(lines)
|
1133
|
-
puts
|
1101
|
+
puts '</pre></source>'
|
1134
1102
|
end
|
1135
1103
|
|
1136
1104
|
def bibpaper(lines, id, caption)
|
1137
1105
|
bibpaper_header id, caption
|
1138
|
-
unless lines.empty?
|
1139
|
-
|
1140
|
-
end
|
1141
|
-
puts %Q(</bibitem>)
|
1106
|
+
bibpaper_bibpaper id, caption, lines unless lines.empty?
|
1107
|
+
puts '</bibitem>'
|
1142
1108
|
end
|
1143
1109
|
|
1144
1110
|
def bibpaper_header(id, caption)
|
1145
1111
|
puts %Q(<bibitem id="bib-#{id}">)
|
1146
|
-
puts "<caption><span type='bibno'>[#{@chapter.bibpaper(id).number}] </span>#{compile_inline(caption)}</caption>"
|
1112
|
+
puts "<caption><span type='bibno'>[#{@chapter.bibpaper(id).number}] </span>#{compile_inline(caption)}</caption>" if caption.present?
|
1147
1113
|
end
|
1148
1114
|
|
1149
|
-
def bibpaper_bibpaper(
|
1150
|
-
print split_paragraph(lines).join
|
1115
|
+
def bibpaper_bibpaper(_id, _caption, lines)
|
1116
|
+
print split_paragraph(lines).join
|
1151
1117
|
end
|
1152
1118
|
|
1153
1119
|
def inline_bib(id)
|
@@ -1157,11 +1123,11 @@ module ReVIEW
|
|
1157
1123
|
def inline_hd_chap(chap, id)
|
1158
1124
|
if chap.number
|
1159
1125
|
n = chap.headline_index.number(id)
|
1160
|
-
if @book.config[
|
1161
|
-
return I18n.t(
|
1126
|
+
if @book.config['secnolevel'] >= n.split('.').size
|
1127
|
+
return I18n.t('chapter_quote', "#{n} #{compile_inline(chap.headline(id).caption)}")
|
1162
1128
|
end
|
1163
1129
|
end
|
1164
|
-
I18n.t(
|
1130
|
+
I18n.t('chapter_quote', compile_inline(chap.headline(id).caption))
|
1165
1131
|
end
|
1166
1132
|
|
1167
1133
|
def inline_recipe(id)
|
@@ -1174,9 +1140,7 @@ module ReVIEW
|
|
1174
1140
|
end
|
1175
1141
|
|
1176
1142
|
def image_ext
|
1177
|
-
|
1143
|
+
'eps'
|
1178
1144
|
end
|
1179
|
-
|
1180
1145
|
end
|
1181
|
-
|
1182
1146
|
end # module ReVIEW
|