pdfmd 1.9.1 → 2.0.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.
data/pdfmd.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'pdfmd'
3
- s.version = `grep -m 1 VERSION lib/pdfmd.rb | awk -F"'" '{ print $2 '}`
3
+ s.version = `grep -m 1 VERSION bin/pdfmd | awk -F"'" '{ print $2 '}`
4
4
  s.date = Time.now.strftime("%Y-%m-%d").to_s
5
5
  s.summary = "pdfmd - pdf-meta-data management"
6
6
  s.description = <<-EOF
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  Sets common tags like 'author', 'createdate', 'title', 'subject' and 'keywords'
9
9
  and re-uses them for renaming the file with to a human-readable identifier.
10
10
  EOF
11
- s.post_install_message = 'Run `pdfmd` to see the command help.'
11
+ s.post_install_message = '. Run `pdfmd` to see the command help.'
12
12
  s.authors = ['Daniel Roos']
13
13
  s.email = 'pdfmd@micronarrativ.org'
14
14
  s.require_paths = ['lib']
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.executable = 'pdfmd'
18
18
  s.homepage = 'https://github.com/Micronarrativ/ruby-pmd'
19
+ s.metadata = { 'created' => Time.now.strftime("%Y-%m-%d %H:%M:%S"), 'revision' => Time.now.strftime("%Y%m%d%H%M%S") }
19
20
  s.license = 'MIT'
20
21
  s.add_dependency "thor", '~>0.19', '>= 0.19.1'
21
22
  s.add_dependency 'highline', '~>1.7', '>= 1.7.1'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdfmd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Roos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-14 00:00:00.000000000 Z
11
+ date: 2015-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -105,11 +105,9 @@ files:
105
105
  - LICENSE
106
106
  - README.md
107
107
  - Rakefile
108
+ - TODO.mkd
108
109
  - bin/pdfmd
109
110
  - lib/pdfmd.rb
110
- - lib/pdfmd/check.rb
111
- - lib/pdfmd/config.rb
112
- - lib/pdfmd/edit.rb
113
111
  - lib/pdfmd/explain.author.md
114
112
  - lib/pdfmd/explain.createdate.md
115
113
  - lib/pdfmd/explain.csv.md
@@ -120,11 +118,23 @@ files:
120
118
  - lib/pdfmd/explain.rb
121
119
  - lib/pdfmd/explain.subject.md
122
120
  - lib/pdfmd/explain.title.md
121
+ - lib/pdfmd/long_desc.pdfmdconfig.txt
122
+ - lib/pdfmd/long_desc.pdfmdedit.txt
123
+ - lib/pdfmd/long_desc.pdfmdexplain.txt
124
+ - lib/pdfmd/long_desc.pdfmdrename.txt
125
+ - lib/pdfmd/long_desc.pdfmdshow.txt
126
+ - lib/pdfmd/long_desc.pdfmdsort.txt
127
+ - lib/pdfmd/long_desc.pdfmdstat.txt
123
128
  - lib/pdfmd/methods.rb
124
- - lib/pdfmd/rename.rb
125
- - lib/pdfmd/show.rb
126
- - lib/pdfmd/sort.rb
127
- - lib/string_extend.rb
129
+ - lib/pdfmd/pdfmdconfig.rb
130
+ - lib/pdfmd/pdfmdedit.rb
131
+ - lib/pdfmd/pdfmdmethods.rb
132
+ - lib/pdfmd/pdfmdrename.rb
133
+ - lib/pdfmd/pdfmdshow.rb
134
+ - lib/pdfmd/pdfmdsort.rb
135
+ - lib/pdfmd/pdfmdstat.rb
136
+ - lib/pdfmd/string_extend.rb
137
+ - lib/run.rb
128
138
  - pdfmd.gemspec
129
139
  - test/test_default.pdf
130
140
  - test/test_rename.rb
@@ -133,8 +143,10 @@ files:
133
143
  homepage: https://github.com/Micronarrativ/ruby-pmd
