avm-eac_latex_base0 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 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: []