docx-cloner 0.1.1 → 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 +8 -8
- data/README.md +21 -14
- data/docx-examples/test.rb +16 -3
- data/features/dsl.feature +59 -0
- data/features/read.feature +0 -1
- data/features/replace.feature +0 -1
- data/features/steps_define/steps.rb +30 -6
- data/lib/docx/cloner.rb +3 -3
- data/lib/docx/cloner/version.rb +1 -1
- data/lib/docx/dsl.rb +42 -0
- data/spec/cloner_spec.rb +5 -5
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTc0OTQ0ZjIzMTFkNDAzZGU2ODUwZmM3MWM2ZDNlMjQyYTZlNTkwNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDM0MjBmNTg4ZWUzZGVjNWNkNGI4OWYwNjIxODQ1MmY5Y2VmYWRkZg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTY5ODY1Y2Y4ZDYwZDA0NzY5Zjg0NmQ5YzU2Zjk0Mjg3MTA5OGYzNmI3ZDVj
|
10
|
+
ZGUzM2Q0YzM1YzkxMDllMzg3MTFhYzRhZGVjYzU4Y2UzMmE4OWEyNDk2ZjIz
|
11
|
+
MjI5N2JiOTBhMWIxMDZkZWM5YWFhZWMyYWM5ZDNkZDM4ODE3ZGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDQxYmQ0MTY5MWZhMDY3YjAzZGE3OWM5ODdlZDc0YWE2ZmE3ZTg2NzBkNTBh
|
14
|
+
ZmY2YzA2MzVkMWVjZjk3MTA0NTViY2E5MzZmNDE4YmFkMzIzZTcyZDUzNzQ0
|
15
|
+
NWU2OTA1MTljNDJjMDE1NWRiZjAxYWQ0N2U4MTYwYzAxNmYwMTQ=
|
data/README.md
CHANGED
@@ -17,22 +17,29 @@ Or install it yourself as:
|
|
17
17
|
$ gem install docx-cloner
|
18
18
|
|
19
19
|
## Usage
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
sourc_file = 'source.docx'
|
24
|
-
dest_file = 'dest.docx'
|
25
|
-
docx = Docx::Cloner::DocxTool.new sourc_file
|
26
|
-
|
27
|
-
docx.set_single_tag '{Name}', '周大福'
|
20
|
+
* docx_cloner
|
21
|
+
* set_text
|
22
|
+
* set_row_tr
|
28
23
|
|
29
|
-
|
30
|
-
table_data = [["自行车1", "125.00"], ["大卡车1", "256500.00"]]
|
31
|
-
docx.set_row_tags table_title, table_data, 'tr'
|
32
|
-
|
33
|
-
docx.save dest_file
|
34
|
-
docx.release
|
24
|
+
it's so easy to use it with DSL:
|
35
25
|
|
26
|
+
#encoding: utf-8
|
27
|
+
require 'docx/dsl'
|
28
|
+
|
29
|
+
class C
|
30
|
+
include Docx::DSL
|
31
|
+
|
32
|
+
def my_method
|
33
|
+
#template is 'source.docx' and save to 'dest.docx'
|
34
|
+
docx_cloner 'source.docx', 'dest.docx' do
|
35
|
+
#replace the text of '{Name}' in 'source.docx'
|
36
|
+
set_text '{Name}', '周大福'
|
37
|
+
#multi lines replace
|
38
|
+
set_row_tr ["{名称1}", "{00.01}"], [["自行车1", "125.00"], ["大卡车1", "256500.00"]]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
36
43
|
|
37
44
|
## Contributing
|
38
45
|
|
data/docx-examples/test.rb
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
#encoding: utf-8
|
2
|
-
require 'docx/
|
2
|
+
require 'docx/dsl'
|
3
3
|
|
4
|
+
<<-ABC
|
4
5
|
sourc_file = 'source.docx'
|
5
6
|
dest_file = 'dest.docx'
|
6
7
|
docx = Docx::Cloner::DocxTool.new sourc_file
|
7
8
|
|
8
|
-
docx.
|
9
|
+
docx.set_text_tag '{Name}', '周大福'
|
9
10
|
|
10
11
|
table_title = ["{名称1}", "{00.01}"]
|
11
12
|
table_data = [["自行车1", "125.00"], ["大卡车1", "256500.00"]]
|
12
13
|
docx.set_row_tags table_title, table_data, 'tr'
|
13
14
|
|
14
15
|
docx.save dest_file
|
15
|
-
docx.release
|
16
|
+
docx.release
|
17
|
+
|
18
|
+
ABC
|
19
|
+
##################
|
20
|
+
|
21
|
+
extend Docx::DSL
|
22
|
+
docx_cloner 'source.docx', 'dest.docx' do
|
23
|
+
set_text '{Name}', '周大福'
|
24
|
+
set_row 'tr' do |t|
|
25
|
+
t[:tags] = ["{名称1}", "{00.01}"]
|
26
|
+
t[:data] = [["自行车1", "125.00"], ["大卡车1", "256500.00"]]
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
#language: zh-CN
|
2
|
+
|
3
|
+
功能: 支持DSL用法
|
4
|
+
允许在ruby代码中使用类似的DSL语法来指定docx标签替换操作:
|
5
|
+
"""
|
6
|
+
extend 'Docx::DSL'
|
7
|
+
docx_cloner 'source.docx', 'dest.docx' do
|
8
|
+
set_text '{Name}', '周大福'
|
9
|
+
set_row 'tr' do |t|
|
10
|
+
t[:tags] = ["{名称1}", "{00.01}"]
|
11
|
+
t[:data] = [["自行车1", "125.00"], ["大卡车1", "256500.00"]]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
"""
|
15
|
+
其中:
|
16
|
+
1、需要用include或extend包含 'Docx::DSL'
|
17
|
+
2、docx_cloner,是指定过程容器,'source_docx'是模板文件,'dest.docx'是要保存的目标文件。
|
18
|
+
3、set_text,可以将独立的文字标签替换,如'{Name}'替换为'周大福'
|
19
|
+
4、set_row,可以按照一行内的标签模板,根据指定数据集生成多行文字,t[:tags]为标签数组,t[:data]为被替换的二维数组
|
20
|
+
|
21
|
+
背景: 被替换的源文件
|
22
|
+
假如"docx-examples"示例文件夹中存在一个"source.docx"的文件
|
23
|
+
而且"docx-examples/dest.docx"这个目标文件已经被清除
|
24
|
+
而且要求使用DSL语法
|
25
|
+
|
26
|
+
|
27
|
+
场景大纲: 1、使用DSL,简单替换单个文字标签
|
28
|
+
这是最简单的情形,例如将标签{name},替换为真正的姓名。
|
29
|
+
|
30
|
+
假如程序使用DSL语法将目标文件中的"<tagname>"替换为"<value>"
|
31
|
+
那么应该生成目标文件
|
32
|
+
而且被目标文件中应该包含"<value>"这个标签词
|
33
|
+
|
34
|
+
例子: 替换单个标签的几种情况
|
35
|
+
|
36
|
+
| tagname | value |
|
37
|
+
| {name} | 周大福 |
|
38
|
+
| {Name} | 周大福 |
|
39
|
+
| {NAME} | 周大福 |
|
40
|
+
| {{名字}} | 周大福 |
|
41
|
+
| $名字$ | 周大福 |
|
42
|
+
|
43
|
+
@wip
|
44
|
+
场景: 2、使用DSL,替换表格行数据
|
45
|
+
按行数据替换表格内容是常见的应用
|
46
|
+
|
47
|
+
假如有这样一组数据:
|
48
|
+
| {名称1} | {00.01} |
|
49
|
+
| 自行车 | 256.00 |
|
50
|
+
| 小汽车 | 125600.00 |
|
51
|
+
| 大卡车 | 256000.00 |
|
52
|
+
| 电视机 | 6999.00 |
|
53
|
+
| 洗衣机 | 3488.00 |
|
54
|
+
|
55
|
+
当程序使用DSL,将表中第1行作为标签名,第2行以后作为行数据替换
|
56
|
+
那么应该生成目标文件
|
57
|
+
而且被目标文件中应该包含被替换的第2行以后的数据
|
58
|
+
|
59
|
+
|
data/features/read.feature
CHANGED
data/features/replace.feature
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
lib = File.expand_path('../../../lib', __FILE__)
|
3
|
+
puts lib
|
3
4
|
require "#{lib}/docx/cloner"
|
4
5
|
#require 'fileutils'
|
6
|
+
require "#{lib}/docx/dsl"
|
7
|
+
|
5
8
|
|
6
9
|
假如(/^"(.*?)"示例文件夹中存在一个"(.*?)"的文件$/) do |folder, file|
|
7
10
|
@source_filename = File.expand_path "#{folder}/#{file}"
|
@@ -11,7 +14,7 @@ end
|
|
11
14
|
|
12
15
|
那么(/^程序应该能读到"(.*?)"这个标签词$/) do |tag_name|
|
13
16
|
docx = Docx::Cloner::DocxTool.new @source_filename
|
14
|
-
result = docx.
|
17
|
+
result = docx.include_text_tag? tag_name
|
15
18
|
docx.release
|
16
19
|
result.should be_true
|
17
20
|
end
|
@@ -25,7 +28,7 @@ end
|
|
25
28
|
|
26
29
|
假如(/^程序将目标文件中的"(.*?)"替换为"(.*?)"$/) do |tag, value|
|
27
30
|
docx = Docx::Cloner::DocxTool.new @source_filename
|
28
|
-
result = docx.
|
31
|
+
result = docx.set_text_tag tag, value
|
29
32
|
docx.save @dest_filename
|
30
33
|
docx.release
|
31
34
|
result.should be_true
|
@@ -37,7 +40,7 @@ end
|
|
37
40
|
|
38
41
|
而且(/^被目标文件中应该包含"(.*?)"这个标签词$/) do |value|
|
39
42
|
docx = Docx::Cloner::DocxTool.new @dest_filename
|
40
|
-
result = docx.
|
43
|
+
result = docx.include_text_tag? value
|
41
44
|
docx.release
|
42
45
|
result.should be_true
|
43
46
|
end
|
@@ -50,7 +53,7 @@ end
|
|
50
53
|
result = true
|
51
54
|
docx = Docx::Cloner::DocxTool.new @source_filename
|
52
55
|
@data.each do |row|
|
53
|
-
result &= docx.
|
56
|
+
result &= docx.set_text_tag row[0], row[1]
|
54
57
|
end
|
55
58
|
docx.save @dest_filename
|
56
59
|
docx.release
|
@@ -61,7 +64,7 @@ end
|
|
61
64
|
result = true
|
62
65
|
docx = Docx::Cloner::DocxTool.new @dest_filename
|
63
66
|
@data.each do |row|
|
64
|
-
result &= docx.
|
67
|
+
result &= docx.include_text_tag? row[1]
|
65
68
|
end
|
66
69
|
docx.release
|
67
70
|
result.should be_true
|
@@ -84,9 +87,30 @@ end
|
|
84
87
|
docx = Docx::Cloner::DocxTool.new @dest_filename
|
85
88
|
@data[1..-1].each do |row|
|
86
89
|
row.each do |value|
|
87
|
-
result &= docx.
|
90
|
+
result &= docx.include_text_tag? value
|
88
91
|
end
|
89
92
|
end
|
90
93
|
docx.release
|
91
94
|
result.should be_true
|
95
|
+
end
|
96
|
+
|
97
|
+
假如(/^要求使用DSL语法$/) do
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
假如(/^程序使用DSL语法将目标文件中的"(.*?)"替换为"(.*?)"$/) do |tag, value|
|
102
|
+
#定义一个DSL的执行环境
|
103
|
+
extend Docx::DSL
|
104
|
+
docx_cloner @source_filename, @dest_filename do
|
105
|
+
set_text tag, value
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
当(/^程序使用DSL,将表中第1行作为标签名,第2行以后作为行数据替换$/) do
|
110
|
+
#定义一个DSL的执行环境
|
111
|
+
extend Docx::DSL
|
112
|
+
docx_cloner @source_filename, @dest_filename do
|
113
|
+
#set_row @data.first, @data[1..-1], 'tr'
|
114
|
+
set_row_tr @data.first, @data[1..-1]
|
115
|
+
end
|
92
116
|
end
|
data/lib/docx/cloner.rb
CHANGED
@@ -40,7 +40,7 @@ module Docx
|
|
40
40
|
end
|
41
41
|
|
42
42
|
|
43
|
-
def
|
43
|
+
def include_text_tag?(tag)
|
44
44
|
@global_paragraph.each do |p|
|
45
45
|
if p[:text_content].include? tag
|
46
46
|
return true
|
@@ -49,7 +49,7 @@ module Docx
|
|
49
49
|
return false
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
52
|
+
def read_text_tag_xml(tag)
|
53
53
|
@global_paragraph.each do |p|
|
54
54
|
if p[:text_content].include? tag
|
55
55
|
from = p[:text_content].index tag
|
@@ -75,7 +75,7 @@ module Docx
|
|
75
75
|
end
|
76
76
|
|
77
77
|
#替换单个标签为指定值
|
78
|
-
def
|
78
|
+
def set_text_tag tag, value
|
79
79
|
replace_tag tag, value
|
80
80
|
end
|
81
81
|
|
data/lib/docx/cloner/version.rb
CHANGED
data/lib/docx/dsl.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require 'docx/cloner'
|
3
|
+
|
4
|
+
module Docx
|
5
|
+
module DSL
|
6
|
+
lambda{
|
7
|
+
docx = nil
|
8
|
+
define_method :set_text do |tag, value|
|
9
|
+
#puts "#set_text: #{tag}, #{value}"
|
10
|
+
docx.set_text_tag tag, value
|
11
|
+
end
|
12
|
+
|
13
|
+
define_method :set_row do |tags, data, type|
|
14
|
+
#puts "#set_row_#{type}"
|
15
|
+
#puts "tags: #{tags}"
|
16
|
+
#puts "data: #{data}"
|
17
|
+
docx.set_row_tags tags, data, type
|
18
|
+
end
|
19
|
+
|
20
|
+
define_method :docx_cloner do |source, dest, &b|
|
21
|
+
docx = Docx::Cloner::DocxTool.new source
|
22
|
+
#return unless block_given?
|
23
|
+
#puts 'start dsl'
|
24
|
+
b.call self
|
25
|
+
#puts 'end dsl'
|
26
|
+
|
27
|
+
docx.save dest
|
28
|
+
docx.release
|
29
|
+
end
|
30
|
+
}.call
|
31
|
+
|
32
|
+
def method_missing name, *args
|
33
|
+
puts "name: #{name}"
|
34
|
+
puts "args: #{args}"
|
35
|
+
/set_row_(.+)/.match name do
|
36
|
+
return set_row *(args << $1) if $1
|
37
|
+
end
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
data/spec/cloner_spec.rb
CHANGED
@@ -10,18 +10,18 @@ module Docx
|
|
10
10
|
end
|
11
11
|
context "#include_single_tag?" do
|
12
12
|
it "读取'$名字$'标签" do
|
13
|
-
result = @docx.
|
13
|
+
result = @docx.include_text_tag? "$名字$"
|
14
14
|
result.should be_true
|
15
15
|
end
|
16
16
|
it "读取'{Name}'标签" do
|
17
|
-
result = @docx.
|
17
|
+
result = @docx.include_text_tag? "{Name}"
|
18
18
|
result.should be_true
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
context "#read_single_tags_xml" do
|
23
23
|
it "读取'{name}'的xml标签'<w:r>',应该是" do
|
24
|
-
result = @docx.
|
24
|
+
result = @docx.read_text_tag_xml "{name}"
|
25
25
|
result.should == <<-HERE
|
26
26
|
<w:r w:rsidR="000F595B">
|
27
27
|
<w:rPr>
|
@@ -65,11 +65,11 @@ module Docx
|
|
65
65
|
context "#set_single_tag" do
|
66
66
|
it "设置单个标签{Name}" do
|
67
67
|
value = '周大福'
|
68
|
-
@source_docx.
|
68
|
+
@source_docx.set_text_tag '{Name}', value
|
69
69
|
@source_docx.save @dest_file
|
70
70
|
|
71
71
|
dest = DocxTool.new @dest_file
|
72
|
-
result = dest.
|
72
|
+
result = dest.include_text_tag? value
|
73
73
|
dest.release
|
74
74
|
result.should be_true
|
75
75
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docx-cloner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- homeway
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -57,11 +57,13 @@ files:
|
|
57
57
|
- docx-examples/source.docx
|
58
58
|
- docx-examples/test.rb
|
59
59
|
- docx-examples/wp.xml
|
60
|
+
- features/dsl.feature
|
60
61
|
- features/read.feature
|
61
62
|
- features/replace.feature
|
62
63
|
- features/steps_define/steps.rb
|
63
64
|
- lib/docx/cloner.rb
|
64
65
|
- lib/docx/cloner/version.rb
|
66
|
+
- lib/docx/dsl.rb
|
65
67
|
- spec/cloner_spec.rb
|
66
68
|
- spec/spec_helper.rb
|
67
69
|
homepage: ''
|
@@ -89,6 +91,7 @@ signing_key:
|
|
89
91
|
specification_version: 4
|
90
92
|
summary: generate docx file with tags
|
91
93
|
test_files:
|
94
|
+
- features/dsl.feature
|
92
95
|
- features/read.feature
|
93
96
|
- features/replace.feature
|
94
97
|
- features/steps_define/steps.rb
|