Class: ReVIEW::IDGXMLMaker

Inherits:
Object show all
Includes:
Loggable, MakerHelper
Defined in:
lib/review/idgxmlmaker.rb

Instance Attribute Summary collapse

Attributes included from Loggable

#logger

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Loggable

#app_error, #debug, #error, #error!, #warn

Methods included from MakerHelper

copy_images_to_dir, h

Constructor Details

#initializeIDGXMLMaker

Returns a new instance of IDGXMLMaker.



29
30
31
32
33
34
35
# File 'lib/review/idgxmlmaker.rb', line 29

def initialize
  @basedir = nil
  @logger = ReVIEW.logger
  @img_math = nil
  @plaintext = nil
  @compile_errors = nil
end

Instance Attribute Details

#basedirObject

Returns the value of attribute basedir.



27
28
29
# File 'lib/review/idgxmlmaker.rb', line 27

def basedir
  @basedir
end

#configObject

Returns the value of attribute config.



27
28
29
# File 'lib/review/idgxmlmaker.rb', line 27

def config
  @config
end

Class Method Details

.execute(*args) ⇒ Object



37
38
39
# File 'lib/review/idgxmlmaker.rb', line 37

def self.execute(*args)
  self.new.execute(*args)
end

Instance Method Details

#apply_filter(xmlfile) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/review/idgxmlmaker.rb', line 123

def apply_filter(xmlfile)
  return unless @filter

  # pass filename information to filter by environment variable
  ENV['REVIEW_FNAME'] = File.basename(xmlfile).sub(/.xml\Z/, '.re')
  begin
    o, e, s = Open3.capture3(@filter, stdin_data: File.read(xmlfile))
    unless e.empty?
      warn("filter error for #{xmlfile}: #{e}")
    end
    if s.success?
      File.write(xmlfile, o) # override
    end
  rescue StandardError => e
    warn("filter error for #{xmlfile}: #{e.message}")
  end
end

#build_body(basetmpdir, _yamlfile) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/review/idgxmlmaker.rb', line 141

def build_body(basetmpdir, _yamlfile)
  base_path = Pathname.new(@basedir)
  @converter = ReVIEW::Converter.new(@book, ReVIEW::IDGXMLBuilder.new(img_math: @img_math))
  @book.parts.each do |part|
    if part.name.present?
      if part.file?
        build_chap(part, base_path, basetmpdir, true)
      else
        xmlfile = "part_#{part.number}.xml"
        build_part(part, basetmpdir, xmlfile)
      end
    end

    part.chapters.each { |chap| build_chap(chap, base_path, basetmpdir, false) }
  end
end

#build_chap(chap, base_path, basetmpdir, ispart) ⇒ Object



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/review/idgxmlmaker.rb', line 175

def build_chap(chap, base_path, basetmpdir, ispart)
  filename = if ispart.present?
               chap.path
             else
               Pathname.new(chap.path).relative_path_from(base_path).to_s
             end
  id = File.basename(filename).sub(/\.re\Z/, '')
  if @buildonly && !@buildonly.include?(id)
    warn "skip #{id}.re"
    return
  end

  xmlfile = "#{id}.xml"

  begin
    @converter.convert(filename, File.join(basetmpdir, xmlfile))
    apply_filter(File.join(basetmpdir, xmlfile))
  rescue StandardError => e
    @compile_errors = true
    error "compile error in #{filename} (#{e.class})"
    error e.message
  end
end

#build_part(part, basetmpdir, xmlfile) ⇒ Object



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/review/idgxmlmaker.rb', line 158

def build_part(part, basetmpdir, xmlfile)
  File.open(File.join(basetmpdir, xmlfile), 'w') do |f|
    title = ReVIEW::I18n.t('part', part.number)
    if part.name.strip.present?
      title << ReVIEW::I18n.t('chapter_postfix')
      title << part.name.strip
    end
    f.puts '<?xml version="1.0" encoding="UTF-8"?>'
    f.print '<doc xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/"><title aid:pstyle="h1">'
    f.print h(title)
    f.print '</title><?dtp level="1" section="'
    f.print h(title)
    f.puts '"?></doc>'
  end
  apply_filter(File.join(basetmpdir, xmlfile))
end

#build_pathObject



67
68
69
# File 'lib/review/idgxmlmaker.rb', line 67

def build_path
  "#{@config['bookname']}-idgxml"
end

#execute(*args) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/review/idgxmlmaker.rb', line 76

def execute(*args)
  cmd_config, yamlfile = parse_opts(args)
  error! "#{yamlfile} not found." unless File.exist?(yamlfile)

  begin
    @config = ReVIEW::Configure.create(maker: 'idgxmlmaker',
                                       yamlfile: yamlfile,
                                       config: cmd_config)
  rescue ReVIEW::ConfigError => e
    error! e.message
  end

  @img_math = ReVIEW::ImgMath.new(@config)

  I18n.setup(@config['language'])
  begin
    generate_idgxml_files(yamlfile)
    @logger.success("built #{build_path}")
  rescue ApplicationError => e
    raise if @config['debug']

    error! e.message
  end

  if @config['math_format'] == 'imgmath'
    @img_math.make_math_images
  end
end

#generate_idgxml_files(yamlfile) ⇒ Object



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/review/idgxmlmaker.rb', line 105

def generate_idgxml_files(yamlfile)
  @basedir = File.dirname(yamlfile)
  @path = build_path
  remove_old_files(@path)
  Dir.mkdir(@path)

  @book = ReVIEW::Book::Base.new(@basedir, config: @config)
  if @table
    @book.config['tableopt'] = @table
  end

  build_body(@path, yamlfile)

  if @compile_errors
    app_error 'compile error, No IDGXML file output.'
  end
end

#parse_opts(args) ⇒ Object



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
# File 'lib/review/idgxmlmaker.rb', line 41

def parse_opts(args)
  cmd_config = {}
  opts = OptionParser.new
  @table = nil
  @filter = nil
  @buildonly = nil

  opts.banner = 'Usage: review-idgxmlmaker [options] configfile'
  opts.version = ReVIEW::VERSION
  opts.on('-w', '--width widthoftypepage', 'Specify the width of type page for layouting tables (mm).') { |v| @table = v }
  opts.on('-f', '--filter filterprogrampath', 'Specify the filter path.') { |v| @filter = v }
  opts.on('-y', '--only file1,file2,...', 'Build only specified files.') { |v| @buildonly = v.split(/\s*,\s*/).map { |m| m.strip.sub(/\.re\Z/, '') } }
  opts.on('--help', 'Prints this message and quit.') do
    puts opts.help
    exit 0
  end

  opts.parse!(args)
  if args.size != 1
    puts opts.help
    exit 0
  end

  [cmd_config, args[0]]
end

#remove_old_files(path) ⇒ Object



71
72
73
74
# File 'lib/review/idgxmlmaker.rb', line 71

def remove_old_files(path)
  @img_math.cleanup_mathimg
  FileUtils.rm_rf(path)
end