review-peg 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +36 -0
- data/.rubocop.yml +47 -0
- data/.rubocop_todo.yml +605 -0
- data/.travis.yml +18 -0
- data/COPYING +515 -0
- data/ChangeLog +2449 -0
- data/Dockerfile +22 -0
- data/Gemfile +6 -0
- data/README.rdoc +81 -0
- data/Rakefile +51 -0
- data/bin/review-catalog-converter-peg +129 -0
- data/bin/review-check-peg +169 -0
- data/bin/review-checkdep-peg +63 -0
- data/bin/review-compile-peg +202 -0
- data/bin/review-epubmaker-legacy-peg +1024 -0
- data/bin/review-epubmaker-peg +44 -0
- data/bin/review-index-peg +110 -0
- data/bin/review-init-peg +151 -0
- data/bin/review-pdfmaker-peg +18 -0
- data/bin/review-preproc-peg +131 -0
- data/bin/review-validate-peg +51 -0
- data/bin/review-vol-peg +100 -0
- data/debian/README.Debian +12 -0
- data/debian/README.source +5 -0
- data/debian/changelog +5 -0
- data/debian/compat +1 -0
- data/debian/control +22 -0
- data/debian/copyright +62 -0
- data/debian/docs +6 -0
- data/debian/manpage.1.ex +59 -0
- data/debian/patches/path.diff +91 -0
- data/debian/patches/series +1 -0
- data/debian/review.install +13 -0
- data/debian/review.links +4 -0
- data/debian/rules +13 -0
- data/debian/source/format +1 -0
- data/doc/NEWS.ja.md +350 -0
- data/doc/NEWS.md +354 -0
- data/doc/catalog.ja.md +53 -0
- data/doc/catalog.md +52 -0
- data/doc/format.ja.md +734 -0
- data/doc/format.md +746 -0
- data/doc/format_idg.ja.md +203 -0
- data/doc/quickstart.ja.md +222 -0
- data/doc/quickstart.md +252 -0
- data/doc/ruby-uuid/README +11 -0
- data/doc/ruby-uuid/README.ja +34 -0
- data/doc/sample.css +108 -0
- data/doc/sample.yml +238 -0
- data/lib/epubmaker.rb +24 -0
- data/lib/epubmaker/content.rb +93 -0
- data/lib/epubmaker/epubcommon.rb +424 -0
- data/lib/epubmaker/epubv2.rb +139 -0
- data/lib/epubmaker/epubv3.rb +222 -0
- data/lib/epubmaker/producer.rb +330 -0
- data/lib/lineinput.rb +107 -0
- data/lib/review.rb +3 -0
- data/lib/review/book.rb +43 -0
- data/lib/review/book/base.rb +401 -0
- data/lib/review/book/chapter.rb +100 -0
- data/lib/review/book/compilable.rb +184 -0
- data/lib/review/book/image_finder.rb +71 -0
- data/lib/review/book/index.rb +413 -0
- data/lib/review/book/page_metric.rb +47 -0
- data/lib/review/book/part.rb +54 -0
- data/lib/review/book/volume.rb +67 -0
- data/lib/review/builder.rb +452 -0
- data/lib/review/catalog.rb +52 -0
- data/lib/review/compiler.rb +5183 -0
- data/lib/review/compiler/literals_1_9.kpeg +22 -0
- data/lib/review/compiler/literals_1_9.rb +435 -0
- data/lib/review/configure.rb +64 -0
- data/lib/review/epubbuilder.rb +18 -0
- data/lib/review/epubmaker.rb +480 -0
- data/lib/review/ewbbuilder.rb +381 -0
- data/lib/review/exception.rb +21 -0
- data/lib/review/extentions.rb +4 -0
- data/lib/review/extentions/array.rb +25 -0
- data/lib/review/extentions/object.rb +9 -0
- data/lib/review/extentions/string.rb +33 -0
- data/lib/review/htmlbuilder.rb +1166 -0
- data/lib/review/htmllayout.rb +41 -0
- data/lib/review/htmltoc.rb +45 -0
- data/lib/review/htmlutils.rb +90 -0
- data/lib/review/i18n.rb +96 -0
- data/lib/review/i18n.yml +169 -0
- data/lib/review/idgxmlbuilder.rb +1233 -0
- data/lib/review/inaobuilder.rb +357 -0
- data/lib/review/latexbuilder.rb +941 -0
- data/lib/review/latexindex.rb +35 -0
- data/lib/review/latexutils.rb +95 -0
- data/lib/review/layout.tex.erb +340 -0
- data/lib/review/lineinput.rb +17 -0
- data/lib/review/location.rb +24 -0
- data/lib/review/makerhelper.rb +67 -0
- data/lib/review/markdownbuilder.rb +339 -0
- data/lib/review/node.rb +288 -0
- data/lib/review/pdfmaker.rb +332 -0
- data/lib/review/preprocessor.rb +530 -0
- data/lib/review/review.kpeg +745 -0
- data/lib/review/sec_counter.rb +69 -0
- data/lib/review/template.rb +21 -0
- data/lib/review/textbuilder.rb +17 -0
- data/lib/review/textutils.rb +16 -0
- data/lib/review/tocparser.rb +348 -0
- data/lib/review/tocprinter.rb +205 -0
- data/lib/review/topbuilder.rb +796 -0
- data/lib/review/unfold.rb +138 -0
- data/lib/review/version.rb +3 -0
- data/lib/uuid.rb +312 -0
- data/review.gemspec +32 -0
- data/templates/html/layout-html5.html.erb +17 -0
- data/templates/html/layout-xhtml1.html.erb +20 -0
- data/templates/ncx/epubv2.ncx.erb +11 -0
- data/templates/opf/epubv2.opf.erb +21 -0
- data/templates/opf/epubv3.opf.erb +18 -0
- data/templates/xml/container.xml.erb +6 -0
- data/test/CHAPS +2 -0
- data/test/assets/test.xml.erb +3 -0
- data/test/assets/test_template.tex +255 -0
- data/test/assets/test_template_backmatter.tex +32 -0
- data/test/bib.re +13 -0
- data/test/book_test_helper.rb +35 -0
- data/test/sample-book/README.md +7 -0
- data/test/sample-book/src/Rakefile +58 -0
- data/test/sample-book/src/_cover.html +3 -0
- data/test/sample-book/src/catalog.yml +10 -0
- data/test/sample-book/src/ch01.re +71 -0
- data/test/sample-book/src/ch02.re +3 -0
- data/test/sample-book/src/config.yml +186 -0
- data/test/sample-book/src/images/ch01-imgsample.jpg +0 -0
- data/test/sample-book/src/images/cover.jpg +0 -0
- data/test/sample-book/src/preface.re +15 -0
- data/test/sample-book/src/sty/jumoline.sty +310 -0
- data/test/sample-book/src/sty/reviewmacro.sty +39 -0
- data/test/sample-book/src/style.css +251 -0
- data/test/sample-book/src/vendor/jumoline/README +29 -0
- data/test/sample-book/src/vendor/jumoline/jumoline.dtx +2988 -0
- data/test/sample-book/src/vendor/jumoline/jumoline.ins +6 -0
- data/test/test.re +43 -0
- data/test/test_book.rb +556 -0
- data/test/test_book_chapter.rb +280 -0
- data/test/test_book_part.rb +54 -0
- data/test/test_builder.rb +80 -0
- data/test/test_catalog.rb +119 -0
- data/test/test_catalog_converter_cmd.rb +73 -0
- data/test/test_compiler.rb +92 -0
- data/test/test_configure.rb +50 -0
- data/test/test_epub3maker.rb +529 -0
- data/test/test_epubmaker.rb +569 -0
- data/test/test_epubmaker_cmd.rb +40 -0
- data/test/test_helper.rb +92 -0
- data/test/test_htmlbuilder.rb +1114 -0
- data/test/test_htmltoc.rb +32 -0
- data/test/test_htmlutils.rb +50 -0
- data/test/test_i18n.rb +180 -0
- data/test/test_idgxmlbuilder.rb +608 -0
- data/test/test_image_finder.rb +82 -0
- data/test/test_inaobuilder.rb +245 -0
- data/test/test_index.rb +174 -0
- data/test/test_latexbuilder.rb +732 -0
- data/test/test_lineinput.rb +182 -0
- data/test/test_makerhelper.rb +66 -0
- data/test/test_markdownbuilder.rb +125 -0
- data/test/test_pdfmaker.rb +171 -0
- data/test/test_pdfmaker_cmd.rb +40 -0
- data/test/test_preprocessor.rb +23 -0
- data/test/test_review_ext.rb +31 -0
- data/test/test_template.rb +26 -0
- data/test/test_textutils.rb +32 -0
- data/test/test_topbuilder.rb +291 -0
- data/test/test_uuid.rb +157 -0
- metadata +357 -0
data/Dockerfile
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# This file is a sample Dockerfile to build Re:VIEW documents.
|
|
2
|
+
#
|
|
3
|
+
# Build:
|
|
4
|
+
# $ docker build -t review .
|
|
5
|
+
#
|
|
6
|
+
# Usage:
|
|
7
|
+
# $ cd path/to/review/project
|
|
8
|
+
# $ docker run -it --rm -v `pwd`:/work review rake pdf
|
|
9
|
+
#
|
|
10
|
+
# cf. https://github.com/vvakame/docker-review/blob/master/Dockerfile
|
|
11
|
+
|
|
12
|
+
FROM debian:sid
|
|
13
|
+
MAINTAINER takahashim
|
|
14
|
+
|
|
15
|
+
RUN apt-get update \
|
|
16
|
+
&& apt-get install -y --no-install-recommends git-core ruby locales zip \
|
|
17
|
+
&& apt-get install -y --no-install-recommends texlive-lang-cjk texlive-lang-japanese texlive-fonts-recommended texlive-latex-extra ghostscript \
|
|
18
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
19
|
+
RUN gem install review rake bundler --no-rdoc --no-ri
|
|
20
|
+
|
|
21
|
+
VOLUME ["/work"]
|
|
22
|
+
WORKDIR /work
|
data/Gemfile
ADDED
data/README.rdoc
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
= Re:VIEW
|
|
2
|
+
|
|
3
|
+
{<img src="https://secure.travis-ci.org/kmuto/review.png"/>}[http://travis-ci.org/kmuto/review]
|
|
4
|
+
{<img src="https://badge.fury.io/rb/review.png" alt="Gem Version" />}[http://badge.fury.io/rb/review]
|
|
5
|
+
|
|
6
|
+
home :: https://github.com/kmuto/review
|
|
7
|
+
gems :: https://rubygems.org/gems/review
|
|
8
|
+
wiki :: https://github.com/kmuto/review/wiki
|
|
9
|
+
bugs :: https://github.com/kmuto/review/issues
|
|
10
|
+
|
|
11
|
+
Re:VIEW is an easy-to-use digital publishing system for books and ebooks.
|
|
12
|
+
|
|
13
|
+
== Format
|
|
14
|
+
|
|
15
|
+
Re:VIEW uses its original format('Re:VIEW format') as source files. See doc/format.rdoc (in Japanese).
|
|
16
|
+
|
|
17
|
+
Output formats Re:VIEW supports are:
|
|
18
|
+
|
|
19
|
+
* EPUB
|
|
20
|
+
* LaTeX(ptexlive)
|
|
21
|
+
* InDesign(IDGXML)
|
|
22
|
+
* plain text(TOPBuilder Text Markup Language)
|
|
23
|
+
* Inao(gihyo.jp original markup)
|
|
24
|
+
|
|
25
|
+
== Commands
|
|
26
|
+
|
|
27
|
+
There are two commands generate files directly.
|
|
28
|
+
|
|
29
|
+
* review-epubmaker: generate EPUB file.
|
|
30
|
+
* review-pdfmaker: generate PDF file using LaTeX(ptexlive).
|
|
31
|
+
|
|
32
|
+
And some useful commands.
|
|
33
|
+
|
|
34
|
+
* review-compile: compile Re:VIEW fomat files.
|
|
35
|
+
* review-vol: figure out size of Re:VIEW files.
|
|
36
|
+
* review-index: generate index with various format.
|
|
37
|
+
* review-preproc: preprocessor.
|
|
38
|
+
|
|
39
|
+
== Installation
|
|
40
|
+
|
|
41
|
+
Install gem yourself as:
|
|
42
|
+
|
|
43
|
+
$ gem install review
|
|
44
|
+
|
|
45
|
+
Or build from source:
|
|
46
|
+
|
|
47
|
+
$ git clone https://github.com/kmuto/review.git
|
|
48
|
+
$ cd review
|
|
49
|
+
$ rake install
|
|
50
|
+
|
|
51
|
+
Or add the `./bin` directory to your $PATH:
|
|
52
|
+
|
|
53
|
+
$ echo "export PATH=PATH_OF_REVIEW/bin:$PATH" >> ~/.profile
|
|
54
|
+
|
|
55
|
+
== Resources
|
|
56
|
+
=== Documents
|
|
57
|
+
|
|
58
|
+
* Wiki pages: https://github.com/kmuto/review/wiki
|
|
59
|
+
* doc/* files (in Japanese)
|
|
60
|
+
|
|
61
|
+
=== Issues tracker
|
|
62
|
+
|
|
63
|
+
* GitHub: https://github.com/kmuto/review
|
|
64
|
+
|
|
65
|
+
== Note on Patches/Pull Requests
|
|
66
|
+
|
|
67
|
+
* Fork the project.
|
|
68
|
+
* Make your feature addition or bug fix.
|
|
69
|
+
* Add tests for it. This is important so I don't break it in a
|
|
70
|
+
future version unintentionally.
|
|
71
|
+
* Commit, do not mess with rakefile, version, or history.
|
|
72
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
|
73
|
+
* Send me a pull request. Bonus points for topic branches.
|
|
74
|
+
|
|
75
|
+
== License
|
|
76
|
+
|
|
77
|
+
LGPL. See COPYING file.
|
|
78
|
+
|
|
79
|
+
== Copyright
|
|
80
|
+
|
|
81
|
+
Copyright (c) 2006-2015 Minero Aoki, Kenshi Muto, Masayoshi Takahashi, Masanori Kado.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'fileutils'
|
|
2
|
+
|
|
3
|
+
begin
|
|
4
|
+
require 'bundler'
|
|
5
|
+
Bundler::GemHelper.install_tasks
|
|
6
|
+
rescue LoadError
|
|
7
|
+
# ignore if bundler does not exist
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
require 'rubygems'
|
|
11
|
+
require 'rake/testtask'
|
|
12
|
+
require 'rake/clean'
|
|
13
|
+
|
|
14
|
+
task :default => [:test]
|
|
15
|
+
|
|
16
|
+
task :kpeg do
|
|
17
|
+
FileUtils.rm_f "lib/review/compiler.rb"
|
|
18
|
+
FileUtils.rm_f "lib/review/compiler/literals_1_9.rb"
|
|
19
|
+
sh "kpeg -s lib/review/compiler/literals_1_9.kpeg -o lib/review/compiler/literals_1_9.rb"
|
|
20
|
+
sh "kpeg -s lib/review/review.kpeg -o lib/review/compiler.rb"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Rake::TestTask.new("test") do |t|
|
|
24
|
+
t.libs << "test"
|
|
25
|
+
t.test_files = Dir.glob("test/**/test_*.rb")
|
|
26
|
+
t.verbose = true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
require 'rcov/rcovtask'
|
|
31
|
+
Rcov::RcovTask.new do |t|
|
|
32
|
+
t.rcov_opts << '-x /gems/'
|
|
33
|
+
t.rcov_opts << '-x /tmp/'
|
|
34
|
+
t.libs << 'test'
|
|
35
|
+
t.pattern = 'test/test_*.rb'
|
|
36
|
+
t.verbose = true
|
|
37
|
+
end
|
|
38
|
+
rescue LoadError
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
begin
|
|
42
|
+
require 'rdoc/task'
|
|
43
|
+
Rake::RDocTask.new do |rdoc|
|
|
44
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
|
45
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
46
|
+
rdoc.title = "review #{version}"
|
|
47
|
+
rdoc.rdoc_files.include('README*')
|
|
48
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
49
|
+
end
|
|
50
|
+
rescue LoadError
|
|
51
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2014 Masanori Kado
|
|
5
|
+
#
|
|
6
|
+
# This program is free software.
|
|
7
|
+
# You can distribute or modify this program under the terms of
|
|
8
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
9
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
|
10
|
+
#
|
|
11
|
+
# Convert old PREDEF/CHAPS/PART/POSTDEF files into catalog.yml.
|
|
12
|
+
|
|
13
|
+
require 'pathname'
|
|
14
|
+
require 'optparse'
|
|
15
|
+
bindir = Pathname.new(__FILE__).realpath.dirname
|
|
16
|
+
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
|
17
|
+
require 'review/version'
|
|
18
|
+
require 'review/extentions'
|
|
19
|
+
|
|
20
|
+
def main
|
|
21
|
+
opts = OptionParser.new
|
|
22
|
+
opts.version = ReVIEW::VERSION
|
|
23
|
+
opts.banner = "Usage: #{File.basename($0)} dirname"
|
|
24
|
+
opts.on('-h', '--help', 'print this message and quit.') do
|
|
25
|
+
puts opts.help
|
|
26
|
+
exit 0
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
begin
|
|
30
|
+
opts.parse!
|
|
31
|
+
rescue OptionParser::ParseError => err
|
|
32
|
+
$stderr.puts err.message
|
|
33
|
+
$stderr.puts opts.help
|
|
34
|
+
exit 1
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
dir = Dir.pwd
|
|
38
|
+
|
|
39
|
+
# confirmation
|
|
40
|
+
if File.exist?("#{dir}/catalog.yml")
|
|
41
|
+
while true
|
|
42
|
+
print "The catalog.yml already exists. Do you want to overwrite it? [y/n]"
|
|
43
|
+
case gets
|
|
44
|
+
when /^[yY]/
|
|
45
|
+
puts "Start writing..."
|
|
46
|
+
break
|
|
47
|
+
when /^[nN]/, /^$/
|
|
48
|
+
puts "bye."
|
|
49
|
+
exit
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
File.open("#{dir}/catalog.yml", "w") do |catalog|
|
|
55
|
+
# predef
|
|
56
|
+
if File.exist?("#{dir}/PREDEF")
|
|
57
|
+
catalog << parse_predef(File.open("#{dir}/PREDEF").read)
|
|
58
|
+
end
|
|
59
|
+
# chaps and parts
|
|
60
|
+
if File.exist?("#{dir}/CHAPS")
|
|
61
|
+
if File.exist?("#{dir}/PART")
|
|
62
|
+
catalog << parse_parts(File.open("#{dir}/PART").read,
|
|
63
|
+
File.open("#{dir}/CHAPS").read)
|
|
64
|
+
else
|
|
65
|
+
catalog << parse_chaps(File.open("#{dir}/CHAPS").read)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
# postdef
|
|
69
|
+
if File.exist?("#{dir}/POSTDEF")
|
|
70
|
+
postdef = File.open("#{dir}/POSTDEF").read
|
|
71
|
+
while true
|
|
72
|
+
print "Do you want to convert POSTDEF into APPENDIX? [y/n]"
|
|
73
|
+
case gets
|
|
74
|
+
when /^[yY]/
|
|
75
|
+
catalog << parse_postdef(postdef, true)
|
|
76
|
+
break
|
|
77
|
+
when /^[nN]/, /^$/
|
|
78
|
+
catalog << parse_postdef(postdef)
|
|
79
|
+
break
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
puts File.open("#{dir}/catalog.yml").read
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def _parse(str, header)
|
|
89
|
+
if str.present?
|
|
90
|
+
header + str.split("\n").map{|i| " - #{i}\n" }.join
|
|
91
|
+
else
|
|
92
|
+
header
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def parse_predef(str)
|
|
97
|
+
header = "PREDEF:\n"
|
|
98
|
+
_parse(str, header) + "\n"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def parse_chaps(str)
|
|
102
|
+
header = "CHAPS:\n"
|
|
103
|
+
_parse(str, header) + "\n"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def parse_postdef(str, to_appendix = false)
|
|
107
|
+
if to_appendix
|
|
108
|
+
header = "APPENDIX:\n"
|
|
109
|
+
else
|
|
110
|
+
header = "POSTDEF:\n"
|
|
111
|
+
end
|
|
112
|
+
_parse(str, header) + "\n"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def parse_parts(parts_str, chaps_str)
|
|
116
|
+
if parts_str.blank? or chaps_str.blank?
|
|
117
|
+
return "CHAPS:\n\n"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
parts = parts_str.split("\n")
|
|
121
|
+
chaps = chaps_str.split("\n\n")
|
|
122
|
+
"CHAPS:\n" + parts.zip(chaps).map{|k, vs|
|
|
123
|
+
" - #{k}:\n" + vs.split("\n").map{|i| " - #{i}\n"}.join
|
|
124
|
+
}.join + "\n"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
if File.basename($0) == File.basename(__FILE__)
|
|
128
|
+
main()
|
|
129
|
+
end
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
#
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 1999-2007 Minero Aoki
|
|
5
|
+
# Copyright (c) 2010-2014 Kenshi Muto, Minero Aoki
|
|
6
|
+
#
|
|
7
|
+
# This program is free software.
|
|
8
|
+
# You can distribute or modify this program under the terms of
|
|
9
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
|
10
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
require 'pathname'
|
|
14
|
+
|
|
15
|
+
bindir = Pathname.new(__FILE__).realpath.dirname
|
|
16
|
+
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
|
17
|
+
|
|
18
|
+
require 'review'
|
|
19
|
+
require 'optparse'
|
|
20
|
+
|
|
21
|
+
include ReVIEW::TextUtils
|
|
22
|
+
|
|
23
|
+
def sigmain
|
|
24
|
+
Signal.trap(:INT) { exit 1 }
|
|
25
|
+
if RUBY_PLATFORM !~ /mswin(?!ce)|mingw|cygwin|bccwin/
|
|
26
|
+
Signal.trap(:PIPE, 'IGNORE')
|
|
27
|
+
end
|
|
28
|
+
main
|
|
29
|
+
rescue Errno::EPIPE
|
|
30
|
+
exit 0
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def main
|
|
34
|
+
@config = ReVIEW::Configure.values
|
|
35
|
+
@book = ReVIEW::Book::Base.load
|
|
36
|
+
@book.config = @config
|
|
37
|
+
|
|
38
|
+
modes = nil
|
|
39
|
+
files = ARGV unless ARGV.empty?
|
|
40
|
+
opts = OptionParser.new
|
|
41
|
+
opts.version = ReVIEW::VERSION
|
|
42
|
+
opts.on('-a', '--all-chapters', 'Check all chapters.') {
|
|
43
|
+
files = @book.chapters.map {|ent| ent.path }
|
|
44
|
+
}
|
|
45
|
+
opts.on('-s', '--section N', 'Check section N. (deprecated)') {|n|
|
|
46
|
+
ents = @book.parts[Integer(n) - 1] or
|
|
47
|
+
raise ReVIEW::ApplicationError, "section #{n} not exist"
|
|
48
|
+
files = ents.map {|ent| ent.path }
|
|
49
|
+
}
|
|
50
|
+
opts.on('--text', 'Check text.') {
|
|
51
|
+
(modes ||= []).push :text
|
|
52
|
+
}
|
|
53
|
+
opts.on('--help', 'print this message and quit.') {
|
|
54
|
+
puts opts.help
|
|
55
|
+
exit 0
|
|
56
|
+
}
|
|
57
|
+
begin
|
|
58
|
+
opts.parse!
|
|
59
|
+
rescue OptionParser::ParseError => err
|
|
60
|
+
$stderr.puts err.message
|
|
61
|
+
$stderr.puts opts.help
|
|
62
|
+
exit 1
|
|
63
|
+
end
|
|
64
|
+
unless files
|
|
65
|
+
$stderr.puts "no input"
|
|
66
|
+
exit 1
|
|
67
|
+
end
|
|
68
|
+
modes ||= [:text]
|
|
69
|
+
|
|
70
|
+
modes.each do |mode|
|
|
71
|
+
case mode
|
|
72
|
+
when :text
|
|
73
|
+
check_text files
|
|
74
|
+
else
|
|
75
|
+
raise 'must not happen'
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def check_text(files)
|
|
81
|
+
re, neg = words_re("#{@book.basedir}/#{@book.reject_file}")
|
|
82
|
+
files.each do |path|
|
|
83
|
+
File.open(path) {|f|
|
|
84
|
+
each_paragraph(f) do |para, lineno|
|
|
85
|
+
s = para.join('')
|
|
86
|
+
if m = re.match(s)
|
|
87
|
+
next if m[0] == @review_utils_word_ok
|
|
88
|
+
next if neg and neg =~ s
|
|
89
|
+
str, offset = find_line(para, re)
|
|
90
|
+
out = sprintf("%s:%d: %s\n", path, lineno + offset, str)
|
|
91
|
+
print out
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
}
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def find_line(lines, re)
|
|
99
|
+
# single line?
|
|
100
|
+
lines.each_with_index do |line, idx|
|
|
101
|
+
return line.gsub(re, '<<<\&>>>'), idx if re =~ line
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# multiple lines?
|
|
105
|
+
i = 0
|
|
106
|
+
while i < lines.size - 1
|
|
107
|
+
str = lines[i] + lines[i+1]
|
|
108
|
+
return str.gsub(re, '<<<\&>>>'), i if re =~ str
|
|
109
|
+
i += 1
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
raise 'must not happen'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def words_re(rc)
|
|
116
|
+
words = []
|
|
117
|
+
nega = []
|
|
118
|
+
File.foreach(rc) do |line|
|
|
119
|
+
next if line[0,1] == '#'
|
|
120
|
+
if / !/ =~ line
|
|
121
|
+
line, n = *line.split(/!/, 2)
|
|
122
|
+
nega.push n.strip
|
|
123
|
+
end
|
|
124
|
+
words.push line.strip
|
|
125
|
+
end
|
|
126
|
+
return Regexp.compile(words.join('|')),
|
|
127
|
+
nega.empty?() ? nil : Regexp.compile(nega.join('|'))
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def each_paragraph(f)
|
|
131
|
+
@review_utils_word_ok = nil
|
|
132
|
+
while line = f.gets
|
|
133
|
+
case line
|
|
134
|
+
when /\A\#@ok\((.*)\)/
|
|
135
|
+
@review_utils_word_ok = $1
|
|
136
|
+
when /\A\#@/
|
|
137
|
+
;
|
|
138
|
+
when %r[\A//caption\{(.*?)//\}]
|
|
139
|
+
yield [$1], f.filename, f.lineno
|
|
140
|
+
when %r<\A//\w.*\{\s*\z>
|
|
141
|
+
while line = f.gets
|
|
142
|
+
break if %r<//\}> === line
|
|
143
|
+
end
|
|
144
|
+
when /\A=/
|
|
145
|
+
yield [line.slice(/\A=+(?:\[.*?\])?\s+(.*)/, 1).strip], f.lineno
|
|
146
|
+
when /\A\s*\z/
|
|
147
|
+
# skip
|
|
148
|
+
else
|
|
149
|
+
buf = [line.strip]
|
|
150
|
+
lineno = f.lineno
|
|
151
|
+
while line = f.gets
|
|
152
|
+
break if line.strip.empty?
|
|
153
|
+
break if %r<\A(?:=|//[\w\}])> =~ line
|
|
154
|
+
next if %r<\A\#@> =~ line
|
|
155
|
+
buf.push line.strip
|
|
156
|
+
end
|
|
157
|
+
yield buf, lineno
|
|
158
|
+
@review_utils_word_ok = nil
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def each_paragraph_line(f, &block)
|
|
164
|
+
each_paragraph(f) do |para, *|
|
|
165
|
+
para.each(&block)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
sigmain
|