redmine_api_helper 0.3.24

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of redmine_api_helper might be problematic. Click here for more details.

Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +2 -0
  3. data/.gitignore +11 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE +339 -0
  7. data/README.md +30 -0
  8. data/Rakefile +2 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/lib/date_helper/date.rb +311 -0
  12. data/lib/odf_writer/bookmark.rb +110 -0
  13. data/lib/odf_writer/bookmark_reader.rb +77 -0
  14. data/lib/odf_writer/document.rb +372 -0
  15. data/lib/odf_writer/field.rb +174 -0
  16. data/lib/odf_writer/field_reader.rb +78 -0
  17. data/lib/odf_writer/image.rb +158 -0
  18. data/lib/odf_writer/image_reader.rb +76 -0
  19. data/lib/odf_writer/images.rb +89 -0
  20. data/lib/odf_writer/list_style.rb +331 -0
  21. data/lib/odf_writer/nested.rb +156 -0
  22. data/lib/odf_writer/odf_helper.rb +56 -0
  23. data/lib/odf_writer/parser/default.rb +685 -0
  24. data/lib/odf_writer/path_finder.rb +114 -0
  25. data/lib/odf_writer/section.rb +120 -0
  26. data/lib/odf_writer/section_reader.rb +61 -0
  27. data/lib/odf_writer/style.rb +417 -0
  28. data/lib/odf_writer/table.rb +135 -0
  29. data/lib/odf_writer/table_reader.rb +61 -0
  30. data/lib/odf_writer/template.rb +222 -0
  31. data/lib/odf_writer/text.rb +97 -0
  32. data/lib/odf_writer/text_reader.rb +77 -0
  33. data/lib/odf_writer/version.rb +29 -0
  34. data/lib/redmine_api_helper/api_helper.rb +333 -0
  35. data/lib/redmine_api_helper/args_helper.rb +106 -0
  36. data/lib/redmine_api_helper/attachments_api_helper.rb +52 -0
  37. data/lib/redmine_api_helper/define_api_helpers.rb +78 -0
  38. data/lib/redmine_api_helper/document_categories_api_helper.rb +38 -0
  39. data/lib/redmine_api_helper/groups_api_helper.rb +80 -0
  40. data/lib/redmine_api_helper/helpers.rb +50 -0
  41. data/lib/redmine_api_helper/issue_priorities_api_helper.rb +38 -0
  42. data/lib/redmine_api_helper/issue_relations_api_helper.rb +66 -0
  43. data/lib/redmine_api_helper/issue_statuses_api_helper.rb +36 -0
  44. data/lib/redmine_api_helper/issues_api_helper.rb +124 -0
  45. data/lib/redmine_api_helper/my_account_api_helper.rb +45 -0
  46. data/lib/redmine_api_helper/news_api_helper.rb +73 -0
  47. data/lib/redmine_api_helper/project_memberships_api_helper.rb +77 -0
  48. data/lib/redmine_api_helper/projects_api_helper.rb +73 -0
  49. data/lib/redmine_api_helper/roles_api_helper.rb +52 -0
  50. data/lib/redmine_api_helper/scripts_api_helper.rb +87 -0
  51. data/lib/redmine_api_helper/search_api_helper.rb +38 -0
  52. data/lib/redmine_api_helper/time_entries_api_helper.rb +73 -0
  53. data/lib/redmine_api_helper/time_entry_activities_api_helper.rb +38 -0
  54. data/lib/redmine_api_helper/trackers_api_helper.rb +38 -0
  55. data/lib/redmine_api_helper/users_api_helper.rb +73 -0
  56. data/lib/redmine_api_helper/version.rb +24 -0
  57. data/lib/redmine_api_helper/wiki_pages_api_helper.rb +66 -0
  58. data/lib/redmine_api_helper.rb +88 -0
  59. data/redmine_api_helper.gemspec +35 -0
  60. metadata +148 -0
