docx 0.2.02 → 0.2.03
Sign up to get free protection for your applications and to get access to all the features.
- 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