docx-builder 0.1.8 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12155a1ef8924e8c2891e801c75a52fbf14845ad0e68a623a2f50fe5bc292027
4
- data.tar.gz: f0a314b35106e867f8cf47d9a0a65635d602c1a6740873d57e1ea0556001b87b
3
+ metadata.gz: 193655c8d43727fc462cdafe92e546f2c3e2ae974e57ed7d5b846499bf03e4bb
4
+ data.tar.gz: b8981a3a583f8bcfb81258d8cd233c4cc30a685682fd2a4d729cdb027e97c63e
5
5
  SHA512:
6
- metadata.gz: 127728b19cfc704c51d1b57a851894bd561e559ecbcd90b08a73540ce7ce9722082ae0c93add22aed3cb2dfc21545e4d34e9e841c82d0acaa3f6c8076d34ad86
7
- data.tar.gz: df03675263bcc6663240bc83f02e2735950100aac155f129d77e2fc868b84baf0102389bc0d9eeee9c4f1b166154bd50a72dc8e77b18d55e705a26f62ca1a13d
6
+ metadata.gz: b9eda257bc7525ba96125c994b7b52ea63ba48469d56d2deef80fd46405274b5ebd48cbe47431ab5c0bdac131aee31d18e3027b200eac0ddad8a1978a34cebce
7
+ data.tar.gz: 8920365c82374b20cc2f411a49964731d53edb0042783713103a666c72324d5cf58ff9b4bb42bcf5d107f53e1ca10ed48c69f1f3c887a779da0820a31233cf13
@@ -0,0 +1,74 @@
1
+ name: CI - Checks
2
+ on:
3
+ push:
4
+ branches-ignore:
5
+ - master
6
+
7
+ jobs:
8
+
9
+ # lint:
10
+ # name: Linters verification
11
+ # runs-on: ubuntu-18.04
12
+
13
+ # steps:
14
+
15
+ # - name: Checkout code
16
+ # uses: actions/checkout@v2
17
+
18
+ # - name: Checkout deployment repo
19
+ # uses: actions/checkout@v2
20
+ # with:
21
+ # repository: cash-me/deployment
22
+ # ssh-key: ${{ secrets.DEPLOYMENT_KEY }}
23
+ # path: '.github/deployment'
24
+
25
+ # - uses: ruby/setup-ruby@v1
26
+ # with:
27
+ # ruby-version: 2.7.2
28
+
29
+ # - name: Ruby gem cache
30
+ # uses: actions/cache@v1
31
+ # with:
32
+ # path: vendor/bundle
33
+ # key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
34
+ # restore-keys: |
35
+ # ${{ runner.os }}-gems-
36
+
37
+ # - name: Linters
38
+ # uses: ./.github/deployment/actions/linters/rails
39
+
40
+ # test:
41
+ # name: Run tests
42
+ # needs: lint
43
+ # runs-on: ubuntu-18.04
44
+
45
+ # services:
46
+ # postgres:
47
+ # image: postgres:11.6
48
+ # ports: ["5432:5432"]
49
+ # options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
50
+
51
+ # steps:
52
+ # - uses: actions/checkout@v2
53
+
54
+ # - name: Checkout deployment repo
55
+ # uses: actions/checkout@v2
56
+ # with:
57
+ # repository: cash-me/deployment
58
+ # ssh-key: ${{ secrets.DEPLOYMENT_KEY }}
59
+ # path: '.github/deployment'
60
+
61
+ # - uses: ruby/setup-ruby@v1
62
+ # with:
63
+ # ruby-version: 2.7.2
64
+
65
+ # - name: Tests
66
+ # uses: ./.github/deployment/actions/tests/rails
67
+ # with:
68
+ # cc_reporter_id: ${{ secrets.CC_TEST_REPORTER_ID }}
69
+
70
+ ci-workflow:
71
+ # needs: test
72
+ runs-on: ubuntu-18.04
73
+ steps:
74
+ - run: exit 0
data/.gitignore CHANGED
@@ -5,8 +5,11 @@
5
5
  /doc/
6
6
  /pkg/
7
7
  /spec/reports/
8
- /tmp/
8
+ /tmp/output.docx
9
+ .byebug_history
9
10
 
10
11
  # rspec failure tracking
11
12
  .rspec_status
12
- docx-builder-0.1.0.gem
13
+
14
+ # Generated gem
15
+ docx-builder-*.gem
data/.rspec CHANGED
File without changes
data/.rubocop.yml CHANGED
File without changes
data/CODE_OF_CONDUCT.md CHANGED
File without changes
data/Gemfile CHANGED
@@ -7,10 +7,14 @@ gemspec
7
7
 
