docx 0.2.02 → 0.2.03
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +21 -13
- data/lib/docx.rb +1 -1
- data/lib/docx/containers/container.rb +1 -1
- data/lib/docx/containers/paragraph.rb +4 -1
- data/lib/docx/containers/text_run.rb +2 -0
- data/lib/docx/document.rb +40 -7
- data/lib/docx/elements/bookmark.rb +5 -0
- data/lib/docx/elements/element.rb +2 -1
- data/lib/docx/parser.rb +4 -0
- data/lib/docx/version.rb +2 -2
- metadata +2 -3
- metadata.gz.sig +3 -2
- data/lib/docx/test.rb +0 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzIyMTI3NGE3YWNhMjYyMjUzMTZjYWZjMmJkYjU0OGI4ZDg2OTM3MQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZmJjNWZjMzc2OTM4NDFmMTkwNzI2Y2JhM2IwZDE5Mzc0MjY3M2I1Mw==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MmIyZWM4MDJjMjY3NGYzZDUzNjBiYmE2YjllZmNiZTA4NjkyYzE3ODg3ZmFi
|
10
|
+
OTA4YTQ5ZTY2MzA4Mjc5YWI0YjIyYmIyNzFjZjk3ZWZmODQxNWUwMTNlZjNl
|
11
|
+
N2ZiOTUxYzg5ZmYzNzc5MmI3ZjlhZTNiMDY0ZjNmYTE5NzVjOWE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTRhMjAxMmJlODRhOTJhMzM4OGExZGI5NGFiZTdmZDczZmI0N2QyYjQ0ZDhk
|
14
|
+
OGQ0MjlkYWEyNWJlMzhmMGY2ZTFlODVjYmY5MThjM2Q1NzdiOTRkYzlhYjdk
|
15
|
+
OWIxNGJkOWM5MzkzNTFlNzNkN2VkOWEzNmRjOWJhOTMxZWY1OTA=
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -15,14 +15,16 @@ requires ruby (only tested with 1.9.3 so far)
|
|
15
15
|
``` ruby
|
16
16
|
require 'docx'
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
# Create a Docx::Document object for our existing docx file
|
19
|
+
doc = Docx::Document.open('example.docx')
|
20
|
+
|
21
|
+
# Retrieve and display paragraphs
|
22
|
+
doc.paragraphs.each do |p|
|
23
|
+
puts p
|
22
24
|
end
|
23
25
|
|
24
|
-
#
|
25
|
-
|
26
|
+
# Retrieve and display bookmarks, returned as hash with bookmark names as keys and objects as values
|
27
|
+
doc.bookmarks.each_pair do |bookmark_name, bookmark_object|
|
26
28
|
puts bookmark_name
|
27
29
|
end
|
28
30
|
```
|
@@ -32,11 +34,17 @@ end
|
|
32
34
|
``` ruby
|
33
35
|
require 'docx'
|
34
36
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
#
|
39
|
-
|
37
|
+
# Create a Docx::Document object for our existing docx file
|
38
|
+
doc = Docx::Document.open('example.docx')
|
39
|
+
|
40
|
+
# Insert a single line of text after one of our bookmarks
|
41
|
+
doc.bookmarks['example_bookmark'].insert_after("Hello world.")
|
42
|
+
|
43
|
+
# Insert multiple lines of text at our bookmark
|
44
|
+
doc.bookmarks['example_bookmark_2'].insert_multiple_lines_after(['Hello', 'World', 'foo'])
|
45
|
+
|
46
|
+
# Save document to specified path
|
47
|
+
doc.save('example-edited.docx')
|
40
48
|
```
|
41
49
|
|
42
50
|
### advanced
|
@@ -46,12 +54,12 @@ require 'docx'
|
|
46
54
|
|
47
55
|
d = Docx::Document.open('example.docx')
|
48
56
|
|
49
|
-
# The Nokogiri
|
57
|
+
# The Nokogiri::XML::Node on which an element is based can be accessed using #node
|
50
58
|
d.paragraphs.each do |p|
|
51
59
|
puts p.node.inspect
|
52
60
|
end
|
53
61
|
|
54
|
-
# The #xpath and #at_xpath are delegated to the node from the element, saving a step
|
62
|
+
# The #xpath and #at_xpath methods are delegated to the node from the element, saving a step
|
55
63
|
p_element = d.paragraphs.first
|
56
64
|
p_children = p_element.xpath("//child::*") # selects all children
|
57
65
|
p_child = p_element.at_xpath("//child::*") # selects first child
|
data/lib/docx.rb
CHANGED
@@ -17,7 +17,7 @@ module Docx
|
|
17
17
|
@properties_tag = 'pPr'
|
18
18
|
end
|
19
19
|
|
20
|
-
#
|
20
|
+
# Set text of paragraph
|
21
21
|
def text=(content)
|
22
22
|
if text_runs.size == 1
|
23
23
|
text_runs.first.text = content
|
@@ -31,14 +31,17 @@ module Docx
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
# Return text of paragraph
|
34
35
|
def to_s
|
35
36
|
text_runs.map(&:text).join('')
|
36
37
|
end
|
37
38
|
|
39
|
+
# Array of text runs contained within paragraph
|
38
40
|
def text_runs
|
39
41
|
@node.xpath('w:r').map {|r_node| Containers::TextRun.new(r_node) }
|
40
42
|
end
|
41
43
|
|
44
|
+
# Iterate over each text run within a paragraph
|
42
45
|
def each_text_run
|
43
46
|
text_runs.each { |tr| yield(tr) }
|
44
47
|
end
|
@@ -26,6 +26,7 @@ module Docx
|
|
26
26
|
@formatting = parse_formatting || DEFAULT_FORMATTING
|
27
27
|
end
|
28
28
|
|
29
|
+
# Set text of text run
|
29
30
|
def text=(content)
|
30
31
|
if @text_nodes.size == 1
|
31
32
|
@text_nodes.first.content = content
|
@@ -35,6 +36,7 @@ module Docx
|
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
39
|
+
# Returns text contained within text run
|
38
40
|
def parse_text
|
39
41
|
@text_nodes.map(&:content).join('')
|
40
42
|
end
|
data/lib/docx/document.rb
CHANGED
@@ -2,6 +2,19 @@ require 'docx/parser'
|
|
2
2
|
require 'zip/zip'
|
3
3
|
|
4
4
|
module Docx
|
5
|
+
# The Document class wraps around a docx file and provides methods to
|
6
|
+
# interface with it.
|
7
|
+
#
|
8
|
+
# # get a Docx::Document for a docx file in the local directory
|
9
|
+
# doc = Docx::Document.open("test.docx")
|
10
|
+
#
|
11
|
+
# # get the text from the document
|
12
|
+
# puts doc.text
|
13
|
+
#
|
14
|
+
# # do the same thing in a block
|
15
|
+
# Docx::Document.open("test.docx") do |d|
|
16
|
+
# puts d.text
|
17
|
+
# end
|
5
18
|
class Document
|
6
19
|
delegate :paragraphs, :bookmarks, :to => :@parser
|
7
20
|
delegate :doc, :xml, :zip, :to => :@parser
|
@@ -14,25 +27,33 @@ module Docx
|
|
14
27
|
end
|
15
28
|
end
|
16
29
|
|
30
|
+
# With no associated block, Docx::Document.open is a synonym for Docx::Document.new. If the optional code block is given, it will be passed the opened +docx+ file as an argument and the Docx::Document oject will automatically be closed when the block terminates. The values of the block will be returned from Docx::Document.open.
|
31
|
+
# call-seq:
|
32
|
+
# open(filepath) => file
|
33
|
+
# open(filepath) {|file| block } => obj
|
17
34
|
def self.open(path, &block)
|
18
35
|
self.new(path, &block)
|
19
36
|
end
|
20
37
|
|
38
|
+
##
|
39
|
+
# *Deprecated*
|
40
|
+
#
|
41
|
+
# Iterates over paragraphs within document
|
42
|
+
# call-seq:
|
43
|
+
# each_paragraph => Enumerator
|
21
44
|
def each_paragraph
|
22
45
|
paragraphs.each { |p| yield(p) }
|
23
46
|
end
|
24
47
|
|
48
|
+
# call-seq:
|
49
|
+
# to_s -> string
|
25
50
|
def to_s
|
26
51
|
paragraphs.map(&:to_s).join("\n")
|
27
52
|
end
|
28
53
|
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
def update
|
33
|
-
@replace["word/document.xml"] = doc.serialize :save_with => 0
|
34
|
-
end
|
35
|
-
|
54
|
+
# Save document to provided path
|
55
|
+
# call-seq:
|
56
|
+
# save(filepath) => void
|
36
57
|
def save(path)
|
37
58
|
update
|
38
59
|
Zip::ZipOutputStream.open(path) do |out|
|
@@ -50,5 +71,17 @@ module Docx
|
|
50
71
|
end
|
51
72
|
|
52
73
|
alias_method :text, :to_s
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
#--
|
78
|
+
# TODO: Flesh this out to be compatible with other files
|
79
|
+
# TODO: Method to set flag on files that have been edited, probably by inserting something at the
|
80
|
+
# end of methods that make edits?
|
81
|
+
#++
|
82
|
+
def update
|
83
|
+
@replace["word/document.xml"] = doc.serialize :save_with => 0
|
84
|
+
end
|
85
|
+
|
53
86
|
end
|
54
87
|
end
|
@@ -13,16 +13,19 @@ module Docx
|
|
13
13
|
@name = @node['w:name']
|
14
14
|
end
|
15
15
|
|
16
|
+
# Insert text before bookmarkStart node
|
16
17
|
def insert_text_before(text)
|
17
18
|
text_run = get_run_after
|
18
19
|
text_run.text = "#{text}#{text_run.text}"
|
19
20
|
end
|
20
21
|
|
22
|
+
# Insert text after bookmarkStart node
|
21
23
|
def insert_text_after(text)
|
22
24
|
text_run = get_run_before
|
23
25
|
text_run.text = "#{text_run.text}#{text}"
|
24
26
|
end
|
25
27
|
|
28
|
+
# insert multiple lines starting with paragraph containing bookmark node.
|
26
29
|
def insert_multiple_lines(text_array)
|
27
30
|
# Hold paragraphs to be inserted into, corresponding to the index of the strings in the text array
|
28
31
|
paragraphs = []
|
@@ -44,6 +47,7 @@ module Docx
|
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
50
|
+
# Get text run immediately prior to bookmark node
|
47
51
|
def get_run_before
|
48
52
|
# at_xpath returns the first match found and preceding-sibling returns siblings in the
|
49
53
|
# order they appear in the document not the order as they appear when moving out from
|
@@ -58,6 +62,7 @@ module Docx
|
|
58
62
|
end
|
59
63
|
end
|
60
64
|
|
65
|
+
# Get text run immediately after bookmark node
|
61
66
|
def get_run_after
|
62
67
|
if (r_node = @node.at_xpath("./following-sibling::w:r"))
|
63
68
|
Containers::TextRun.new(r_node)
|
@@ -7,6 +7,7 @@ module Docx
|
|
7
7
|
module Element
|
8
8
|
DEFAULT_TAG = ''
|
9
9
|
|
10
|
+
# Ensure that a 'tag' corresponding to the XML element that defines the element is defined
|
10
11
|
def self.included(base)
|
11
12
|
base.extend(ClassMethods)
|
12
13
|
base.const_set(:TAG, Element::DEFAULT_TAG) unless base.const_defined?(:TAG)
|
@@ -20,7 +21,7 @@ module Docx
|
|
20
21
|
@node.at_xpath("./parent::#{type}")
|
21
22
|
end
|
22
23
|
|
23
|
-
#
|
24
|
+
# Get parent paragraph of element
|
24
25
|
def parent_paragraph
|
25
26
|
Elements::Containers::Paragraph.new(parent('w:p'))
|
26
27
|
end
|
data/lib/docx/parser.rb
CHANGED
@@ -6,6 +6,7 @@ require 'zip/zip'
|
|
6
6
|
module Docx
|
7
7
|
class Parser
|
8
8
|
attr_reader :xml, :doc, :zip
|
9
|
+
|
9
10
|
def initialize(path)
|
10
11
|
@zip = Zip::ZipFile.open(path)
|
11
12
|
@xml = @zip.read('word/document.xml')
|
@@ -20,6 +21,7 @@ module Docx
|
|
20
21
|
@doc.xpath('//w:document//w:body//w:p').map { |p_node| parse_paragraph_from p_node }
|
21
22
|
end
|
22
23
|
|
24
|
+
# Returns hash of bookmarks
|
23
25
|
def bookmarks
|
24
26
|
bkmrks_hsh = Hash.new
|
25
27
|
bkmrks_ary = @doc.xpath('//w:bookmarkStart').map { |b_node| parse_bookmark_from b_node }
|
@@ -31,10 +33,12 @@ module Docx
|
|
31
33
|
|
32
34
|
private
|
33
35
|
|
36
|
+
# generate Elements::Containers::Paragraph from paragraph XML node
|
34
37
|
def parse_paragraph_from(p_node)
|
35
38
|
Elements::Containers::Paragraph.new(p_node)
|
36
39
|
end
|
37
40
|
|
41
|
+
# generate Elements::Bookmark from bookmark XML node
|
38
42
|
def parse_bookmark_from(b_node)
|
39
43
|
Elements::Bookmark.new(b_node)
|
40
44
|
end
|
data/lib/docx/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Docx
|
2
|
-
VERSION = '0.2.
|
1
|
+
module Docx #:nodoc:
|
2
|
+
VERSION = '0.2.03'
|
3
3
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.03
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Hunt
|
@@ -38,7 +38,7 @@ cert_chain:
|
|
38
38
|
NEV0UFhmRQpLdFE1SGpuNFVDNTg0R0pyR01haFVnbXhMbmZleXVZWXVZTlFF
|
39
39
|
M1VzVlVQYXl6eGtQVW9DOFZzT0orV1ZmMnMrCkcxL1VkNGRVYkVtOGdRL2J4
|
40
40
|
bDM1TzBBdkhCcz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
|
41
|
-
date: 2013-06-
|
41
|
+
date: 2013-06-08 00:00:00.000000000 Z
|
42
42
|
dependencies:
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: nokogiri
|
@@ -88,7 +88,6 @@ files:
|
|
88
88
|
- lib/docx/elements/text.rb
|
89
89
|
- lib/docx/elements.rb
|
90
90
|
- lib/docx/parser.rb
|
91
|
-
- lib/docx/test.rb
|
92
91
|
- lib/docx/version.rb
|
93
92
|
- lib/docx.rb
|
94
93
|
homepage: https://github.com/chrahunt/docx
|
metadata.gz.sig
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
|
2
|
-
M�
|
1
|
+
����G��`ۼ/�W$���ѣ=�J'��H�1�gS�����ޭ�h!PK�A)d����x{%��YMo8���%��iRtc��fJs���^U8E\����f�`��Hf⇒8:Z�c�� \|68L��&��
|
2
|
+
w�{Pږ�n�9��௨�4�!�\.�{k' �UD�5i�ߛ�إ hL�ĵ��M�����{4��8�Ğ�(ͣ��%c��X��v�|���[�
|
3
|
+
`fj)Xux��H�;XE:Q]�"@���
|
data/lib/docx/test.rb
DELETED