verku 0.8.1.0 → 0.10.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 +4 -4
- data/Rakefile +1 -1
- data/lib/verku/cli.rb +1 -1
- data/lib/verku/{parser.rb → exporter/base.rb} +21 -36
- data/lib/verku/{parser → exporter}/epub.rb +2 -2
- data/lib/verku/exporter/html.rb +46 -0
- data/lib/verku/{parser → exporter}/mobi.rb +2 -2
- data/lib/verku/exporter/pdf.rb +61 -0
- data/lib/verku/exporter.rb +7 -7
- data/lib/verku/extensions/string.rb +2 -1
- data/lib/verku/source_list.rb +74 -0
- data/lib/verku/version.rb +8 -7
- data/lib/verku.rb +23 -15
- data/verku.gemspec +9 -8
- metadata +8 -7
- data/lib/verku/parser/html.rb +0 -245
- data/lib/verku/parser/pdf.rb +0 -54
- /data/lib/verku/{parser → exporter}/txt.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcd466c03864fc5464f3df439e28aa8fc1098bb0
|
4
|
+
data.tar.gz: 54baa4868d4d9e0262fc5cc5fd63b788f5b0b84f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da0e954012c131ac106cb7aaf3674aa74de670aa1f6bbbc370eadf6e8cfbb7276cdb6546a6359ec43897b0d29d83eb755eb28ed642bfbe3ae99dc66b94538051
|
7
|
+
data.tar.gz: 65665eee30677cb109a4a0b37973141b805a7d4b2e3a7d802c0718ee65d059d2f8ddf6ae915d02290b89e9af10f7dda3c15df72444a7cb8201017ebf74717bb5
|
data/Rakefile
CHANGED
@@ -16,7 +16,7 @@ require './lib/verku/version.rb'
|
|
16
16
|
Jeweler::Tasks.new do |gem|
|
17
17
|
|
18
18
|
gem.name = "verku"
|
19
|
-
gem.version = Verku::
|
19
|
+
gem.version = Verku::VERSION
|
20
20
|
gem.authors = ["Merovex"]
|
21
21
|
gem.email = ["dausha+verku@gmail.com"]
|
22
22
|
gem.homepage = "https://github.com/Merovex/verku"
|
data/lib/verku/cli.rb
CHANGED
@@ -46,7 +46,7 @@ module Verku
|
|
46
46
|
desc "version", "Prints the Verku's version information"
|
47
47
|
map %w(-v --version) => :version
|
48
48
|
def version
|
49
|
-
say "Verku version #{Verku::
|
49
|
+
say "Verku version #{Verku::VERSION}"
|
50
50
|
end
|
51
51
|
|
52
52
|
desc "stats", "Display some stats about your e-book"
|
@@ -1,24 +1,19 @@
|
|
1
1
|
require 'open3'
|
2
|
+
require "English"
|
2
3
|
|
3
4
|
module Verku
|
4
|
-
|
5
|
-
autoload :HTML , "verku/parser/html"
|
6
|
-
autoload :PDF , "verku/parser/pdf"
|
7
|
-
autoload :Epub , "verku/parser/epub"
|
8
|
-
autoload :Mobi , "verku/parser/mobi"
|
9
|
-
# autoload :Txt , "verku/parser/txt"
|
10
|
-
|
5
|
+
class Exporter
|
11
6
|
class Base
|
12
|
-
|
13
|
-
#
|
14
|
-
attr_accessor :
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def self.
|
21
|
-
new(root_dir).
|
7
|
+
|
8
|
+
attr_accessor :root_dir # The e-book directory.
|
9
|
+
attr_accessor :source # Where the text files are stored.
|
10
|
+
|
11
|
+
def handle_error(error)
|
12
|
+
ui.say "#{error.class}: #{error.message}", :red
|
13
|
+
ui.say error.backtrace.join("\n"), :white
|
14
|
+
end
|
15
|
+
def self.export!(root_dir)
|
16
|
+
new(root_dir).export!
|
22
17
|
end
|
23
18
|
|
24
19
|
def initialize(root_dir)
|
@@ -27,27 +22,17 @@ module Verku
|
|
27
22
|
end
|
28
23
|
|
29
24
|
# Return directory's basename.
|
30
|
-
#
|
31
25
|
def name
|
32
26
|
File.basename(root_dir)
|
33
27
|
end
|
34
28
|
|
35
29
|
# Return the configuration file.
|
36
|
-
#
|
37
30
|
def config
|
38
31
|
Verku.config(root_dir)
|
39
32
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
@entries = {}
|
44
|
-
files.each do |f|
|
45
|
-
k = File.dirname(f)
|
46
|
-
k.gsub!('text/','')
|
47
|
-
@entries[k] = [] if @entries[k].nil?
|
48
|
-
@entries[k] << f
|
49
|
-
end
|
50
|
-
return @entries
|
33
|
+
|
34
|
+
def source_list
|
35
|
+
@source_list ||= SourceList.new(root_dir)
|
51
36
|
end
|
52
37
|
def render_template(file, locals = {})
|
53
38
|
ERB.new(File.read(file)).result OpenStruct.new(locals).instance_eval{ binding }
|
@@ -56,18 +41,18 @@ module Verku
|
|
56
41
|
content = File.read(file)
|
57
42
|
data = {}
|
58
43
|
begin
|
59
|
-
# YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
|
60
|
-
if
|
44
|
+
# YAML_FRONT_MATTER_REGEXP = /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
|
45
|
+
if content =~ /\A(---\s*\n.*?\n?)^((---|\.\.\.)\s*$\n?)/m
|
61
46
|
# content = "\n#{$'}\n"
|
62
47
|
content = $POSTMATCH
|
63
|
-
data = SafeYAML.load($1)
|
64
|
-
|
48
|
+
# data = SafeYAML.load($1)
|
49
|
+
data = YAML.load($1, :safe => true)
|
65
50
|
end
|
66
51
|
return [content, data]
|
67
52
|
rescue SyntaxError => e
|
68
|
-
puts "YAML Exception reading #{
|
53
|
+
puts "YAML Exception reading #{file}: #{e.message}"
|
69
54
|
rescue Exception => e
|
70
|
-
puts "Error reading file #{
|
55
|
+
puts "Error reading file #{file}: #{e.message}"
|
71
56
|
end
|
72
57
|
end
|
73
58
|
def spawn_command(cmd)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
module Verku
|
3
|
-
|
3
|
+
class Exporter
|
4
4
|
class Epub < Base
|
5
5
|
def sections
|
6
6
|
@sections ||= html.css("div.chapter").each_with_index.map do |chapter, index|
|
@@ -14,7 +14,7 @@ module Verku
|
|
14
14
|
end
|
15
15
|
def epub; @epub ||= EeePub.make ;end
|
16
16
|
def html; @html ||= Nokogiri::HTML(html_path.read); end
|
17
|
-
def
|
17
|
+
def export!
|
18
18
|
puts "-- Exporting EPUB"
|
19
19
|
epub.title config["title"]
|
20
20
|
epub.language config["language"]
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'kramdown'
|
2
|
+
require "awesome_print"
|
3
|
+
|
4
|
+
module Verku
|
5
|
+
class Exporter
|
6
|
+
class HTML < Base
|
7
|
+
def export!
|
8
|
+
locals = config.merge({ :contents => content })
|
9
|
+
locals['copyright'].gsub!("(C)", "©")
|
10
|
+
output = render_template(root_dir.join("_templates/html/layout.erb"), locals)
|
11
|
+
File.open(root_dir.join(html_file), 'w').write(output)
|
12
|
+
true
|
13
|
+
|
14
|
+
rescue Exception => error
|
15
|
+
handle_error(error)
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def content
|
21
|
+
content = String.new
|
22
|
+
source_list.each_chapter do |files|
|
23
|
+
content << render_chapter(files)
|
24
|
+
end
|
25
|
+
return content
|
26
|
+
end
|
27
|
+
def render_file(file)
|
28
|
+
data = read_content(file)
|
29
|
+
content = "#{data[0]}".to_html
|
30
|
+
return content
|
31
|
+
end
|
32
|
+
def render_chapter(files)
|
33
|
+
chapter = String.new
|
34
|
+
String.new.tap do
|
35
|
+
files.each do |file|
|
36
|
+
chapter << render_file(file) << "\n\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return "<div class='chapter'>\n\t#{chapter}\n</div>"
|
40
|
+
end
|
41
|
+
def html_file
|
42
|
+
root_dir.join("builds/#{name}.html")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'kramdown'
|
2
|
+
require "awesome_print"
|
3
|
+
|
4
|
+
module Verku
|
5
|
+
class Exporter
|
6
|
+
class PDF < Base
|
7
|
+
def export!
|
8
|
+
locals = config.merge({ :contents => content })
|
9
|
+
locals['copyright'].gsub!("(C)", "\\copyright{}")
|
10
|
+
output = render_template(root_dir.join("_templates/pdf/layout.erb"), locals)
|
11
|
+
File.open(root_dir.join(tex_file), 'w').write(output)
|
12
|
+
|
13
|
+
puts "-- Exporting PDF"
|
14
|
+
puts " - Pass 1"; spawn_command ["xelatex", tex_file.to_s,]
|
15
|
+
puts " - Pass 2"; spawn_command ["xelatex", tex_file.to_s,]
|
16
|
+
|
17
|
+
if config['status'] == 'final'
|
18
|
+
puts " - Pass 3 - Indexing"
|
19
|
+
spawn_command ["makeindex #{name}.idx"]
|
20
|
+
# spawn_command ["makeglossaries #{name}.glo"]
|
21
|
+
spawn_command ["xelatex", tex_file.to_s,]
|
22
|
+
spawn_command ["rm *ilg *ind "]
|
23
|
+
end
|
24
|
+
|
25
|
+
spawn_command ["rm *.glo *.idx *.log *.out *.toc *aux *ist"]
|
26
|
+
spawn_command ["mv #{name}.pdf builds/#{name}.pdf"]
|
27
|
+
true
|
28
|
+
|
29
|
+
rescue Exception => error
|
30
|
+
handle_error(error)
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def render_file(file)
|
36
|
+
data = read_content(file)
|
37
|
+
content = "#{data[0]}".to_latex
|
38
|
+
return content
|
39
|
+
end
|
40
|
+
def content
|
41
|
+
content = String.new
|
42
|
+
source_list.each_chapter do |files|
|
43
|
+
content << render_chapter(files)
|
44
|
+
end
|
45
|
+
return content
|
46
|
+
end
|
47
|
+
def render_chapter(files)
|
48
|
+
chapter = String.new
|
49
|
+
String.new.tap do
|
50
|
+
files.each do |file|
|
51
|
+
chapter << render_file(file) << "\n\n"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
return chapter
|
55
|
+
end
|
56
|
+
def tex_file
|
57
|
+
root_dir.join("builds/#{name}.tex")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/verku/exporter.rb
CHANGED
@@ -2,7 +2,7 @@ module Verku
|
|
2
2
|
class Exporter
|
3
3
|
def self.run(root_dir, options)
|
4
4
|
exporter = new(root_dir, options)
|
5
|
-
exporter.export
|
5
|
+
exporter.export
|
6
6
|
end
|
7
7
|
|
8
8
|
attr_accessor :root_dir
|
@@ -17,7 +17,7 @@ module Verku
|
|
17
17
|
@ui ||= Thor::Base.shell.new
|
18
18
|
end
|
19
19
|
|
20
|
-
def export
|
20
|
+
def export
|
21
21
|
helper = root_dir.join("config/helper.rb")
|
22
22
|
load(helper) if helper.exist?
|
23
23
|
|
@@ -36,12 +36,12 @@ module Verku
|
|
36
36
|
export_txt = [nil, "txt"].include?(options[:only])
|
37
37
|
|
38
38
|
exported = []
|
39
|
-
exported <<
|
40
|
-
exported <<
|
41
|
-
epub_done =
|
39
|
+
exported << PDF.export!(root_dir) if export_pdf && Dependency.xelatex?# && Dependency.prince?
|
40
|
+
exported << HTML.export!(root_dir) if export_html
|
41
|
+
epub_done = Epub.export!(root_dir) if export_epub
|
42
42
|
exported << epub_done
|
43
|
-
exported <<
|
44
|
-
# exported <<
|
43
|
+
exported << Mobi.export!(root_dir) if export_mobi && epub_done && Dependency.kindlegen?
|
44
|
+
# exported << Txt.parse if export_txt && Dependency.html2text?
|
45
45
|
|
46
46
|
if exported.all?
|
47
47
|
color = :green
|
@@ -10,7 +10,8 @@ class String
|
|
10
10
|
end
|
11
11
|
def to_latex
|
12
12
|
require 'kramdown'
|
13
|
-
Kramdown::Document.new(self.dup).to_latex
|
13
|
+
s = Kramdown::Document.new(self.dup, :latex_headers => %w{chapter section subsection subsubsection paragraph subparagraph}).to_latex
|
14
|
+
s << "\\pbreak{}"
|
14
15
|
end
|
15
16
|
def to_html
|
16
17
|
require 'kramdown'
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Verku
|
2
|
+
class SourceList
|
3
|
+
# List of directories that should be skipped.
|
4
|
+
#
|
5
|
+
IGNORE_DIR = %w[. .. .svn .git]
|
6
|
+
|
7
|
+
# Files that should be skipped.
|
8
|
+
#
|
9
|
+
IGNORE_FILES = /^(CHANGELOG|TOC)\..*?$/
|
10
|
+
|
11
|
+
# List of recognized extensions.
|
12
|
+
#
|
13
|
+
EXTENSIONS = %w[md markdown text]
|
14
|
+
|
15
|
+
attr_reader :root_dir
|
16
|
+
attr_reader :source
|
17
|
+
|
18
|
+
def initialize(root_dir)
|
19
|
+
@root_dir = root_dir
|
20
|
+
@source = root_dir.join('text')
|
21
|
+
# @source = root_dir
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
#
|
26
|
+
def each_chapter(&block)
|
27
|
+
files_grouped_by_chapter.each(&block)
|
28
|
+
end
|
29
|
+
|
30
|
+
def files_grouped_by_chapter
|
31
|
+
entries.each_with_object([]) do |entry, buffer|
|
32
|
+
files = chapter_files(entry)
|
33
|
+
buffer << files unless files.empty?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def chapter_files(entry)
|
38
|
+
# Chapters can be files outside a directory.
|
39
|
+
if File.file?(entry)
|
40
|
+
[entry]
|
41
|
+
else
|
42
|
+
Dir["#{entry}/**/*.{#{EXTENSIONS.join(",")}}"].sort
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return a list of all recognized files.
|
47
|
+
#
|
48
|
+
def entries
|
49
|
+
Dir.entries(source).sort.each_with_object([]) do |entry, buffer|
|
50
|
+
buffer << source.join(entry) if valid_entry?(entry)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Check if path is a valid entry.
|
55
|
+
# Files/directories that start with a dot or underscore will be skipped.
|
56
|
+
#
|
57
|
+
def valid_entry?(entry)
|
58
|
+
entry !~ /^(\.|_)/ && (valid_directory?(entry) || valid_file?(entry))
|
59
|
+
end
|
60
|
+
|
61
|
+
# Check if path is a valid directory.
|
62
|
+
#
|
63
|
+
def valid_directory?(entry)
|
64
|
+
File.directory?(source.join(entry)) && !IGNORE_DIR.include?(File.basename(entry))
|
65
|
+
end
|
66
|
+
|
67
|
+
# Check if path is a valid file.
|
68
|
+
#
|
69
|
+
def valid_file?(entry)
|
70
|
+
ext = File.extname(entry).gsub(/\./, "").downcase
|
71
|
+
File.file?(source.join(entry)) && EXTENSIONS.include?(ext) && entry !~ IGNORE_FILES
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/verku/version.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Verku
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
2
|
+
VERSION = '0.10.0'
|
3
|
+
# module Version
|
4
|
+
# MAJOR = 0
|
5
|
+
# MINOR = 9
|
6
|
+
# PATCH = 0
|
7
|
+
# BUILD = 1
|
7
8
|
|
8
|
-
|
9
|
-
end
|
9
|
+
# STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
|
10
|
+
# end
|
10
11
|
end
|
data/lib/verku.rb
CHANGED
@@ -16,23 +16,31 @@ require "thor"
|
|
16
16
|
require "thor/group"
|
17
17
|
require "yaml"
|
18
18
|
require "cgi"
|
19
|
+
require "safe_yaml"
|
19
20
|
|
20
21
|
module Verku
|
21
|
-
|
22
|
-
require "verku/extensions/string"
|
23
22
|
ROOT = Pathname.new(File.dirname(__FILE__) + "/..")
|
23
|
+
|
24
|
+
require "verku/extensions/string"
|
25
|
+
require "verku/cli"
|
26
|
+
require "verku/dependency"
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
require "verku/exporter"
|
29
|
+
require "verku/exporter/base"
|
30
|
+
require "verku/exporter/pdf"
|
31
|
+
require "verku/exporter/html"
|
32
|
+
require "verku/exporter/epub"
|
33
|
+
require "verku/exporter/mobi"
|
34
|
+
|
35
|
+
require "verku/generator"
|
36
|
+
require "verku/adapters/markdown"
|
37
|
+
# require "verku/parser"
|
38
|
+
require "verku/source_list"
|
39
|
+
require "verku/stats"
|
40
|
+
require "verku/stream"
|
41
|
+
# require "verku/structure"
|
42
|
+
require "verku/toc"
|
43
|
+
require 'verku/version'
|
36
44
|
|
37
45
|
Encoding.default_internal = "utf-8"
|
38
46
|
Encoding.default_external = "utf-8"
|
@@ -44,8 +52,8 @@ module Verku
|
|
44
52
|
raise "Invalid Verku directory; couldn't found #{path} file." unless File.file?(path)
|
45
53
|
content = File.read(path)
|
46
54
|
erb = ERB.new(content).result
|
47
|
-
|
48
|
-
YAML.load(erb)#.with_indifferent_access
|
55
|
+
YAML.load(erb, :safe => true)
|
56
|
+
#YAML.load(erb)#.with_indifferent_access
|
49
57
|
end
|
50
58
|
def self.logger
|
51
59
|
@logger ||= Logger.new(File.open("/tmp/verku.log", "a"))
|
data/verku.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: verku 0.
|
5
|
+
# stub: verku 0.10.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "verku"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.10.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
@@ -36,14 +36,15 @@ Gem::Specification.new do |s|
|
|
36
36
|
"lib/verku/cli.rb",
|
37
37
|
"lib/verku/dependency.rb",
|
38
38
|
"lib/verku/exporter.rb",
|
39
|
+
"lib/verku/exporter/base.rb",
|
40
|
+
"lib/verku/exporter/epub.rb",
|
41
|
+
"lib/verku/exporter/html.rb",
|
42
|
+
"lib/verku/exporter/mobi.rb",
|
43
|
+
"lib/verku/exporter/pdf.rb",
|
44
|
+
"lib/verku/exporter/txt.rb",
|
39
45
|
"lib/verku/extensions/string.rb",
|
40
46
|
"lib/verku/generator.rb",
|
41
|
-
"lib/verku/
|
42
|
-
"lib/verku/parser/epub.rb",
|
43
|
-
"lib/verku/parser/html.rb",
|
44
|
-
"lib/verku/parser/mobi.rb",
|
45
|
-
"lib/verku/parser/pdf.rb",
|
46
|
-
"lib/verku/parser/txt.rb",
|
47
|
+
"lib/verku/source_list.rb",
|
47
48
|
"lib/verku/stats.rb",
|
48
49
|
"lib/verku/stream.rb",
|
49
50
|
"lib/verku/toc.rb",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: verku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Merovex
|
@@ -247,14 +247,15 @@ files:
|
|
247
247
|
- lib/verku/cli.rb
|
248
248
|
- lib/verku/dependency.rb
|
249
249
|
- lib/verku/exporter.rb
|
250
|
+
- lib/verku/exporter/base.rb
|
251
|
+
- lib/verku/exporter/epub.rb
|
252
|
+
- lib/verku/exporter/html.rb
|
253
|
+
- lib/verku/exporter/mobi.rb
|
254
|
+
- lib/verku/exporter/pdf.rb
|
255
|
+
- lib/verku/exporter/txt.rb
|
250
256
|
- lib/verku/extensions/string.rb
|
251
257
|
- lib/verku/generator.rb
|
252
|
-
- lib/verku/
|
253
|
-
- lib/verku/parser/epub.rb
|
254
|
-
- lib/verku/parser/html.rb
|
255
|
-
- lib/verku/parser/mobi.rb
|
256
|
-
- lib/verku/parser/pdf.rb
|
257
|
-
- lib/verku/parser/txt.rb
|
258
|
+
- lib/verku/source_list.rb
|
258
259
|
- lib/verku/stats.rb
|
259
260
|
- lib/verku/stream.rb
|
260
261
|
- lib/verku/toc.rb
|
data/lib/verku/parser/html.rb
DELETED
@@ -1,245 +0,0 @@
|
|
1
|
-
require 'kramdown'
|
2
|
-
module Verku
|
3
|
-
module Parser
|
4
|
-
class HTML < Base
|
5
|
-
def content
|
6
|
-
raw = []
|
7
|
-
entries.keys.each do |chapter|
|
8
|
-
text = "\n\n## Chapter\n\n"
|
9
|
-
sections = []
|
10
|
-
entries[chapter].each do |section|
|
11
|
-
sections << read_content(section)[0]
|
12
|
-
# sections << "<p>#{read_content(section)[0].split(/\n{2,}/).map do |s|
|
13
|
-
# s.gsub!(/%.*/, '')
|
14
|
-
# s.squish
|
15
|
-
# end.join("</p>\n\n<p>")}</p>"
|
16
|
-
end
|
17
|
-
text << sections.join("\n\n* * *\n\n")
|
18
|
-
raw << "<div class='chapter'>\n#{text.to_html}\n</div>\n"
|
19
|
-
end
|
20
|
-
raw
|
21
|
-
end
|
22
|
-
def parse
|
23
|
-
puts "-- Exporting HTML"
|
24
|
-
html = parse_layout(content)
|
25
|
-
toc = TOC::HTML.generate(html)
|
26
|
-
locals = config.merge({
|
27
|
-
:contents => toc.content,
|
28
|
-
:toc => toc.to_html,
|
29
|
-
})
|
30
|
-
output = render_template(root_dir.join("_templates/html/layout.erb"), locals)
|
31
|
-
f = File.open(root_dir.join("builds/#{name}.html"), 'w')
|
32
|
-
f.write(output)
|
33
|
-
f.close
|
34
|
-
true
|
35
|
-
rescue Exception
|
36
|
-
p $!, $@
|
37
|
-
false
|
38
|
-
end
|
39
|
-
def parse_layout(chapters)
|
40
|
-
output = ''
|
41
|
-
chapters.each do |text|
|
42
|
-
# text.gsub!("{%", "{")
|
43
|
-
# text.gsub!(/%.*/,'')
|
44
|
-
text = text.split("\n\n").map{|s| s.gsub("\n", " ")}.join("\n\n")
|
45
|
-
text.gsub!(/``(.*?'?)''/) { "“#{$1}”"}
|
46
|
-
text.gsub!(/``(.*?'?)"/) { "“#{$1}”"}
|
47
|
-
text.gsub!(/``/, "“")
|
48
|
-
text.gsub!(/\b'\b/) { "’" }
|
49
|
-
text.gsub!(/`(.*?)'/) { "‘#{$1}’"}
|
50
|
-
# \{([^\}]+?)\} Within the curly braces.
|
51
|
-
text.gsub!(/\\pf?break\{\}/,"<hr />")
|
52
|
-
text.gsub!(/\\pf?break/,"<hr />")
|
53
|
-
text.gsub!(/\\%/,'%')
|
54
|
-
text.gsub!(/\\`e/,'é')
|
55
|
-
text.gsub!(/\\textgreater\{?\}?/, ">")
|
56
|
-
text.gsub!(/\\Bophendze/,'Bophendze')
|
57
|
-
text.gsub!(/\\ldots\{\}/,"…")
|
58
|
-
text.gsub!(/\\Dash\{\}/, "—")
|
59
|
-
text.gsub!(/\\Dash/, "—")
|
60
|
-
text.gsub!(/\\begin\{quote\}(.*?)\\end\{quote\}/m) { "<blockquote>#{$1.strip}</blockquote>"}
|
61
|
-
text.gsub!(/<\/blockquote>\s+?<blockquote>/m, "\n")
|
62
|
-
text.gsub!(/\\begin\{([^\}]+?)\}(.*?)\\end\{[^\}]+?\}/m) { "<div class='#{$1.strip}'>#{$2.strip}</div>"}
|
63
|
-
text.gsub!(/\\section\{([^\}]+?)\}/m) { "<h3>#{$1.strip}</h3>"}
|
64
|
-
['Character','Equipment','Organization','Index'].each do |s|
|
65
|
-
text.gsub!(/\\#{s}\{[^\}]+?\}\{([^\}]+?)\}/) { "<span class='#{s.downcase}'>#{$1.strip}</span>"}
|
66
|
-
text.gsub!(/\\#{s}\{([^\}]+?)\}/) { ""}
|
67
|
-
# text.gsub!(/\\#{s}\{([^\}]+?)\}/) { "<span class='#{s.downcase}'>#{$1.strip}</span>"}
|
68
|
-
end
|
69
|
-
text.gsub!(/\\footnote\{([^\}]+?)\}/m) { ""}
|
70
|
-
text.gsub!(/\\emph\{([^\}]+?)\}/m) { "<em>#{$1.strip}</em>"}
|
71
|
-
text.gsub!(/\\thought\{([^\}]+?)\}/m) { "<em>#{$1.strip}</em>"}
|
72
|
-
text.gsub!(/\\(.*?)\{([^\}]+?)\}/) { "<span class='#{$1.downcase}'>#{$2.strip}</span>"}
|
73
|
-
text.gsub!(/\\(.*?)\{([^\}]+?)\}/) { "<span class='#{$1.downcase}'>#{$2.strip}</span>"}
|
74
|
-
text.gsub!(/<\/span>\{[^\}]+?}/, "</span>")
|
75
|
-
text.gsub!(/<p><h([1-6])>(.*?)<\/h[1-6]><\/p>/) { "<h#{$1}>#{$2.strip}</h#{$1}>"}
|
76
|
-
text.gsub!(/(\S+)~(\S+)/) { "#{$1} #{$2}"}
|
77
|
-
output << text
|
78
|
-
end
|
79
|
-
output.gsub!(/\n\n+/, "\n\n")
|
80
|
-
return output
|
81
|
-
end
|
82
|
-
end
|
83
|
-
# # List of directories that should be skipped.
|
84
|
-
# #
|
85
|
-
# IGNORE_DIR = %w[. .. .svn]
|
86
|
-
#
|
87
|
-
# # Files that should be skipped.
|
88
|
-
# #
|
89
|
-
# IGNORE_FILES = /^(CHANGELOG|TOC)\..*?$/
|
90
|
-
#
|
91
|
-
# # List of recognized extensions.
|
92
|
-
# #
|
93
|
-
# EXTENSIONS = %w[md mkdn markdown]
|
94
|
-
#
|
95
|
-
# class << self
|
96
|
-
# # The footnote index control. We have to manipulate footnotes
|
97
|
-
# # because each chapter starts from 1, so we have duplicated references.
|
98
|
-
# #
|
99
|
-
# attr_accessor :footnote_index
|
100
|
-
# end
|
101
|
-
#
|
102
|
-
# # Parse all files and save the parsed content
|
103
|
-
# # to <tt>output/book_name.html</tt>.
|
104
|
-
# #
|
105
|
-
# def parse
|
106
|
-
# reset_footnote_index!
|
107
|
-
#
|
108
|
-
# # File.open(root_dir.join("builds/#{name}.html"), "w") do |file|
|
109
|
-
# # file << parse_layout(content)
|
110
|
-
# # end
|
111
|
-
# true
|
112
|
-
# rescue Exception
|
113
|
-
# false
|
114
|
-
# end
|
115
|
-
#
|
116
|
-
# def reset_footnote_index!
|
117
|
-
# self.class.footnote_index = 1
|
118
|
-
# end
|
119
|
-
#
|
120
|
-
# private
|
121
|
-
# def chapter_files(entry)
|
122
|
-
# # Chapters can be files outside a directory.
|
123
|
-
# if File.file?(entry)
|
124
|
-
# [entry]
|
125
|
-
# else
|
126
|
-
# Dir.glob("#{entry}/**/*.{#{EXTENSIONS.join(",")}}").sort
|
127
|
-
# end
|
128
|
-
# end
|
129
|
-
#
|
130
|
-
# # Check if path is a valid entry.
|
131
|
-
# # Files/directories that start with a dot or underscore will be skipped.
|
132
|
-
# #
|
133
|
-
# def valid_entry?(entry)
|
134
|
-
# entry !~ /^(\.|_)/ && (valid_directory?(entry) || valid_file?(entry))
|
135
|
-
# end
|
136
|
-
#
|
137
|
-
# # Check if path is a valid directory.
|
138
|
-
# #
|
139
|
-
# def valid_directory?(entry)
|
140
|
-
# File.directory?(source.join(entry)) && !IGNORE_DIR.include?(File.basename(entry))
|
141
|
-
# end
|
142
|
-
#
|
143
|
-
# # Check if path is a valid file.
|
144
|
-
# #
|
145
|
-
# def valid_file?(entry)
|
146
|
-
# ext = File.extname(entry).gsub(/\./, "").downcase
|
147
|
-
# File.file?(source.join(entry)) && EXTENSIONS.include?(ext) && entry !~ IGNORE_FILES
|
148
|
-
# end
|
149
|
-
#
|
150
|
-
# # Render +file+ considering its extension.
|
151
|
-
# #
|
152
|
-
# def render_file(file, plain_syntax = false)
|
153
|
-
# file_format = format(file)
|
154
|
-
#
|
155
|
-
# content = Verku::Syntax.render(root_dir, file_format, File.read(file), plain_syntax)
|
156
|
-
#
|
157
|
-
# content = case file_format
|
158
|
-
# when :markdown
|
159
|
-
# Markdown.to_html(content)
|
160
|
-
# when :textile
|
161
|
-
# RedCloth.convert(content)
|
162
|
-
# else
|
163
|
-
# content
|
164
|
-
# end
|
165
|
-
#
|
166
|
-
# render_footnotes(content, plain_syntax)
|
167
|
-
# end
|
168
|
-
#
|
169
|
-
# def render_footnotes(content, plain_syntax = false)
|
170
|
-
# html = Nokogiri::HTML(content)
|
171
|
-
# footnotes = html.css("p[id^='fn']")
|
172
|
-
#
|
173
|
-
# return content if footnotes.empty?
|
174
|
-
#
|
175
|
-
# reset_footnote_index! unless self.class.footnote_index
|
176
|
-
#
|
177
|
-
# footnotes.each do |fn|
|
178
|
-
# index = self.class.footnote_index
|
179
|
-
# actual_index = fn["id"].gsub(/[^\d]/, "")
|
180
|
-
#
|
181
|
-
# fn.set_attribute("id", "_fn#{index}")
|
182
|
-
#
|
183
|
-
# html.css("a[href='#fn#{actual_index}']").each do |link|
|
184
|
-
# link.set_attribute("href", "#_fn#{index}")
|
185
|
-
# end
|
186
|
-
#
|
187
|
-
# html.css("a[href='#fnr#{actual_index}']").each do |link|
|
188
|
-
# link.set_attribute("href", "#_fnr#{index}")
|
189
|
-
# end
|
190
|
-
#
|
191
|
-
# html.css("[id=fnr#{actual_index}]").each do |tag|
|
192
|
-
# tag.set_attribute("id", "_fnr#{index}")
|
193
|
-
# end
|
194
|
-
#
|
195
|
-
# self.class.footnote_index += 1
|
196
|
-
# end
|
197
|
-
#
|
198
|
-
# html.css("body").inner_html
|
199
|
-
# end
|
200
|
-
#
|
201
|
-
# def format(file)
|
202
|
-
# case File.extname(file).downcase
|
203
|
-
# when ".markdown", ".mkdn", ".md"
|
204
|
-
# :markdown
|
205
|
-
# when ".textile"
|
206
|
-
# :textile
|
207
|
-
# else
|
208
|
-
# :html
|
209
|
-
# end
|
210
|
-
# end
|
211
|
-
#
|
212
|
-
# # Parse layout file, making available all configuration entries.
|
213
|
-
# #
|
214
|
-
# def parse_layout(html)
|
215
|
-
# puts "parse layout."
|
216
|
-
# toc = TOC::HTML.generate(html)
|
217
|
-
# locals = config.merge({
|
218
|
-
# :content => toc.content,
|
219
|
-
# :toc => toc.to_html,
|
220
|
-
# :changelog => render_changelog
|
221
|
-
# })
|
222
|
-
# render_template(root_dir.join("_templates/html/layout.erb"), locals)
|
223
|
-
# end
|
224
|
-
#
|
225
|
-
# # Render changelog file.
|
226
|
-
# # This file can be used to inform any book change.
|
227
|
-
# #
|
228
|
-
# def render_changelog
|
229
|
-
# changelog = Dir[root_dir.join("text/CHANGELOG.*")].first
|
230
|
-
# return render_file(changelog) if changelog
|
231
|
-
# nil
|
232
|
-
# end
|
233
|
-
#
|
234
|
-
# # Render all +files+ from a given chapter.
|
235
|
-
# #
|
236
|
-
# def render_chapter(files, plain_syntax = false)
|
237
|
-
# String.new.tap do |chapter|
|
238
|
-
# files.each do |file|
|
239
|
-
# chapter << render_file(file, plain_syntax) << "\n\n"
|
240
|
-
# end
|
241
|
-
# end
|
242
|
-
# end
|
243
|
-
# end
|
244
|
-
end
|
245
|
-
end
|
data/lib/verku/parser/pdf.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'kramdown'
|
2
|
-
|
3
|
-
module Verku
|
4
|
-
module Parser
|
5
|
-
class PDF < Base
|
6
|
-
def content
|
7
|
-
raw = []
|
8
|
-
entries.keys.each do |chapter|
|
9
|
-
title = (chapter.empty?) ? "Untitled" : chapter.split('_')[1]
|
10
|
-
title = 'Untitled' if title.nil?
|
11
|
-
raw << "\\Chapter{#{title.gsub('-',' ')}}\n\n"
|
12
|
-
entries[chapter].each do |section|
|
13
|
-
s = read_content(section)[0].to_latex.gsub(/\$(\\index\{[^\$]*?\})\$/) {"#{$1}"}
|
14
|
-
raw << "#{s}\n\n* * *"
|
15
|
-
end
|
16
|
-
end
|
17
|
-
raw
|
18
|
-
end
|
19
|
-
|
20
|
-
def parse
|
21
|
-
puts "-- Exporting PDF"
|
22
|
-
locals = config.merge({ :contents => parse_layout(content) })
|
23
|
-
locals['copyright'].gsub!("(C)", "\\copyright{}")
|
24
|
-
output = render_template(root_dir.join("_templates/pdf/layout.erb"), locals)
|
25
|
-
File.open(root_dir.join(tex_file), 'w').write(output)
|
26
|
-
puts " - Pass 1"
|
27
|
-
spawn_command ["xelatex", tex_file.to_s,]
|
28
|
-
puts " - Pass 2"
|
29
|
-
spawn_command ["xelatex", tex_file.to_s,]
|
30
|
-
if config['is_final'].to_i == 0
|
31
|
-
puts " - Pass 3 - Indexing"
|
32
|
-
spawn_command ["makeindex #{name}.idx"]
|
33
|
-
# spawn_command ["makeglossaries #{name}.glo"]
|
34
|
-
spawn_command ["xelatex", tex_file.to_s,]
|
35
|
-
spawn_command ["rm *ilg *ind "]
|
36
|
-
end
|
37
|
-
|
38
|
-
spawn_command ["rm *.glo *.idx *.log *.out *.toc *aux *ist"]
|
39
|
-
spawn_command ["mv #{name}.pdf builds/#{name}.pdf"]
|
40
|
-
true
|
41
|
-
rescue Exception
|
42
|
-
p $!, $@
|
43
|
-
false
|
44
|
-
end
|
45
|
-
def parse_layout(text)
|
46
|
-
text = text.join("\n\n")
|
47
|
-
text.gsub!('* * *', "\n\n\\pbreak{}\n\n")
|
48
|
-
end
|
49
|
-
def tex_file
|
50
|
-
root_dir.join("builds/#{name}.tex")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
File without changes
|