8
8
  gem "rake", "~> 13.0"
9
9
  gem "rspec", "~> 3.0"
10
- gem "zip", "~> 2.0.2"
10
+ gem 'rubyzip', require: 'zip'
11
11
  gem "rubocop", "~> 0.80"
12
12
  gem "nokogiri", "~> 1.11.1"
13
13
 
14
14
  group :test do
15
15
  gem "byebug"
16
- end
16
+ end
17
+
18
+ group :development do
19
+ gem "bump"
20
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,67 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ docx-builder (0.2.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.2)
10
+ bump (0.10.0)
11
+ byebug (11.1.3)
12
+ diff-lcs (1.4.4)
13
+ mini_portile2 (2.5.0)
14
+ nokogiri (1.11.3)
15
+ mini_portile2 (~> 2.5.0)
16
+ racc (~> 1.4)
17
+ parallel (1.20.1)
18
+ parser (3.0.1.0)
19
+ ast (~> 2.4.1)
20
+ racc (1.5.2)
21
+ rainbow (3.0.0)
22
+ rake (13.0.3)
23
+ regexp_parser (2.1.1)
24
+ rexml (3.2.5)
25
+ rspec (3.10.0)
26
+ rspec-core (~> 3.10.0)
27
+ rspec-expectations (~> 3.10.0)
28
+ rspec-mocks (~> 3.10.0)
29
+ rspec-core (3.10.1)
30
+ rspec-support (~> 3.10.0)
31
+ rspec-expectations (3.10.1)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.10.0)
34
+ rspec-mocks (3.10.2)
35
+ diff-lcs (>= 1.2.0, < 2.0)
36
+ rspec-support (~> 3.10.0)
37
+ rspec-support (3.10.2)
38
+ rubocop (0.93.1)
39
+ parallel (~> 1.10)
40
+ parser (>= 2.7.1.5)
41
+ rainbow (>= 2.2.2, < 4.0)
42
+ regexp_parser (>= 1.8)
43
+ rexml
44
+ rubocop-ast (>= 0.6.0)
45
+ ruby-progressbar (~> 1.7)
46
+ unicode-display_width (>= 1.4.0, < 2.0)
47
+ rubocop-ast (1.4.1)
48
+ parser (>= 2.7.1.5)
49
+ ruby-progressbar (1.11.0)
50
+ rubyzip (2.3.0)
51
+ unicode-display_width (1.7.0)
52
+
53
+ PLATFORMS
54
+ ruby
55
+
56
+ DEPENDENCIES
57
+ bump
58
+ byebug
59
+ docx-builder!
60
+ nokogiri (~> 1.11.1)
61
+ rake (~> 13.0)
62
+ rspec (~> 3.0)
63
+ rubocop (~> 0.80)
64
+ rubyzip
65
+
66
+ BUNDLED WITH
67
+ 2.1.4
data/LICENSE.txt CHANGED
File without changes
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
data/docx-builder.gemspec CHANGED
@@ -5,8 +5,8 @@ require_relative "lib/docx/builder/version"
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "docx-builder"
7
7
  spec.version = Docx::Builder::VERSION
8
- spec.authors = ["Paulo Soares"]
9
- spec.email = ["paulo.soares@cashme.com.br"]
8
+ spec.authors = ["Tecnologia Cashme"]
9
+ spec.email = ["tecnologia@cashme.com.br"]
10
10
 
11
11
  spec.summary = "Builds a new docx file using ERB template"
12
12
  spec.description = "Builds a new docx file using ERB template"
