Sha256: c47f25d61709e4a0ac9258a683b5d220aa8a47740a465fa808733d22a361d742

Contents?: true

Size: 1.58 KB

Versions: 2

Compression:

Stored size: 1.58 KB

Contents

# frozen_string_literal: true

require_relative "builder/version"
require_relative "decoder"
require_relative "encoder"
require_relative "xml_processor"

require 'rubygems'
require 'zip'
require 'nokogiri'

module Docx
  module Builder
    class Error < StandardError; end
    
    class Template
      SECTIONS = %w( word/header1.xml word/document.xml )
      
      def initialize(path)
        @document = Docx::Decoder.to_xml(path)
      end

      def render(data)
        SECTIONS.map do |section|
          cleaned_document = clean(@document.read(section))
          erb_template = build_erb_template(cleaned_document)
          processed_document = render_erb_template(erb_template, data)
          [section, processed_document] 
        end.to_h
      end

      def clean(document)
        document.force_encoding(Encoding::UTF_8) if document.respond_to?(:force_encoding)
        XmlProcessor.clean_variables(document)
      end

      def build_erb_template(document)
        ret = document.gsub(/\{\{%/, '<%=').gsub(/%\}\}/, '%>')
        ret = ret.gsub(/\{\{/, '<%').gsub(/\}\}/, '%>')
        ret
      end

      def render_erb_template(document, data)
        erb_template = ERB.new(document)
        ret = erb_template.result_with_hash(data)
        ret
      end

      # creates xml template keys in input docx (template file)
      def save(path, new_document)
        File.open(path, 'wb') do |f|
          new_document_xml_string = Docx::Encoder.build_new_document_xml(@document, new_document)
          f.write(new_document_xml_string)
        end
        @document.close
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
docx-builder-0.1.11 lib/docx/builder.rb
docx-builder-0.1.8 lib/docx/builder.rb