@@ -0,0 +1,78 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Ruby Gem to create a self populating Open Document Format (.odf) text file.
4
+ #
5
+ # Copyright 2021 Stephan Wenzel <stephan.wenzel@drwpatent.de>
6
+ #
7
+ # This program is free software; you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; either version 2
10
+ # of the License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
+ #
21
+
22
+ module ODFWriter
23
+
24
+ ########################################################################################
25
+ #
26
+ # FieldReader: find all fields and set name
27
+ #
28
+ ########################################################################################
29
+ class FieldReader
30
+
31
+ attr_accessor :name
32
+
33
+ ######################################################################################
34
+ #
35
+ # initialize
36
+ #
37
+ ######################################################################################
38
+ def initialize(opts={})
39
+ @name = opts[:name]
40
+ end #def
41
+
42
+ ######################################################################################
43
+ #
44
+ # paths
45
+ #
46
+ ######################################################################################
47
+ def paths( file, doc)
48
+
49
+ # find nodes with matching field elements matching [FIELD] pattern
50
+ nodes = doc.xpath("//text()").select{|node| scan(node).present? }
51
+
52
+
53
+ # find path for each field
54
+ paths = nil
55
+ nodes.each do |node|
56
+ leaf = {:fields => scan(node)}
57
+ paths = PathFinder.trail(node, leaf, :root => file, :paths => paths)
58
+ end #each
59
+ paths.to_h
60
+
61
+ end #def
62
+
63
+ ######################################################################################
64
+ # private
65
+ ######################################################################################
66
+
67
+ private
68
+
69
+ def scan(node)
70
+ if name
71
+ node.text.scan(/(?<=#{Regexp.escape Field::DELIMITERS[0]})#{name.upcase}(?=#{Regexp.escape Field::DELIMITERS[1]})/)
72
+ else
73
+ node.text.scan(/(?<=#{Regexp.escape Field::DELIMITERS[0]})[A-Z0-9_]+?(?=#{Regexp.escape Field::DELIMITERS[1]})/)
74
+ end
75
+ end #def
76
+
77
+ end #class
78
+ end #module
@@ -0,0 +1,158 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Ruby Gem to create a self populating Open Document Format (.odf) text file.
4
+ #
5
+ # Copyright 2021 Stephan Wenzel <stephan.wenzel@drwpatent.de>
6
+ #
7
+ # This program is free software; you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; either version 2
10
+ # of the License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
+ #
21
+
22
+ module ODFWriter
23
+
24
+ ########################################################################################
25
+ #
26
+ # Image: replace images
27
+ #
28
+ ########################################################################################
29
+ class Image < Field
30
+
31
+ ######################################################################################
32
+ #
33
+ # constants
34
+ #
35
+ ######################################################################################
36
+ IMAGE_DIR_NAME = "Pictures"
37
+
38
+ ######################################################################################
39
+ #
40
+ # replace!
41
+ #
42
+ ######################################################################################
43
+ def replace!(doc, manifest, template, item=nil )
44
+
45
+ image_data = value(item)
46
+
47
+ if is_image?(image_data)
48
+
49
+ # find placeholder image
50
+ nodes = find_image_nodes( doc )
51
+ return if nodes.blank?
52
+
53
+ # find manifest
54
+ man = manifest.xpath("//manifest:manifest") rescue nil
55
+ return if man.blank?
56
+
57
+ # each placeholder image
58
+ nodes.each do |node|
59
+
60
+ # create unique filename for image in .odt file
61
+ path = ::File.join(IMAGE_DIR_NAME, "#{SecureRandom.hex(20).upcase}#{::File.extname(image_data[:filename])}")
62
+ mime = Rack::Mime.mime_type(File.extname(image_data[:filename]))
63
+
64
+ # set path and mime type of placeholder image
65
+ node.attribute('href').value = path
66
+ if node.attribute('mime-type').present?
67
+ node.attribute('mime-type').value = mime
68
+ else
69
+ node.set_attribute('mime-type', mime)
70
+ end
71
+
72
+ # set width and height of placeholder image
73
+ parent = node.parent
74
+ if parent.name == "frame"
75
+ width = parent.attribute('width').value
76
+ height = parent.attribute('height').value
77
+ parent.attribute('height').value = recalc_height(:x => image_data[:width], :y => image_data[:height], :newx => width, :newy => height)
78
+ end
79
+
80
+ # add image to .odt file
81
+ add_image_file( image_data[:bytes], path, mime, doc, man, template )
82
+
83
+ end
84
+ end
85
+
86
+ end #def
87
+
88
+ def self.unique_image_names(doc)
89
+ nodes = doc.xpath("//draw:frame[@draw:name='#{@name}']")
90
+ padding = Math.log10(nodes.length).to_i + 1 if nodes.present?
91
+ nodes.each_with_index do |node, i|
92
+ num = "%.#{padding}i" % i
93
+ node.attribute('name').value = "IMAGE_#{num}_" + node.attribute('name').value
94
+ end
95
+ end #def
96
+
97
+ ######################################################################################
98
+ #
99
+ # private
100
+ #
101
+ ######################################################################################
102
+ private
103
+
104
+ ######################################################################################
105
+ # is_image?
106
+ ######################################################################################
107
+ def is_image?(obj)
108
+ obj.is_a?(Hash) && (obj.keys & [:filename, :width, :height, :bytes]).length == 4
109
+ end #def
110
+
111
+ ######################################################################################
112
+ # find_image_nodes
113
+ ######################################################################################
114
+ def find_image_nodes(doc)
115
+ doc.xpath(".//draw:frame[@draw:name='#{@name}']/draw:image")
116
+ end #def
117
+
118
+ ######################################################################################
119
+ # recalc_height
120
+ ######################################################################################
121
+ def recalc_height(nums)
122
+
123
+ numericals = {}
124
+ dimensions = {}
125
+
126
+ #remove dimensions like 'px' or 'cm' or 'in' or 'pt'
127
+ [:x, :y, :newx, :newy].each do |v|
128
+ num = nums[v].to_s.match(/[0-9.]+/)
129
+ numericals[v] = num[0].to_f if num
130
+ dimensions[v] = nums[v].to_s.gsub(/\A[0-9.]+/, "")
131
+ end
132
+
133
+ if [:x, :y, :newx, :newy].all?{|i| numericals[i].present? }
134
+ y = numericals[:newx] / numericals[:x] * numericals[:y]
135
+ end
136
+
137
+ y ? "#{'%.3f'%y}#{dimensions[:newy]}" : nums[:newy]
138
+
139
+ end #def
140
+
141
+ ######################################################################################
142
+ # add_image_file
143
+ ######################################################################################
144
+ def add_image_file(bytes, path, mime, doc, manifest, template )
145
+
146
+ file_entry = Nokogiri::XML::Node.new('manifest:file-entry', doc)
147
+ file_entry.set_attribute('manifest:full-path', path)
148
+ file_entry.set_attribute('manifest:media-type', mime)
149
+ manifest.children.after file_entry
150
+
151
+ template.output_stream.put_next_entry(path)
152
+ template.output_stream.write bytes
153
+
154
+ end #def
155
+
156
+
157
+ end #class
158
+ end #module
@@ -0,0 +1,76 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Ruby Gem to create a self populating Open Document Format (.odf) text file.
4
+ #
5
+ # Copyright 2021 Stephan Wenzel <stephan.wenzel@drwpatent.de>
6
+ #
7
+ # This program is free software; you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; either version 2
10
+ # of the License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
+ #
21
+
22
+ module ODFWriter
23
+
24
+ ########################################################################################
25
+ #
26
+ # ImageReader: find all images and set name
27
+ #
28
+ ########################################################################################
29
+ class ImageReader
30
+
31
+ attr_accessor :name
32
+
33
+ ######################################################################################
34
+ #
35
+ # initialize
36
+ #
37
+ ######################################################################################
38
+ def initialize(opts)
39
+ @name = opts[:name]
40
+ end #def
41
+
42
+ ######################################################################################
43
+ #
44
+ # get_paths: limit to paths with ancestors 'text '(content.xml) and master-styles (styles.xml)
45
+ #
46
+ ######################################################################################
47
+ def paths( root, doc)
48
+
49
+ # find nodes with matching field elements matching [BOOKMARK] pattern
50
+ nodes = doc.xpath("//draw:frame[draw:image]").select{|node| scan(node).present? }
51
+
52
+ # find path for each field
53
+ paths = nil
54
+ nodes.each do |node|
55
+ leaf = {:images => scan(node)}
56
+ paths = PathFinder.trail(node, leaf, :root => root, :paths => paths)
57
+ end #each
58
+ paths.to_h
59
+
60
+ end #def
61
+
62
+ ######################################################################################
63
+ # private
64
+ ######################################################################################
65
+
66
+ private
67
+
68
+ def scan(node)
69
+ if name
70
+ node.attr("draw:name") == name.upcase ? [node.attr("draw:name")] : []
71
+ else
72
+ [node.attr("draw:name")]
73
+ end
74
+ end #def
75
+ end #class
76
+ end #module
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Ruby Gem to create a self populating Open Document Format (.odf) text file.
4
+ #
5
+ # Copyright 2021 Stephan Wenzel <stephan.wenzel@drwpatent.de>
6
+ #
7
+ # This program is free software; you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; either version 2
10
+ # of the License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
+ #
21
+
22
+ module ODFWriter
23
+
24
+ ########################################################################################
25
+ #
26
+ # Images: replace images
27
+ #
28
+ ########################################################################################
29
+ module Images
30
+
31
+ ######################################################################################
32
+ #
33
+ # constants
34
+ #
35
+ ######################################################################################
36
+ IMAGE_DIR_NAME = "Pictures"
37
+
38
+ ######################################################################################
39
+ #
40
+ # find_image_name_matches
41
+ #
42
+ ######################################################################################
43
+ def find_image_name_matches(content)
44
+
45
+ @images.each_pair do |image_name, img_data|
46
+ if node = content.xpath("//draw:frame[@draw:name='#{image_name}']/draw:image").first
47
+ placeholder_path = node.attribute('href').value
48
+ @image_names_replacements[path] = ::File.join(IMAGE_DIR_NAME, ::File.basename(placeholder_path))
49
+ end
50
+ end
51
+
52
+ end #def
53
+
54
+ ######################################################################################
55
+ #
56
+ # include_image_files
57
+ #
58
+ ######################################################################################
59
+ def include_image_files(file)
60
+
61
+ return if @images.empty?
62
+
63
+ @image_names_replacements.each_pair do |path, template_image|
64
+
65
+ file.output_stream.put_next_entry(template_image)
66
+ file.output_stream.write ::File.read(path)
67
+
68
+ end
69
+
70
+ end #def
71
+
72
+ ######################################################################################
73
+ #
74
+ # avoid_duplicate_image_names
75
+ #
76
+ ######################################################################################
77
+ # newer versions of LibreOffice can't open files with duplicates image names
78
+ def avoid_duplicate_image_names(content)
79
+
80
+ nodes = content.xpath("//draw:frame[@draw:name]")
81
+
82
+ nodes.each_with_index do |node, i|
83
+ node.attribute('name').value = "pic_#{i}"
84
+ end
85
+
86
+ end #def
87
+
88
+ end #class
89
+ end #module
@@ -0,0 +1,331 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Ruby Gem to create a self populating Open Document Format (.odf) text file.
4
+ #
5
+ # Copyright 2021 Stephan Wenzel <stephan.wenzel@drwpatent.de>
6
+ #
7
+ # This program is free software; you can redistribute it and/or
8
+ # modify it under the terms of the GNU General Public License
9
+ # as published by the Free Software Foundation; either version 2
10
+ # of the License, or (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program; if not, write to the Free Software
19
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
+ #
21
+
22
+ module ODFWriter
23
+
24
+ ########################################################################################
25
+ #
26
+ # ListStyle: add style for ul, ol up to 6 levels deep
27
+ #
28
+ ########################################################################################
29
+ class ListStyle
30
+
31
+ ######################################################################################
32
+ #
33
+ # initialize
34
+ #
35
+ ######################################################################################
36
+ def initialize( list_style )
37
+ @list_style = list_style
38
+ @font = {}
39
+ end #def
40
+
41
+ ######################################################################################
42
+ #
43
+ # add_list_style
44
+ #
45
+ ######################################################################################
46
+ def add_list_style( xml )
47
+
48
+ ns = xml.collect_namespaces
49
+ automatic_styles = xml.at("//office:automatic-styles", ns)
50
+ automatic_styles << create_list( xml ) if automatic_styles.present?
51
+
52
+ if @font.present?
53
+ font_declarations = xml.at("//office:font-face-decls", ns)
54
+ font_declarations << create_font( xml ) if font_declarations.present?
55
+ end
56
+
57
+ end #def
58
+
59
+ ######################################################################################
60
+ #
61
+ # private
62
+ #
63
+ ######################################################################################
64
+ private
65
+
66
+ def create_font( xml )
67
+ node = Nokogiri::XML::Node.new('style:font-face', xml)
68
+ node["style:name"] = @font[:font_name]
69
+ node["svg:font-family"] = @font[:font_family]
70
+ node["style:font-family-generic"] = @font[:font_family_generic]
71
+ node["style:font-pitch"] = @font[:font_pitch]
72
+ node
73
+ end #def
74
+
75
+ def create_list( xml )
76
+
77
+ list_style = Nokogiri::XML::Node.new('text:list-style', xml)
78
+
79
+ #
80
+ # common properties
81
+ #
82
+ case @list_style
83
+
84
+ when :ul
85
+ list_style['style:name'] = "ul"
86
+
87
+ #
88
+ # Level 1
89
+ #
90
+ list_bullet = Nokogiri::XML::Node.new('text:list-level-style-bullet', xml)
91
+ list_bullet['text:level'] = "1"
92
+ list_bullet['text:bullet-char'] = "•"
93
+ list_style << list_bullet
94
+
95
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
96
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
97
+ list_bullet << list_level
98
+
99
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
100
+ list_label['text:label-followed-by'] = "listtab"
101
+ list_label['text:list-tab-stop-position'] = "1cm"
102
+ list_label['fo:text-indent'] = "-0.5cm"
103
+ list_label['fo:margin-left'] = "1cm"
104
+ list_level << list_label
105
+
106
+ #
107
+ # Level 2
108
+ #
109
+ list_bullet = Nokogiri::XML::Node.new('text:list-level-style-bullet', xml)
110
+ list_bullet['text:level'] = "2"
111
+ list_bullet['text:bullet-char'] = "◦"
112
+ list_style << list_bullet
113
+
114
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
115
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
116
+ list_bullet << list_level
117
+
118
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
119
+ list_label['text:label-followed-by'] = "listtab"
120
+ list_label['text:list-tab-stop-position'] = "1.5cm"
121
+ list_label['fo:text-indent'] = "-0.5cm"
122
+ list_label['fo:margin-left'] = "1.5cm"
123
+ list_level << list_label
124
+
125
+ #
126
+ # Level 3
127
+ #
128
+ list_bullet = Nokogiri::XML::Node.new('text:list-level-style-bullet', xml)
129
+ list_bullet['text:level'] = "3"
130
+ list_bullet['text:bullet-char'] = "▪"
131
+ list_style << list_bullet
132
+
133
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
134
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
135
+ list_bullet << list_level
136
+
137
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
138
+ list_label['text:label-followed-by'] = "listtab"
139
+ list_label['text:list-tab-stop-position'] = "2cm"
140
+ list_label['fo:text-indent'] = "-0.5cm"
141
+ list_label['fo:margin-left'] = "2cm"
142
+ list_level << list_label
143
+
144
+ #
145
+ # Level 4
146
+ #
147
+ list_bullet = Nokogiri::XML::Node.new('text:list-level-style-bullet', xml)
148
+ list_bullet['text:level'] = "4"
149
+ list_bullet['text:bullet-char'] = "•"
150
+ list_style << list_bullet
151
+
152
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
153
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
154
+ list_bullet << list_level
155
+
156
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
157
+ list_label['text:label-followed-by'] = "listtab"
158
+ list_label['text:list-tab-stop-position'] = "2.5cm"
159
+ list_label['fo:text-indent'] = "-0.5cm"
160
+ list_label['fo:margin-left'] = "2.5cm"
161
+ list_level << list_label
162
+
163
+ #
164
+ # Level 5
165
+ #
166
+ list_bullet = Nokogiri::XML::Node.new('text:list-level-style-bullet', xml)
167
+ list_bullet['text:level'] = "5"
168
+ list_bullet['text:bullet-char'] = "◦"
169
+ list_style << list_bullet
170
+
171
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
172
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
173
+ list_bullet << list_level
174
+
175
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
176
+ list_label['text:label-followed-by'] = "listtab"
177
+ list_label['text:list-tab-stop-position'] = "3cm"
178
+ list_label['fo:text-indent'] = "-0.5cm"
179
+ list_label['fo:margin-left'] = "3cm"
180
+ list_level << list_label
181
+
182
+ #
183
+ # Level 6
184
+ #
185
+ list_bullet = Nokogiri::XML::Node.new('text:list-level-style-bullet', xml)
186
+ list_bullet['text:level'] = "6"
187
+ list_bullet['text:bullet-char'] = "▪"
188
+ list_style << list_bullet
189
+
190
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
191
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
192
+ list_bullet << list_level
193
+
194
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
195
+ list_label['text:label-followed-by'] = "listtab"
196
+ list_label['text:list-tab-stop-position'] = "3.5cm"
197
+ list_label['fo:text-indent'] = "-0.5cm"
198
+ list_label['fo:margin-left'] = "3.5cm"
199
+ list_level << list_label
200
+
201
+ when :ol
202
+ list_style['style:name'] = "ol"
203
+
204
+ #
205
+ # Level 1
206
+ #
207
+ list_number = Nokogiri::XML::Node.new('text:list-level-style-number', xml)
208
+ list_number['text:level'] = "1"
209
+ list_number['style:num-suffix'] = "."
210
+ list_number['style:num-format'] = "1"
211
+ list_style << list_number
212
+
213
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
214
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
215
+ list_number << list_level
216
+
217
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
218
+ list_label['text:label-followed-by'] = "listtab"
219
+ list_label['text:list-tab-stop-position'] = "1cm"
220
+ list_label['fo:text-indent'] = "-0.5cm"
221
+ list_label['fo:margin-left'] = "1cm"
222
+ list_level << list_label
223
+
224
+ #
225
+ # Level 2
226
+ #
227
+ list_number = Nokogiri::XML::Node.new('text:list-level-style-number', xml)
228
+ list_number['text:level'] = "2"
229
+ list_number['style:num-suffix'] = "."
230
+ list_number['style:num-format'] = "1"
231
+ list_style << list_number
232
+
233
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
234
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
235
+ list_number << list_level
236
+
237
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
238
+ list_label['text:label-followed-by'] = "listtab"
239
+ list_label['text:list-tab-stop-position'] = "1.5cm"
240
+ list_label['fo:text-indent'] = "-0.5cm"
241
+ list_label['fo:margin-left'] = "1.5cm"
242
+ list_level << list_label
243
+
244
+ #
245
+ # Level 3
246
+ #
247
+ list_number = Nokogiri::XML::Node.new('text:list-level-style-number', xml)
248
+ list_number['text:level'] = "3"
249
+ list_number['style:num-suffix'] = "."
250
+ list_number['style:num-format'] = "1"
251
+ list_style << list_number
252
+
253
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
254
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
255
+ list_number << list_level
256
+
257
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
258
+ list_label['text:label-followed-by'] = "listtab"
259
+ list_label['text:list-tab-stop-position'] = "2cm"
260
+ list_label['fo:text-indent'] = "-0.5cm"
261
+ list_label['fo:margin-left'] = "2cm"
262
+ list_level << list_label
263
+
264
+ #
265
+ # Level 4
266
+ #
267
+ list_number = Nokogiri::XML::Node.new('text:list-level-style-number', xml)
268
+ list_number['text:level'] = "4"
269
+ list_number['style:num-suffix'] = "."
270
+ list_number['style:num-format'] = "1"
271
+ list_style << list_number
272
+
273
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
274
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
275
+ list_number << list_level
276
+
277
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
278
+ list_label['text:label-followed-by'] = "listtab"
279
+ list_label['text:list-tab-stop-position'] = "2.5cm"
280
+ list_label['fo:text-indent'] = "-0.5cm"
281
+ list_label['fo:margin-left'] = "2.5cm"
282
+ list_level << list_label
283
+
284
+ #
285
+ # Level 5
286
+ #
287
+ list_number = Nokogiri::XML::Node.new('text:list-level-style-number', xml)
288
+ list_number['text:level'] = "5"
289
+ list_number['style:num-suffix'] = "."
290
+ list_number['style:num-format'] = "1"
291
+ list_style << list_number
292
+
293
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
294
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
295
+ list_number << list_level
296
+
297
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
298
+ list_label['text:label-followed-by'] = "listtab"
299
+ list_label['text:list-tab-stop-position'] = "3cm"
300
+ list_label['fo:text-indent'] = "-0.5cm"
301
+ list_label['fo:margin-left'] = "3cm"
302
+ list_level << list_label
303
+
304
+ #
305
+ # Level 6
306
+ #
307
+ list_number = Nokogiri::XML::Node.new('text:list-level-style-number', xml)
308
+ list_number['text:level'] = "6"
309
+ list_number['style:num-suffix'] = "."
310
+ list_number['style:num-format'] = "1"
311
+ list_style << list_number
312
+
313
+ list_level = Nokogiri::XML::Node.new('style:list-level-properties', xml)
314
+ list_level['text:list-level-position-and-space-mode'] = "label-alignment"
315
+ list_number << list_level
316
+
317
+ list_label = Nokogiri::XML::Node.new('style:list-level-label-alignment', xml)
318
+ list_label['text:label-followed-by'] = "listtab"
319
+ list_label['text:list-tab-stop-position'] = "3.5cm"
320
+ list_label['fo:text-indent'] = "-0.5cm"
321
+ list_label['fo:margin-left'] = "3.5cm"
322
+ list_level << list_label
323
+
324
+ end
325
+
326
+ list_style
327
+
328
+ end #def
329
+
330
+ end #class
331
+ end #module