134
144
  licenses:
135
145
  - MIT
136
- metadata: {}
137
- post_install_message: Run `pdfmd` to see the command help.
146
+ metadata:
147
+ created: '2015-07-07 08:08:08'
148
+ revision: '20150707080808'
149
+ post_install_message: ". Run `pdfmd` to see the command help."
138
150
  rdoc_options: []
139
151
  require_paths:
140
152
  - lib
data/lib/pdfmd/check.rb DELETED
@@ -1,10 +0,0 @@
1
- filename = ENV.fetch('PDFMD_FILENAME')
2
-
3
- returnvalue = 0
4
- readMetadata(filename).each do|key,value|
5
- if key.match(/author|subject|createdate|title/) and value.empty?
6
- puts 'Missing value: ' + key
7
- returnvalue == 0 ? returnvalue = 1 : ''
8
- end
9
- end
10
- exit returnvalue
data/lib/pdfmd/config.rb DELETED
@@ -1,59 +0,0 @@
1
- #
2
- # == File: config.rb
3
- #
4
- # Show the current default configuration settings
5
- #
6
-
7
- # Options
8
- opt_show = ENV.fetch('PDFMD_SHOW')
9
- opt_command = ENV.fetch('PDFMD_COMMAND').downcase
10
-
11
- require_relative '../string_extend.rb'
12
- require 'yaml'
13
- require 'pp'
14
-
15
- #
16
- # If now options are set,
17
- # show the current settings
18
- if opt_show.blank? or opt_show == 'true'
19
- opt_show = true
20
- end
21
-
22
- # Show the current settings
23
- case opt_show
24
- when true
25
-
26
- # As long as only Hiera is supported as external storage
27
- # for configuration (unless I need it otherwise), read the
28
- # hiera configuration
29
- puts 'Current default configuration:'
30
- puts ''
31
- hieraConfig = eval `hiera pdfmd::config`
32
-
33
- # Show the configuration only for one key
34
- if not opt_command.empty? and
35
-
36
- hieraConfig.has_key?(opt_command)
37
-
38
- puts 'Command: ' + opt_command
39
- puts hieraConfig[opt_command].to_yaml
40
- puts ''
41
-
42
- # Strange key provided. Typo? Anyway: error
43
- elsif not opt_command.empty? and
44
- not hieraConfig.has_key?(opt_command)
45
-
46
- puts "Command '#{opt_command}' not found in default configuration."
47
-
48
- # Show all configuration from Hiera
49
- else
50
-
51
- hieraConfig.sort.each do |key,value|
52
- puts 'Command: ' + key
53
- puts value.to_yaml
54
- puts ''
55
- end
56
-
57
- end
58
-
59
- end
data/lib/pdfmd/edit.rb DELETED
@@ -1,144 +0,0 @@
1
- #
2
- # Thor command 'edit' for changing the common
3
- # ExifTags within the PDF file
4
- # TODO: backup file/path into hiera and options
5
- #
6
-
7
- require_relative '../string_extend'
8
-
9
- filename = ENV.fetch('PDFMD_FILENAME')
10
- optTag = ENV['PDFMD_TAG'] || nil
11
- opt_rename = ENV['PDFMD_RENAME']
12
- pdfmd = ENV['PDFMD']
13
- opt_log = ENV['PDFMD_LOG']
14
- opt_logfile = ENV['PDFMD_LOGFILE']
15
- hieraDefaults = queryHiera('pdfmd::config')
16
-
17
- # Rename or not
18
- if opt_rename == 'true'
19
- opt_rename = true
20
- elsif opt_rename == 'false'
21
- opt_rename = false
22
- elsif (!hieraDefaults.nil? and
23
- !hieraDefaults['edit'].nil? and
24
- ! hieraDefaults['edit']['rename'].nil? and
25
- hieraDefaults['edit']['rename'] == true)
26
- opt_rename = true
27
- else
28
- opt_rename = false
29
- end
30
-
31
- # Define logging state
32
- if (hieraDefaults.nil? or
33
- hieraDefaults['edit'].nil? or
34
- hieraDefaults['edit']['log'].nil? or
35
- !hieraDefaults['edit']['log'] == true ) and
36
- (opt_log == 'false' or opt_log.blank?)
37
-
38
- logenable = false
39
-
40
- else
41
-
42
- logenable = true
43
-
44
- end
45
-
46
- # If logging is enabled, set parameters and create the obkject
47
- if logenable
48
-
49
- if opt_logfile.nil? and
50
- ( hieraDefaults['edit'].nil? or
51
- hieraDefaults['edit']['logfile'].nil? or
52
- hieraDefaults['edit']['logfile'].blank? )
53
-
54
- logfile = Dir.pwd.chomp('/') + '/' + File.basename(ENV['PDFMD'], '.*') + '.log'
55
-
56
- elsif not opt_logfile.nil? and not opt_logfile.blank?
57
-
58
- if File.directory? opt_logfile
59
- abort('Logfile path is a directory. Abort.')
60
- exit 1
61
- end
62
-
63
- logfile = opt_logfile
64
-
65
- elsif (opt_logfile.nil? or opt_logfile.blank?) and
66
- not hieraDefaults['edit']['logfile'].blank?
67
-
68
- logfile = hieraDefaults['edit']['logfile']
69
-
70
- else
71
-
72
- logfile = Dir.pwd.chomp('/') + '/' + File.basename(ENV['PDFMD'], '.*') + '.log'
73
-
74
- end
75
-
76
- $logger = Logger.new(logfile)
77
-
78
- end
79
-
80
- metadata = readMetadata(filename)
81
-
82
- # Set the password for the exiftool if available
83
- if metadata['password'].size > 0
84
- logenable ? $logger.info("#{filename}: Using PDF password to edit metadata.") : ''
85
- exifPdfPassword = "-password '#{metadata['password']}'"
86
- else
87
- exifPdfPassword = ''
88
- end
89
-
90
- if optTag == 'all'
91
- tags = ['author','title','subject','createdate','keywords']
92
- else
93
- tags = optTag.split(',')
94
- end
95
-
96
- tags.each do |currentTag|
97
-
98
- # If the tags contain an '=', set the value for the tag
99
- # automatically. Otherwise enter interactive mode.
100
- if currentTag.match(/\=/)
101
-
102
- tag, value = currentTag.split('=')
103
-
104
- # Include Date identifier
105
- if tag.downcase == 'createdate'
106
- value = identifyDate(value)
107
- end
108
-
109
- logenable ? $logger.info("#{filename}: Setting value for tag '#{tag.downcase}': '#{value}'") : ''
110
-
111
- # Running the exiftool with optional PDF password parameter on the original file
112
- `exiftool #{exifPdfPassword} -#{tag.downcase}='#{value}' -overwrite_original '#{filename}'`
113
-
114
- else
115
-
116
- # Change the tag to something we can use here
117
- puts "Current value: '#{metadata[currentTag.downcase]}'"
118
- answer = readUserInput("Enter new value for #{currentTag} :")
119
- answerCopy = answer
120
- if currentTag.downcase == 'createdate'
121
- while not answer = identifyDate(answer)
122
- logenable ? $logger.warn("${filename}: Invalid date provided: '#{answerCopy}'.") : ''
123
- logenable ? $logger.info("${filename}: Asking for new user provided date.") : ''
124
- puts 'Invalid date format.'
125
- answer = readUserInput("Enter new value for #{currentTag} :")
126
- end
127
- end
128
- puts "Changing value for #{currentTag}: '#{metadata[currentTag]}' => #{answer}"
129
- logenable ? $logger.info("#{filename}: Setting value for tag '#{currentTag.downcase}': '#{answer}'") : ''
130
-
131
- # Running the exiftool with optional PDF password parameter on the original file
132
- `exiftool #{exifPdfPassword} -#{currentTag.downcase}='#{answer}' -overwrite_original '#{filename}'`
133
-
134
- end # If interactive/batch mode
135
- end
136
-
137
- #
138
- # If required, run the renaming task afterwards
139
- # This is not pretty, but seems to be the only way to do this in THOR
140
- #
141
- if opt_rename
142
- logenable ? $logger.info("#{filename}: Trigger file renaming.") : ''
143
- `#{pdfmd} rename '#{filename}'`
144
- end
data/lib/pdfmd/rename.rb DELETED
@@ -1,295 +0,0 @@
1
- #
2
- # Thor command 'rename'
3
- #
4
- require_relative '../string_extend'
5
-
6
- filename = ENV.fetch('PDFMD_FILENAME')
7
- opt_allkeywords = ENV.fetch('PDFMD_ALLKEYWORDS')
8
- outputdir = ENV.fetch('PDFMD_OUTPUTDIR') == 'false' ? false : ENV.fetch('PDFMD_OUTPUTDIR')
9
- dryrun = ENV.fetch('PDFMD_DRYRUN') == 'false' ? false : true
10
- opt_numberKeywords = ENV.fetch('PDFMD_NUMBERKEYWORDS')
11
- opt_copy = ENV.fetch('PDFMD_COPY')
12
- opt_log = ENV.fetch('PDFMD_LOG')
13
- opt_logfile = ENV.fetch('PDFMD_LOGFILE')
14
- hieraDefaults = queryHiera('pdfmd::config')
15
-
16
- if opt_log == 'false'
17
- logenable = false
18
- elsif opt_log == 'true'
19
- logenable = true
20
- elsif opt_log.blank? and
21
- !hieraDefaults.nil? and
22
- !hieraDefaults['rename'].nil? and
23
- !hieraDefaults['rename']['log'].nil? and
24
- hieraDefaults['rename']['log'] == true
25
- logenable = true
26
- else
27
- logenable = true
28
- end
29
-
30
- if logenable
31
-
32
- if opt_logfile.blank? and
33
- (
34
- !hieraDefaults.nil? and
35
- hieraDefaults['rename'].nil? and
36
- (hieraDefaults['rename']['logfile'].nil? or
37
- hieraDefaults['rename']['logfile'].blank?))
38
-
39
- logfile = Dir.pwd.chomp('/') + '/' + File.basename(ENV['PDFMD'], '.*') + '.log'
40
-
41
- elsif not opt_logfile.blank?
42
-
43
- if File.directory? opt_logfile
44
- abort('Logfilepath is a directory. Abort.')
45
- exit 1
46
- end
47
-
48
- logfile = opt_logfile
49
-
50
- elsif opt_logfile.blank? and
51
- !hieraDefaults.nil? and
52
- !hieraDefaults['rename'].nil? and
53
- !hieraDefaults['rename']['logfile'].nil? and
54
- not hieraDefaults['rename']['logfile'].blank?
55
-
56
- logfile = hieraDefaults['rename']['logfile']
57
-
58
- else
59
-
60
- logfile = Dir.pwd.chomp('/') + '/' + File.basename(ENV['PDFMD'], '.*') + '.log'
61
-
62
- end
63
-
64
- $logger = Logger.new(logfile)
65
-
66
- end
67
-
68
- metadata = readMetadata(filename).each do |key,value|
69
-
70
- # Check if the metadata is complete
71
- if key.match(/author|subject|createdate|title/) and value.empty?
72
- puts 'Missing value for ' + key
73
- puts 'Abort'
74
- exit 1
75
- end
76
-
77
- end
78
-
79
-
80
- # Determine the status of allkeywords
81
- # Default value is false
82
- if opt_allkeywords == 'true'
83
- opt_allkeywords = true
84
- elsif opt_allkeywords.blank? and
85
- !hieraDefaults.nil? and
86
- !hieraDefaults['rename'].nil? and
87
- not hieraDefaults['rename']['allkeywords'].nil?
88
-
89
- opt_allkeywords = hieraDefaults['rename']['allkeywords']
90
-
91
- elsif opt_allkeywords == 'false' or
92
- opt_allkeywords.blank?
93
-
94
- opt_allkeywords = false
95
-
96
- end
97
-
98
- #
99
- # Determine the number of keywords
100
- # Default value is 3
101
- if opt_numberKeywords.blank? and
102
- !hieraDefaults.nil? and
103
- !hieraDefaults['rename'].nil? and
104
- !hieraDefaults['rename']['keywords'].nil?
105
-
106
- opt_numberKeywords = hieraDefaults['rename']['keywords']
107
-
108
- elsif opt_numberKeywords.to_i.is_a? Integer and
109
- opt_numberKeywords.to_i > 0
110
-
111
- opt_numberKeywords = opt_numberKeywords.to_i
112
-
113
- else
114
-
115
- opt_numberKeywords = 3
116
-
117
- end
118
-
119
- #
120
- # Determine the status of the copy parameter
121
- if opt_copy.blank? and
122
- !hieraDefaults.nil? and
123
- !hieraDefaults['rename'].nil? and
124
- !hieraDefaults['rename']['copy'].nil?
125
-
126
- opt_copy = hieraDefaults['rename']['copy']
127
-
128
- elsif opt_copy == 'true'
129
-
130
- opt_copy = true
131
-
132
- else
133
-
134
- opt_copy = false
135
-
136
- end
137
-
138
- # Use a default set for the keywords or (if provided) the keywords from hiera
139
- # The default set is only in english
140
- if !hieraDefaults.nil? and
141
- !hieraDefaults['rename'].nil? and
142
- !hieraDefaults['rename']['keys'].nil? and
143
- hieraDefaults['rename']['keys'] != ''
144
-
145
- keymappings = hieraDefaults['rename']['keys']
146
-
147
- else
148
- keymappings = {
149
- 'cno' => ['Customer','Customernumber'],
150
- 'con' => ['Contract'],
151
- 'inf' => ['Information'],
152
- 'inv' => ['Invoice', 'Invoicenumber'],
153
- 'man' => ['Manual'],
154
- 'off' => ['Offer', 'Offernumber'],
155
- 'ord' => ['Order', 'Ordernumber'],
156
- 'rec' => ['Receipt', 'Receiptnumber'],
157
- 'tic' => ['Ticket'],
158
- }
159
- end
160
-
161
-
162
- date = metadata['createdate'].gsub(/\ \d{2}\:\d{2}\:\d{2}.*$/,'').gsub(/\:/,'')
163
- author = metadata['author'].gsub(/\./,'_').gsub(/\&/,'').gsub(/\-/,'').gsub(/\s/,'_').gsub(/\,/,'_').gsub(/\_\_/,'_')
164
- I18n.enforce_available_locales = false
165
- author = I18n.transliterate(author) # Normalising
166
-
167
- keywords_preface = ''
168
- # Determine the document type from the title.
169
-
170
- # Default docment type
171
- if !hieraDefaults.nil? and
172
- !hieraDefaults['rename'].nil? and
173
- !hieraDefaults['rename']['defaultdoctype'].nil? and
174
- hieraDefaults['rename']['defaultdoctype'].empty?
175
-
176
- doktype = hieraDefaults['rename']['defaultdoctype']
177
- else
178
- doktype = 'doc'
179
- end
180
-
181
-
182
- ## Iterate through the keymappings and try to find a matching doktype
183
- keymappings.each do |key,value|
184
- value.kind_of?(String) ? value = value.split : ''
185
- value.each do |keyword|
186
- metadata['title'].match(/#{keyword}/i) ? doktype = key : ''
187
- end
188
- end
189
-
190
- # Set the preface from the doktype
191
- # This must be added to the beginning of the hash when generating
192
- # the filename so it will come first after the doktype
193
- keywords_preface = setKeywordsPreface(metadata,doktype.gsub(/\-/,''))
194
-
195
- if not metadata['keywords'].empty?
196
- keywords = ''
197
- #keywords_preface == '' ? keywords = '' : keywords = keywords_preface
198
- keywordsarray = metadata['keywords'].split(',')
199
-
200
- #
201
- # Sort array
202
- # and replace key-strings with the abbreviations
203
- # in combination with the titel information for the filename
204
- # BTW: When the value is identical with the title, then it should be
205
- # the first keyword IMHO. TODO
206
- keywordssorted = Array.new
207
- keywordsarray.each_with_index do |value,index|
208
- value = value.lstrip.chomp
209
-
210
- # Replace strings for the filename with abbreviations
211
- keymappings.each do |abbreviation,keyvaluesarray|
212
- keyvaluesarray.kind_of?(String) ? keyvaluesarray = keyvaluesarray.split : ''
213
- keyvaluesarray.each do |keystring|
214
- value = value.gsub(/#{keystring.lstrip.chomp} /i, abbreviation.to_s)
215
- end
216
- end
217
-
218
- # Remove special characters from string
219
- value = value.gsub(/\s|\/|\-|\./,'_')
220
-
221
- keywordsarray[index] = value
222
-
223
- # If the current values matches some of the replacement-abbreviations,
224
- # put the keyword on the top of the array to be listed first later on
225
- # in the filename
226
- if value.match(/^#{keymappings.keys.join('|')} /i)
227
- keywordssorted.insert(0, value)
228
- else
229
- keywordssorted.push(value)
230
- end
231
-
232
- end
233
-
234
- # Insert the document preface in the beginning when it's available
235
- if not keywords_preface.empty?
236
- keywordssorted.insert(0, keywords_preface)
237
- end
238
-
239
- # all keywords as a string
240
- if not opt_allkeywords
241
- keywords = keywordssorted.values_at(*(0..opt_numberKeywords-1)).join('-')
242
- else
243
- keywords = keywordssorted.join('-')
244
- end
245
-
246
- # Normalise the keywords as well
247
- I18n.enforce_available_locales = false
248
- keywords = I18n.transliterate(keywords)
249
-
250
- else
251
-
252
- # There are no keywords.
253
- # we are using the title and the subject
254
- keywords_preface != '' ? keywords = keywords_preface : ''
255
-
256
- end
257
-
258
- extension = 'pdf'
259
- if keywords != nil and keywords[0] != '-'
260
- keywords = '-' + keywords
261
- end
262
- newFilename = date + '-' +
263
- author + '-' +
264
- doktype +
265
- keywords + '.' +
266
- extension
267
-
268
- # Output directory checks
269
- if outputdir
270
-
271
- if not File.exist?(outputdir)
272
- puts "Error: output dir '#{outputdir}' not found. Abort."
273
- exit 1
274
- end
275
-
276
- else
277
-
278
- # Try to get the outputdir from hiera
279
- outputdir = (!hieraDefaults.nil? and !hieraDefaults['rename'].nil? and !hieraDefaults['rename']['outputdir'].nil?) ? hieraDefaults['rename']['outputdir'] : File.dirname(filename)
280
-
281
- end
282
-
283
- if not dryrun and filename != newFilename.downcase
284
-
285
- logenable ? $logger.info(filename + ' => ' + outputdir + '/' + newFilename.downcase): ''
286
-
287
- # Copy of me the file to the new name
288
- command = opt_copy ? 'cp' : 'mv'
289
- `#{command} -v '#{filename}' '#{outputdir}/#{newFilename.downcase}'`
290
-
291
- else
292
-
293
- logenable ? $logger.info('Dryrun: ' + filename + ' => ' + outputdir + '/' + newFilename.downcase): ''
294
-
295
- end