pdfmd 1.9.1 → 2.0.0

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