@@ -0,0 +1,41 @@
1
+ module Docx
2
+ module Builder
3
+ module Cleaners
4
+ def self.starting_tags_without_spaces_cleaner(str)
5
+ str && str.gsub(/\{\s*\{\s*%/, '{{%')
6
+ end
7
+
8
+ def self.ending_tags_without_spaces_cleaner(str)
9
+ str && str.gsub(/%\s*\}\s*\}/, '%}}')
10
+ end
11
+
12
+ def self.single_quote_cleaner(str)
13
+ str && str.gsub(/\‘/, '\'').gsub(/\’/, '\'')
14
+ end
15
+
16
+ def self.var_without_duplicated_spaces_cleaner(str)
17
+ str && str.gsub(/\s+/, ' ')
18
+ end
19
+
20
+ def self.var_without_spaces_inside_brackets_cleaner(str)
21
+ str && str.gsub(/\[(.*?)\]/) { |match| match.gsub(/\s/, '')}
22
+ end
23
+
24
+ def self.no_spaces_around_undeline_cleaner(str)
25
+ str && str.gsub(/\s*\_\s*/, "_")
26
+ end
27
+
28
+ def self.join_dots_and_brackets_cleaner(str)
29
+ str && str.gsub(/\s*\.\s*/, '.').gsub(/\s*\[\s*/, '[').gsub(/\s*\]/, ']')
30
+ end
31
+
32
+ def self.question_method_cleaner(str)
33
+ if str && str =~ /\A\{\{\s+if\s*(.*?)\s*\?\s+\}\}\Z/
34
+ "{{ if #{$1}\? }}"
35
+ else
36
+ str
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Docx
4
+ module Builder
5
+ module Decoder
6
+ def self.to_xml(path)
7
+ Zip::File.open(path) do |file|
8
+ @zipfile = file
9
+ end
10
+ @zipfile
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Docx
4
+ module Builder
5
+ module Encoder
6
+ def self.build_new_document_xml(original_document, new_document_sections)
7
+ output = Zip::OutputStream.write_buffer(StringIO.new) do |out|
8
+ original_document.each do |entry|
9
+ entry_name = entry.name
10
+ out.put_next_entry(entry_name)
11
+ out.write(new_document_sections[entry_name] || entry.get_input_stream.read)
12
+ end
13
+ end
14
+ output.string
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,50 @@
1
+ module Docx
2
+ module Builder
3
+ class Template
4
+ def initialize(path)
5
+ @document = Docx::Builder::Decoder.to_xml(path)
6
+ @sections = ["word/document.xml"]
7
+ @document.each do |file|
8
+ if file.name.include? "word/header"
9
+ @sections.push(file.name)
10
+ end
11
+ end
12
+ end
13
+
14
+ def render(data)
15
+ @sections.map do |section|
16
+ cleaned_document = clean(@document.read(section))
17
+ erb_template = build_erb_template(cleaned_document)
18
+ processed_document = render_erb_template(erb_template, data)
19
+ [section, processed_document]
20
+ end.to_h
21
+ end
22
+
23
+ def clean(document)
24
+ document.force_encoding(Encoding::UTF_8) if document.respond_to?(:force_encoding)
25
+ Docx::Builder::XmlProcessor.clean_variables(document)
26
+ end
27
+
28
+ def build_erb_template(document)
29
+ ret = document.gsub(/\{\{%/, '<%=').gsub(/%\}\}/, '%>')
30
+ ret = ret.gsub(/\{\{/, '<%').gsub(/\}\}/, '%>')
31
+ ret
32
+ end
33
+
34
+ def render_erb_template(document, data)
35
+ erb_template = ERB.new(document)
36
+ ret = erb_template.result_with_hash(data)
37
+ ret
38
+ end
39
+
40
+ # creates xml template keys in input docx (template file)
41
+ def save(path, new_document)
42
+ File.open(path, 'wb') do |f|
43
+ new_document_xml_string = Docx::Builder::Encoder.build_new_document_xml(@document, new_document)
44
+ f.write(new_document_xml_string)
45
+ end
46
+ @document.close
47
+ end
48
+ end
49
+ end
50
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Docx
4
4
  module Builder
5
- VERSION = "0.1.8"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -0,0 +1,34 @@
1
+ module Docx
2
+ module Builder
3
+ class XmlProcessor
4
+ BROKEN_VARIABLE_PATTERN = "<w:t>([^\#^<^>]*?)#([^\#^<^>]*?)<\/w:t>"
5
+
6
+ def self.clean_variables(document)
7
+ document.gsub(/\{\{.*?\}\}/m) do |match|
8
+ ret = match.include?('>') ? join_variable_tags(match) : match
9
+ ret = clean_spaces_inside_variables(ret)
10
+ ret
11
+ end
12
+ end
13
+
14
+ def self.join_variable_tags(match)
15
+ before = match.gsub(/\<(.*)/m, '')
16
+ inside = match.scan(/<w:t.*?>([^>]*?)<.w:t>/m).join(' ').gsub(/\s*\.\s*/, '.')
17
+ after = match.gsub(/.*>([^>]+)$/m, "\\1")
18
+ [before, inside, after].join(' ')
19
+ end
20
+
21
+ def self.clean_spaces_inside_variables(match)
22
+ ret = match.dup
23
+ cleaner_methods = Docx::Builder::Cleaners.methods.grep /_cleaner/
24
+ cleaner_methods.each do |clean_method|
25
+ ret = Docx::Builder::Cleaners.send(clean_method, ret)
26
+ end
27
+ puts "Returning cleaned variable: #{ret}"
28
+ ret
29
+ end
30
+ end
31
+
32
+ # {{% devedor[:pessoa_fisica][:cedula_identidade] %}},
33
+ end
34
+ end
data/lib/docx/builder.rb CHANGED
@@ -1,59 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "builder/version"
4
- require_relative "decoder"
5
- require_relative "encoder"
6
- require_relative "xml_processor"
7
-
8
3
  require 'rubygems'
