avm-eac_latex_base0 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9688872d1a1fca1395d0d6b9498a12805d9b82af14ec4e19ecf411b9b8896f66
4
+ data.tar.gz: d4a58a13ff7e2f92d48545a9a63581cd67aba7c438d1eec0ef1855843cf088e0
5
+ SHA512:
6
+ metadata.gz: 0f66d278493c2202eafd333afc7edad807252f69e7b113cce3856ab2333cfaccdc190f4d24cc47f31cf3490fab1ce5d9280c30d98ecc4af3bf9a351b3d47b26b
7
+ data.tar.gz: fc32995b9636ca1263cb36a40c57603218ca452c780dba2e5cf1766c51b6b6c84587caee9c1d9b01694e22e2bd29ada0f76c0435efe2aac9d0c85207816daf34
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_webapp_base0/apache_host'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ module Instances
8
+ class ApacheHost < ::Avm::EacWebappBase0::ApacheHost
9
+ def document_root
10
+ instance.read_entry(::Avm::Instances::EntryKeys::FS_PATH)
11
+ end
12
+
13
+ def extra_content
14
+ ''
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_webapp_base0/instance'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ module Instances
8
+ class Base < ::Avm::EacWebappBase0::Instance
9
+ FILES_UNITS = {}.freeze
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_webapp_base0/deploy'
4
+ require 'avm/eac_latex_base0/sources/base'
5
+ require 'avm/eac_latex_base0/sources/build'
6
+
7
+ module Avm
8
+ module EacLatexBase0
9
+ module Instances
10
+ class Deploy < ::Avm::EacWebappBase0::Deploy
11
+ def build_content
12
+ ::Avm::EacLatexBase0::Sources::Build.new(project, output_file:
13
+ build_dir.join(pdf_path))
14
+ end
15
+
16
+ def title
17
+ instance.id.humanize
18
+ end
19
+
20
+ def pdf_path
21
+ "#{instance.id.underscore}.pdf"
22
+ end
23
+
24
+ def variables_source
25
+ self
26
+ end
27
+
28
+ private
29
+
30
+ def project_uncached
31
+ ::Avm::EacLatexBase0::Sources::Base.new(
32
+ instance.source_instance.read_entry(::Avm::Instances::EntryKeys::FS_PATH)
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ module Instances
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/sources/base'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module Avm
7
+ module EacLatexBase0
8
+ module Sources
9
+ class Base < ::Avm::Sources::Base
10
+ def chapters
11
+ chapters_file.read.split("\n").map(&:strip).reject { |c| c == '' }
12
+ end
13
+
14
+ def chapters_file
15
+ root.join('chapters')
16
+ end
17
+
18
+ def main_file
19
+ path.join('main.tex')
20
+ end
21
+
22
+ def name
23
+ root.basename.to_s
24
+ end
25
+
26
+ def default_output_dir
27
+ root.join('dist')
28
+ end
29
+
30
+ def default_output_file
31
+ root.join("#{name}.pdf")
32
+ end
33
+
34
+ def root
35
+ path
36
+ end
37
+
38
+ def valid?
39
+ main_file.file?
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module EacLatexBase0
5
+ module Sources
6
+ class Build
7
+ class << self
8
+ def chapter_filename(chapter_name)
9
+ "chapter_#{chapter_name}"
10
+ end
11
+ end
12
+
13
+ module ChaptersContent
14
+ private
15
+
16
+ def chapter
17
+ options[:chapter]
18
+ end
19
+
20
+ def chapter_filename(chapter_name)
21
+ ::Avm::EacLatexBase0::Sources::Build.chapter_filename(chapter_name)
22
+ end
23
+
24
+ def check_chapter
25
+ return unless chapter
26
+ return if project.chapters.include?(chapter)
27
+
28
+ fatal_error("Chapter not found: \"#{chapter}\" (List: #{project.chapters})")
29
+ end
30
+
31
+ def include_content
32
+ main_path = source_temp_dir.join('main.tex')
33
+ main_path.write(main_path.read.gsub(CONTENT_VAR, include_chapters_content))
34
+ end
35
+
36
+ def include_chapters_content
37
+ r = chapters_content
38
+ r = "\\maketitle\n\n#{r}" if chapter.blank?
39
+ r
40
+ end
41
+
42
+ def chapters_content
43
+ project.chapters.map { |c| "\\include{#{chapter_filename(c)}}" }.join("\n")
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_templates/core_ext'
4
+ require 'singleton'
5
+
6
+ module Avm
7
+ module EacLatexBase0
8
+ module Sources
9
+ class Build
10
+ class Commons
11
+ include ::Singleton
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_latex_base0/sources/build/commons'
4
+ require 'avm/eac_latex_base0/sources/build/file'
5
+
6
+ module Avm
7
+ module EacLatexBase0
8
+ module Sources
9
+ class Build
10
+ module CopyFiles
11
+ def copy_project_files
12
+ copy_project_dir('.')
13
+ end
14
+
15
+ def copy_project_obj(subpath)
16
+ return if File.basename(subpath).start_with?('.')
17
+
18
+ if File.directory?(File.join(project.root, subpath))
19
+ copy_project_dir(subpath)
20
+ else
21
+ copy_project_file(subpath)
22
+ end
23
+ end
24
+
25
+ def copy_project_file(subpath)
26
+ ::Avm::EacLatexBase0::Sources::Build::File.new(project, subpath)
27
+ .build_to_dir(source_temp_dir)
28
+ end
29
+
30
+ def copy_project_dir(subpath)
31
+ Dir.entries(File.join(project.root, subpath)).each do |f|
32
+ copy_project_obj(File.join(subpath, f))
33
+ end
34
+ end
35
+
36
+ def copy_commons_files
37
+ target_dir = source_temp_dir.join('commons')
38
+ target_dir.mkpath
39
+ ::Avm::EacLatexBase0::Sources::Build::Commons.instance.template.apply(self, target_dir)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module EacLatexBase0
5
+ module Sources
6
+ class Build
7
+ class File
8
+ module BaseStereotype
9
+ private
10
+
11
+ def target_subpath
12
+ subpath
13
+ end
14
+
15
+ def copy(target_path)
16
+ FileUtils.copy_file(source_path, target_path)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module EacLatexBase0
5
+ module Sources
6
+ class Build
7
+ class File
8
+ module ChapterIndex
9
+ class << self
10
+ def match?(subpath)
11
+ ::File.basename(subpath) == 'index.tex'
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def target_subpath
18
+ ::Avm::EacLatexBase0::Sources::Build.chapter_filename(
19
+ File.basename(File.dirname(subpath))
20
+ ) + '.tex'
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module EacLatexBase0
5
+ module Sources
6
+ class Build
7
+ class File
8
+ module TexSource
9
+ class << self
10
+ def match?(subpath)
11
+ ::File.extname(subpath) == '.tex'
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def copy(target_path)
18
+ ::File.write(target_path, target_content)
19
+ end
20
+
21
+ def target_content
22
+ s = ::File.read(source_path)
23
+ replacements.each do |from, to|
24
+ s = s.gsub(from, to)
25
+ end
26
+ s
27
+ end
28
+
29
+ def replacements
30
+ { '%dir%' => ::File.dirname(subpath) }
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ module Sources
8
+ class Build
9
+ class File
10
+ require_sub __FILE__
11
+ include ::Avm::EacLatexBase0::Sources::Build::File::BaseStereotype
12
+ DEFAULT_STEREOTYPES = [::Avm::EacLatexBase0::Sources::Build::File::ChapterIndex,
13
+ ::Avm::EacLatexBase0::Sources::Build::File::TexSource].freeze
14
+
15
+ class << self
16
+ def stereotypes
17
+ DEFAULT_STEREOTYPES
18
+ end
19
+ end
20
+
21
+ common_constructor :project, :subpath do
22
+ self.class.stereotypes.each do |stereotype|
23
+ singleton_class.prepend(stereotype) if stereotype.match?(subpath)
24
+ end
25
+ end
26
+
27
+ def build_to_dir(build_root_target_dir)
28
+ create_target_dir(build_root_target_dir)
29
+ copy(target_path(build_root_target_dir))
30
+ end
31
+
32
+ private
33
+
34
+ def create_target_dir(build_root_target_dir)
35
+ FileUtils.mkdir_p(File.dirname(target_path(build_root_target_dir)))
36
+ end
37
+
38
+ def source_path
39
+ File.join(project.root, subpath)
40
+ end
41
+
42
+ def target_path(build_root_target_dir)
43
+ File.join(build_root_target_dir, target_subpath)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/executables'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/fs/temp'
6
+ require 'eac_ruby_utils/fs/clearable_directory'
7
+
8
+ module Avm
9
+ module EacLatexBase0
10
+ module Sources
11
+ class Build
12
+ require_sub __FILE__, include_modules: true
13
+ enable_speaker
14
+
15
+ CONTENT_VAR = '%%%CONTENT%%%'
16
+
17
+ common_constructor :project, :options do
18
+ run
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :source_temp_dir
24
+
25
+ def run
26
+ start_banner
27
+ check_chapter
28
+ build
29
+ success('Done!')
30
+ end
31
+
32
+ def start_banner
33
+ infov('Chapter', chapter)
34
+ infov('Output file', output_file)
35
+ end
36
+
37
+ def build
38
+ on_temp_source_dir do
39
+ copy_project_files
40
+ copy_commons_files
41
+ include_content
42
+ compile
43
+ check
44
+ move_output_to_target
45
+ open_output
46
+ end
47
+ end
48
+
49
+ def check
50
+ return if ::File.size(temp_output_file).positive?
51
+
52
+ fatal_error("Zero-size file builded: #{temp_output_file}")
53
+ end
54
+
55
+ def compile
56
+ compile_command.execute!.each_line do |line|
57
+ if line.include?('No file')
58
+ raise 'Command returned without error, but there is at least one "No file" line in' \
59
+ "log: #{line}"
60
+ end
61
+ end
62
+ end
63
+
64
+ def compile_command
65
+ ::Avm::Executables.latex.command(*compile_command_args).chdir(source_temp_dir)
66
+ end
67
+
68
+ def compile_command_args
69
+ r = ["-output-director=#{build_dir}", '-output-format=pdf',
70
+ '-interaction=nonstopmode', '-halt-on-error', '-file-line-error']
71
+ r << if chapter.present?
72
+ "\\includeonly{#{chapter_filename(chapter)}}\\input{main.tex}"
73
+ else
74
+ './main.tex'
75
+ end
76
+ r
77
+ end
78
+
79
+ def move_output_to_target
80
+ File.rename(temp_output_file, output_file)
81
+ infov('Size', ::Filesize.from("#{File.size(output_file)} B").pretty)
82
+ end
83
+
84
+ def temp_output_file
85
+ File.join(build_dir, 'main.pdf')
86
+ end
87
+
88
+ def on_temp_source_dir
89
+ if options[:source_dir].present?
90
+ @source_temp_dir = ::EacRubyUtils::Fs::ClearableDirectory.new(options.source_dir).clear
91
+ yield
92
+ else
93
+ ::EacRubyUtils::Fs::Temp.on_directory do |directory|
94
+ @source_temp_dir = directory
95
+ yield
96
+ end
97
+ end
98
+ end
99
+
100
+ def build_dir
101
+ r = project.root.join('build')
102
+ r.mkpath
103
+ r
104
+ end
105
+
106
+ def output_file
107
+ (options[:output_file] || project.default_output_file)
108
+ end
109
+
110
+ def open_output
111
+ return unless options[:open]
112
+
113
+ infom("Opening \"#{output_file}\"")
114
+ ::Avm::Executables.xdg_open.command(output_file).system!
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_latex_base0/sources/build'
4
+ require 'eac_cli/core_ext'
5
+
6
+ module Avm
7
+ module EacLatexBase0
8
+ module Sources
9
+ module Runners
10
+ class BuildChapters
11
+ runner_with :help do
12
+ arg_opt '-o', '--output-dir', 'Output chapters to specific directory.'
13
+ end
14
+
15
+ def run
16
+ runner_context.call(:project_banner)
17
+ output_dir.mkpath
18
+ project.chapters.each_with_index do |c, i|
19
+ ::Avm::EacLatexBase0::Sources::Build.new(project, chapter_build_options(c, i))
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def chapter_build_options(chapter, index)
26
+ output_name = "#{(index + 1).to_s.rjust(3, '0')}_#{chapter}.pdf"
27
+ { output_file: output_dir.join(output_name), chapter: chapter }
28
+ end
29
+
30
+ def output_dir_uncached
31
+ (
32
+ parsed.output_dir || project.default_output_dir.join('chapters')
33
+ ).to_pathname
34
+ end
35
+
36
+ def project
37
+ runner_context.call(:project)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_latex_base0/sources/build'
4
+ require 'eac_cli/core_ext'
5
+
6
+ module Avm
7
+ module EacLatexBase0
8
+ module Sources
9
+ module Runners
10
+ class BuildSingle
11
+ runner_with :help do
12
+ arg_opt '-s', '--source-dir', 'Write .tex source code in specific directory.'
13
+ arg_opt '-f', '--output-file', 'Output to specific file.'
14
+ arg_opt '-c', '--chapter', 'Write only the chapter <chapter>.'
15
+ bool_opt '-o', '--open', 'Open the file after build.'
16
+ end
17
+
18
+ def run
19
+ runner_context.call(:project_banner)
20
+ infov 'Build options', build_options
21
+ ::Avm::EacLatexBase0::Sources::Build.new(runner_context.call(:project), parsed)
22
+ end
23
+
24
+ private
25
+
26
+ def build_options
27
+ parsed.slice_fetch(:output_file, :open, :chapter, :source_dir)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avm/eac_latex_base0/sources/build'
4
+ require 'eac_cli/core_ext'
5
+
6
+ module Avm
7
+ module EacLatexBase0
8
+ module Sources
9
+ module Runners
10
+ class Info
11
+ runner_with :help do
12
+ desc 'Information about a loca EacRailsBase0 local project.'
13
+ end
14
+
15
+ def run
16
+ runner_context.call(:project_banner)
17
+ infov 'Chapters', project.chapters.count
18
+ project.chapters.each_with_index do |chapter, index|
19
+ infov " * #{index + 1}", chapter
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def project
26
+ runner_context.call(:project)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ module Sources
8
+ module Runners
9
+ require_sub __FILE__
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ module Sources
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avm
4
+ module EacLatexBase0
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Avm
6
+ module EacLatexBase0
7
+ require_sub __FILE__
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: avm-eac_latex_base0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Put here the authors
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: avm
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.34'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.34'
27
+ - !ruby/object:Gem::Dependency
28
+ name: avm-eac_webapp_base0
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.3'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.3.1
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '0.3'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.3.1
47
+ - !ruby/object:Gem::Dependency
48
+ name: eac_ruby_utils
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.97'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.97'
61
+ - !ruby/object:Gem::Dependency
62
+ name: eac_ruby_gem_support
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.5'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 0.5.1
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.5'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 0.5.1
81
+ description:
82
+ email:
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files: []
86
+ files:
87
+ - lib/avm/eac_latex_base0.rb
88
+ - lib/avm/eac_latex_base0/instances.rb
89
+ - lib/avm/eac_latex_base0/instances/apache_host.rb
90
+ - lib/avm/eac_latex_base0/instances/base.rb
91
+ - lib/avm/eac_latex_base0/instances/deploy.rb
92
+ - lib/avm/eac_latex_base0/sources.rb
93
+ - lib/avm/eac_latex_base0/sources/base.rb
94
+ - lib/avm/eac_latex_base0/sources/build.rb
95
+ - lib/avm/eac_latex_base0/sources/build/chapters_content.rb
96
+ - lib/avm/eac_latex_base0/sources/build/commons.rb
97
+ - lib/avm/eac_latex_base0/sources/build/copy_files.rb
98
+ - lib/avm/eac_latex_base0/sources/build/file.rb
99
+ - lib/avm/eac_latex_base0/sources/build/file/base_stereotype.rb
100
+ - lib/avm/eac_latex_base0/sources/build/file/chapter_index.rb
101
+ - lib/avm/eac_latex_base0/sources/build/file/tex_source.rb
102
+ - lib/avm/eac_latex_base0/sources/runners.rb
103
+ - lib/avm/eac_latex_base0/sources/runners/build_chapters.rb
104
+ - lib/avm/eac_latex_base0/sources/runners/build_single.rb
105
+ - lib/avm/eac_latex_base0/sources/runners/info.rb
106
+ - lib/avm/eac_latex_base0/version.rb
107
+ homepage:
108
+ licenses: []
109
+ metadata: {}
110
+ post_install_message:
111
+ rdoc_options: []
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ requirements: []
125
+ rubygems_version: 3.1.6
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: Put here de description.
129
+ test_files: []