9
4
  require 'zip'
10
5
  require 'nokogiri'
11
6
 
12
- module Docx
13
- module Builder
14
- class Error < StandardError; end
15
-
16
- class Template
17
- SECTIONS = %w( word/header1.xml word/document.xml )
18
-
19
- def initialize(path)
20
- @document = Docx::Decoder.to_xml(path)
21
- end
22
-
23
- def render(data)
24
- SECTIONS.map do |section|
25
- cleaned_document = clean(@document.read(section))
26
- erb_template = build_erb_template(cleaned_document)
27
- processed_document = render_erb_template(erb_template, data)
28
- [section, processed_document]
29
- end.to_h
30
- end
31
-
32
- def clean(document)
33
- document.force_encoding(Encoding::UTF_8) if document.respond_to?(:force_encoding)
34
- XmlProcessor.clean_variables(document)
35
- end
36
-
37
- def build_erb_template(document)
38
- ret = document.gsub(/\{\{%/, '<%=').gsub(/%\}\}/, '%>')
39
- ret = ret.gsub(/\{\{/, '<%').gsub(/\}\}/, '%>')
40
- ret
41
- end
42
-
43
- def render_erb_template(document, data)
44
- erb_template = ERB.new(document)
45
- ret = erb_template.result_with_hash(data)
46
- ret
47
- end
48
-
49
- # creates xml template keys in input docx (template file)
50
- def save(path, new_document)
51
- File.open(path, 'wb') do |f|
52
- new_document_xml_string = Docx::Encoder.build_new_document_xml(@document, new_document)
53
- f.write(new_document_xml_string)
54
- end
55
- @document.close
56
- end
57
- end
58
- end
59
- end
7
+ require_relative "builder/version"
8
+ require_relative "builder/decoder"
9
+ require_relative "builder/encoder"
10
+ require_relative 'builder/cleaners'
11
+ require_relative "builder/xml_processor"
12
+ require_relative "builder/template"
data/tmp/.gitkeep ADDED
File without changes
metadata CHANGED
@@ -1,28 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docx-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
- - Paulo Soares
7
+ - Tecnologia Cashme
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-13 00:00:00.000000000 Z
11
+ date: 2022-04-01 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Builds a new docx file using ERB template
14
14
  email:
15
- - paulo.soares@cashme.com.br
15
+ - tecnologia@cashme.com.br
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
- - ".github/workflows/main.yml"
20
+ - ".github/workflows/ci.yaml"
21
21
  - ".gitignore"
22
22
  - ".rspec"
23
23
  - ".rubocop.yml"
24
24
  - CODE_OF_CONDUCT.md
25
25
  - Gemfile
26
+ - Gemfile.lock
26
27
  - LICENSE.txt
27
28
  - README.md
28
29
  - Rakefile
@@ -30,12 +31,14 @@ files:
30
31
  - bin/setup
31
32
  - docx-builder.gemspec
32
33
  - lib/docx/builder.rb
34
+ - lib/docx/builder/cleaners.rb
35
+ - lib/docx/builder/decoder.rb
36
+ - lib/docx/builder/encoder.rb
37
+ - lib/docx/builder/template.rb
33
38
  - lib/docx/builder/version.rb
34
- - lib/docx/cleaners.rb
35
- - lib/docx/decoder.rb
36
- - lib/docx/encoder.rb
37
- - lib/docx/xml_processor.rb
39
+ - lib/docx/builder/xml_processor.rb
38
40
  - publish.sh
41
+ - tmp/.gitkeep
39
42
  homepage: https://github.com/cash-me/docx-builder
40
43
  licenses:
41
44
  - MIT
@@ -58,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
61
  - !ruby/object:Gem::Version
59
62
  version: '0'
60
63
  requirements: []
61
- rubygems_version: 3.1.4
64
+ rubygems_version: 3.3.9
62
65
  signing_key:
63
66
  specification_version: 4
64
67
  summary: Builds a new docx file using ERB template
@@ -1,18 +0,0 @@
1
- name: Ruby
2
-
3
- on: [push,pull_request]
4
-
5
- jobs:
6
- build:
7
- runs-on: ubuntu-latest
8
- steps:
9
- - uses: actions/checkout@v2
10
- - name: Set up Ruby
11
- uses: ruby/setup-ruby@v1
12
- with:
13
- ruby-version: 2.7.2
14
- - name: Run the default task
15
- run: |
16
- gem install bundler -v 2.2.2
17
- bundle install
18
- bundle exec rake
data/lib/docx/cleaners.rb DELETED
@@ -1,37 +0,0 @@
1
- module Cleaners
2
- def self.starting_tags_without_spaces_cleaner(str)
3
- str && str.gsub(/\{\s*\{\s*%/, '{{%')
4
- end
5
-
6
- def self.ending_tags_without_spaces_cleaner(str)
7
- str && str.gsub(/%\s*\}\s*\}/, '%}}')
8
- end
9
-
10
- def self.single_quote_cleaner(str)
11
- str && str.gsub(/\‘/, '\'').gsub(/\’/, '\'')
12
- end
13
-
14
- def self.var_without_duplicated_spaces_cleaner(str)
15
- str && str.gsub(/\s+/, ' ')
16
- end
17
-
18
- def self.var_without_spaces_inside_brackets_cleaner(str)
19
- str && str.gsub(/\[(.*?)\]/) { |match| match.gsub(/\s/, '')}
20
- end
21
-
22
- def self.no_spaces_around_undeline_cleaner(str)
23
- str && str.gsub(/\s*\_\s*/, "_")
24
- end
25
-
26
- def self.join_dots_and_brackets_cleaner(str)
27
- str && str.gsub(/\s*\.\s*/, '.').gsub(/\s*\[\s*/, '[').gsub(/\s*\]/, ']')
28
- end
29
-
30
- def self.question_method_cleaner(str)
31
- if str && str =~ /\A\{\{\s+if\s*(.*?)\s*\?\s+\}\}\Z/
32
- "{{ if #{$1}\? }}"
33
- else
34
- str
35
- end
36
- end
37
- end
data/lib/docx/decoder.rb DELETED
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'zip'
4
-
5
- module Docx
6
- module Decoder
7
- def self.to_xml(path)
8
- Zip::File.open(path)
9
- end
10
- end
11
- end
data/lib/docx/encoder.rb DELETED
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'zip'
4
-
5
- module Docx
6
- module Encoder
7
- def self.build_new_document_xml(original_document, new_document_sections)
8
- output = Zip::OutputStream.write_buffer(StringIO.new) do |out|
9
- original_document.each do |entry|
10
- entry_name = entry.name
11
- out.put_next_entry(entry_name)
12
- out.write(new_document_sections[entry_name] || entry.get_input_stream.read)
13
- end
14
- end
15
- output.string
16
- end
17
- end
18
- end
@@ -1,32 +0,0 @@
1
- require_relative 'cleaners'
2
-
3
- class XmlProcessor
4
- BROKEN_VARIABLE_PATTERN = "<w:t>([^\#^<^>]*?)#([^\#^<^>]*?)<\/w:t>"
5
-
6
- def self.clean_variables(document)
7
- document.gsub(/\{\{.*?\}\}/m) do |match|
8
- ret = match.include?('>') ? join_variable_tags(match) : match
9
- ret = clean_spaces_inside_variables(ret)
10
- ret
11
- end
12
- end
13
-
14
- def self.join_variable_tags(match)
15
- before = match.gsub(/\<(.*)/m, '')
16
- inside = match.scan(/<w:t.*?>([^>]*?)<.w:t>/m).join(' ').gsub(/\s*\.\s*/, '.')
17
- after = match.gsub(/.*>([^>]+)$/m, "\\1")
18
- [before, inside, after].join(' ')
19
- end
20
-
21
- def self.clean_spaces_inside_variables(match)
22
- ret = match.dup
23
- cleaner_methods = Cleaners.methods.grep /_cleaner/
24
- cleaner_methods.each do |clean_method|
25
- ret = Cleaners.send(clean_method, ret)
26
- end
27
- puts "Returning cleaned variable: #{ret}"
28
- ret
29
- end
30
- end
31
-
32
- # {{% devedor[:pessoa_fisica][:cedula_identidade] %}},