paperless 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +30 -0
- data/bin/CocoaDialog.app/Contents/Info.plist +28 -0
- data/bin/CocoaDialog.app/Contents/MacOS/CocoaDialog +0 -0
- data/bin/CocoaDialog.app/Contents/PkgInfo +1 -0
- data/bin/CocoaDialog.app/Contents/Resources/COPYING +281 -0
- data/bin/CocoaDialog.app/Contents/Resources/Changelog +73 -0
- data/bin/CocoaDialog.app/Contents/Resources/Info.plist +28 -0
- data/bin/CocoaDialog.app/Contents/Resources/InfoPlist.strings +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/Inputbox.nib/classes.nib +51 -0
- data/bin/CocoaDialog.app/Contents/Resources/Inputbox.nib/info.nib +16 -0
- data/bin/CocoaDialog.app/Contents/Resources/Inputbox.nib/keyedobjects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/MainMenu.nib/classes.nib +7 -0
- data/bin/CocoaDialog.app/Contents/Resources/MainMenu.nib/info.nib +21 -0
- data/bin/CocoaDialog.app/Contents/Resources/MainMenu.nib/info.nib.orig +21 -0
- data/bin/CocoaDialog.app/Contents/Resources/MainMenu.nib/objects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/MainMenu.nib/objects.nib.orig +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/Msgbox.nib/classes.nib +27 -0
- data/bin/CocoaDialog.app/Contents/Resources/Msgbox.nib/info.nib +16 -0
- data/bin/CocoaDialog.app/Contents/Resources/Msgbox.nib/keyedobjects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/PopUpButton.nib/classes.nib +55 -0
- data/bin/CocoaDialog.app/Contents/Resources/PopUpButton.nib/info.nib +16 -0
- data/bin/CocoaDialog.app/Contents/Resources/PopUpButton.nib/keyedobjects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/Progressbar.nib/classes.nib +13 -0
- data/bin/CocoaDialog.app/Contents/Resources/Progressbar.nib/info.nib +16 -0
- data/bin/CocoaDialog.app/Contents/Resources/Progressbar.nib/keyedobjects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/SecureInputbox.nib/classes.nib +40 -0
- data/bin/CocoaDialog.app/Contents/Resources/SecureInputbox.nib/info.nib +16 -0
- data/bin/CocoaDialog.app/Contents/Resources/SecureInputbox.nib/keyedobjects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/Textbox.nib/classes.nib +26 -0
- data/bin/CocoaDialog.app/Contents/Resources/Textbox.nib/info.nib +16 -0
- data/bin/CocoaDialog.app/Contents/Resources/Textbox.nib/keyedobjects.nib +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/atom.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/cocoadialog.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/computer.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/document.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/find.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/finder.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/firewire.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/folder.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/gear.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/globe.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/hazard.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/heart.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/hourglass.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/info.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/ipod.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/person.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/sound.icns +0 -0
- data/bin/CocoaDialog.app/Contents/Resources/x.icns +0 -0
- data/bin/openmeta +0 -0
- data/bin/paperless +234 -0
- data/lib/paperless/date_search.rb +96 -0
- data/lib/paperless/engine.rb +220 -0
- data/lib/paperless/ocr_engines/acrobat.rb +51 -0
- data/lib/paperless/ocr_engines/devonthinkpro.rb +26 -0
- data/lib/paperless/ocr_engines/pdfpen.rb +32 -0
- data/lib/paperless/ocr_engines/pdfpenpro.rb +32 -0
- data/lib/paperless/rule.rb +82 -0
- data/lib/paperless/services/devonthinkpro.rb +54 -0
- data/lib/paperless/services/evernote.rb +55 -0
- data/lib/paperless/services/finder.rb +47 -0
- data/lib/paperless/version.rb +3 -0
- data/lib/paperless.rb +14 -0
- data/paperless.rdoc +5 -0
- metadata +233 -0
@@ -0,0 +1,55 @@
|
|
1
|
+
{
|
2
|
+
IBClasses = (
|
3
|
+
{CLASS = CDControl; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
4
|
+
{
|
5
|
+
ACTIONS = {button1Pressed = id; button2Pressed = id; button3Pressed = id; };
|
6
|
+
CLASS = CDInputboxControl;
|
7
|
+
LANGUAGE = ObjC;
|
8
|
+
OUTLETS = {
|
9
|
+
button1 = NSButton;
|
10
|
+
button2 = NSButton;
|
11
|
+
button3 = NSButton;
|
12
|
+
label = NSTextField;
|
13
|
+
panel = NSPanel;
|
14
|
+
textField = NSTextField;
|
15
|
+
};
|
16
|
+
SUPERCLASS = CDControl;
|
17
|
+
},
|
18
|
+
{
|
19
|
+
ACTIONS = {selectionChanged = id; };
|
20
|
+
CLASS = CDPopUpButtonControl;
|
21
|
+
LANGUAGE = ObjC;
|
22
|
+
OUTLETS = {popup = NSPopUpButton; };
|
23
|
+
SUPERCLASS = CDThreeButtonControl;
|
24
|
+
},
|
25
|
+
{
|
26
|
+
ACTIONS = {button1Pressed = id; button2Pressed = id; button3Pressed = id; };
|
27
|
+
CLASS = CDTextboxControl;
|
28
|
+
LANGUAGE = ObjC;
|
29
|
+
OUTLETS = {
|
30
|
+
button1 = NSButton;
|
31
|
+
button2 = NSButton;
|
32
|
+
button3 = NSButton;
|
33
|
+
label = NSTextField;
|
34
|
+
panel = NSPanel;
|
35
|
+
textView = NSTextView;
|
36
|
+
};
|
37
|
+
SUPERCLASS = CDControl;
|
38
|
+
},
|
39
|
+
{
|
40
|
+
ACTIONS = {button1Pressed = id; button2Pressed = id; button3Pressed = id; timeout = id; };
|
41
|
+
CLASS = CDThreeButtonControl;
|
42
|
+
LANGUAGE = ObjC;
|
43
|
+
OUTLETS = {
|
44
|
+
button1 = NSButton;
|
45
|
+
button2 = NSButton;
|
46
|
+
button3 = NSButton;
|
47
|
+
expandingLabel = NSTextField;
|
48
|
+
panel = NSPanel;
|
49
|
+
};
|
50
|
+
SUPERCLASS = CDControl;
|
51
|
+
},
|
52
|
+
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
|
53
|
+
);
|
54
|
+
IBVersion = 1;
|
55
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>IBDocumentLocation</key>
|
6
|
+
<string>120 158 356 240 0 0 1440 878 </string>
|
7
|
+
<key>IBFramework Version</key>
|
8
|
+
<string>443.0</string>
|
9
|
+
<key>IBOpenObjects</key>
|
10
|
+
<array>
|
11
|
+
<integer>5</integer>
|
12
|
+
</array>
|
13
|
+
<key>IBSystem Version</key>
|
14
|
+
<string>8H14</string>
|
15
|
+
</dict>
|
16
|
+
</plist>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{
|
2
|
+
IBClasses = (
|
3
|
+
{CLASS = CDControl; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
4
|
+
{
|
5
|
+
CLASS = CDProgressbarControl;
|
6
|
+
LANGUAGE = ObjC;
|
7
|
+
OUTLETS = {label = NSTextField; panel = NSPanel; progressBar = NSProgressIndicator; };
|
8
|
+
SUPERCLASS = CDControl;
|
9
|
+
},
|
10
|
+
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
|
11
|
+
);
|
12
|
+
IBVersion = 1;
|
13
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>IBDocumentLocation</key>
|
6
|
+
<string>128 15 356 240 0 0 1600 1002 </string>
|
7
|
+
<key>IBFramework Version</key>
|
8
|
+
<string>443.0</string>
|
9
|
+
<key>IBOpenObjects</key>
|
10
|
+
<array>
|
11
|
+
<integer>5</integer>
|
12
|
+
</array>
|
13
|
+
<key>IBSystem Version</key>
|
14
|
+
<string>8F46</string>
|
15
|
+
</dict>
|
16
|
+
</plist>
|
@@ -0,0 +1,40 @@
|
|
1
|
+
{
|
2
|
+
IBClasses = (
|
3
|
+
{CLASS = CDControl; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
4
|
+
{
|
5
|
+
CLASS = CDInputboxControl;
|
6
|
+
LANGUAGE = ObjC;
|
7
|
+
OUTLETS = {textField = NSTextField; };
|
8
|
+
SUPERCLASS = CDThreeButtonControl;
|
9
|
+
},
|
10
|
+
{
|
11
|
+
ACTIONS = {button1Pressed = id; button2Pressed = id; button3Pressed = id; };
|
12
|
+
CLASS = CDTextboxControl;
|
13
|
+
LANGUAGE = ObjC;
|
14
|
+
OUTLETS = {
|
15
|
+
button1 = NSButton;
|
16
|
+
button2 = NSButton;
|
17
|
+
button3 = NSButton;
|
18
|
+
label = NSTextField;
|
19
|
+
panel = NSPanel;
|
20
|
+
textView = NSTextView;
|
21
|
+
};
|
22
|
+
SUPERCLASS = CDControl;
|
23
|
+
},
|
24
|
+
{
|
25
|
+
ACTIONS = {button1Pressed = id; button2Pressed = id; button3Pressed = id; timeout = id; };
|
26
|
+
CLASS = CDThreeButtonControl;
|
27
|
+
LANGUAGE = ObjC;
|
28
|
+
OUTLETS = {
|
29
|
+
button1 = NSButton;
|
30
|
+
button2 = NSButton;
|
31
|
+
button3 = NSButton;
|
32
|
+
expandingLabel = NSTextField;
|
33
|
+
panel = NSPanel;
|
34
|
+
};
|
35
|
+
SUPERCLASS = CDControl;
|
36
|
+
},
|
37
|
+
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
|
38
|
+
);
|
39
|
+
IBVersion = 1;
|
40
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>IBDocumentLocation</key>
|
6
|
+
<string>82 210 356 240 0 0 1440 878 </string>
|
7
|
+
<key>IBFramework Version</key>
|
8
|
+
<string>443.0</string>
|
9
|
+
<key>IBOpenObjects</key>
|
10
|
+
<array>
|
11
|
+
<integer>5</integer>
|
12
|
+
</array>
|
13
|
+
<key>IBSystem Version</key>
|
14
|
+
<string>8H14</string>
|
15
|
+
</dict>
|
16
|
+
</plist>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
{
|
2
|
+
IBClasses = (
|
3
|
+
{CLASS = CDControl; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
4
|
+
{
|
5
|
+
CLASS = CDTextboxControl;
|
6
|
+
LANGUAGE = ObjC;
|
7
|
+
OUTLETS = {textView = NSTextView; };
|
8
|
+
SUPERCLASS = CDThreeButtonControl;
|
9
|
+
},
|
10
|
+
{
|
11
|
+
ACTIONS = {button1Pressed = id; button2Pressed = id; button3Pressed = id; timeout = id; };
|
12
|
+
CLASS = CDThreeButtonControl;
|
13
|
+
LANGUAGE = ObjC;
|
14
|
+
OUTLETS = {
|
15
|
+
button1 = NSButton;
|
16
|
+
button2 = NSButton;
|
17
|
+
button3 = NSButton;
|
18
|
+
expandingLabel = NSTextField;
|
19
|
+
panel = NSPanel;
|
20
|
+
};
|
21
|
+
SUPERCLASS = CDControl;
|
22
|
+
},
|
23
|
+
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
|
24
|
+
);
|
25
|
+
IBVersion = 1;
|
26
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>IBDocumentLocation</key>
|
6
|
+
<string>117 70 356 240 0 0 1440 878 </string>
|
7
|
+
<key>IBFramework Version</key>
|
8
|
+
<string>443.0</string>
|
9
|
+
<key>IBOpenObjects</key>
|
10
|
+
<array>
|
11
|
+
<integer>5</integer>
|
12
|
+
</array>
|
13
|
+
<key>IBSystem Version</key>
|
14
|
+
<string>8H14</string>
|
15
|
+
</dict>
|
16
|
+
</plist>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/bin/openmeta
ADDED
Binary file
|
data/bin/paperless
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gli'
|
3
|
+
require 'yaml'
|
4
|
+
require 'paperless'
|
5
|
+
|
6
|
+
# Set the path to the CocoaDialog.app and openmeta
|
7
|
+
COCOADIALOG = File.dirname(__FILE__) +'/CocoaDialog.app/Contents/MacOS/CocoaDialog'
|
8
|
+
OPENMETA = File.dirname(__FILE__) +'/openmeta'
|
9
|
+
|
10
|
+
include GLI::App
|
11
|
+
|
12
|
+
program_desc 'A command-line interface for Paperless workflows that apply rules in order to auto-sort notes into notebooks/folders.'
|
13
|
+
|
14
|
+
version Paperless::VERSION
|
15
|
+
|
16
|
+
config_file '.paperless.rc'
|
17
|
+
|
18
|
+
desc 'Only print what would be done. Nothing actually gets modified.'
|
19
|
+
switch :simulate, :negatable => false, :default_value => false
|
20
|
+
|
21
|
+
desc 'The name of the app to OCR pdf documents (pdfpen|pdfpenpro|none)'
|
22
|
+
default_value 'none'
|
23
|
+
arg_name 'OCR App'
|
24
|
+
flag :ocr_engine
|
25
|
+
|
26
|
+
desc 'A list of file extenstions that will be treated as text when added to services like Evernote.'
|
27
|
+
default_value 'txt md mmd'
|
28
|
+
arg_name 'Text extensions'
|
29
|
+
flag :text_ext
|
30
|
+
|
31
|
+
desc 'Do not use.'
|
32
|
+
flag :rules
|
33
|
+
|
34
|
+
desc 'The path to a new rules file. If not defined, the global rules from the config file will be used.'
|
35
|
+
arg_name 'Rules file'
|
36
|
+
flag :rules_file
|
37
|
+
|
38
|
+
desc 'The application where the document will be added to.'
|
39
|
+
default_value 'evernote'
|
40
|
+
arg_name 'Services'
|
41
|
+
flag :service
|
42
|
+
|
43
|
+
desc 'The default format for the date when inserted using <date> variable.'
|
44
|
+
default_value '%Y-%m-%d'
|
45
|
+
arg_name 'Date Format'
|
46
|
+
flag :date_format
|
47
|
+
|
48
|
+
desc 'The locale format of the date: "us" or "euro"'
|
49
|
+
default_value 'us'
|
50
|
+
arg_name 'Date Locale'
|
51
|
+
flag :date_locale
|
52
|
+
|
53
|
+
desc 'If the date cannot be discovered within the doucment contents, then use "filedate" or "today" as the default.'
|
54
|
+
default_value 'filedate'
|
55
|
+
arg_name 'Date Default'
|
56
|
+
flag :date_default
|
57
|
+
|
58
|
+
desc 'Default destination to add notes into'
|
59
|
+
default_value 'Inbox'
|
60
|
+
arg_name 'Notebook'
|
61
|
+
flag :destination
|
62
|
+
|
63
|
+
pre do |global_options,command,options,args|
|
64
|
+
# Pre logic here
|
65
|
+
# Return true to proceed; false to abort and not call the
|
66
|
+
# chosen command
|
67
|
+
# Use skips_pre before a command to skip this block
|
68
|
+
# on that command only
|
69
|
+
global_options[:text_ext] = global_options[:text_ext].split
|
70
|
+
|
71
|
+
# Load new rules file is passed
|
72
|
+
if global_options[:rules_file]
|
73
|
+
if File.exists?(File.expand_path global_options[:rules_file])
|
74
|
+
yaml = YAML.load File.expand_path global_options[:rules_file]
|
75
|
+
global_options[:rules] = yaml[:rules]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# puts global_options.inspect
|
80
|
+
true
|
81
|
+
end
|
82
|
+
|
83
|
+
post do |global_options,command,options,args|
|
84
|
+
# Post logic here
|
85
|
+
# Use skips_post before a command to skip this
|
86
|
+
# block on that command only
|
87
|
+
|
88
|
+
# Run Sync if its requested
|
89
|
+
end
|
90
|
+
|
91
|
+
on_error do |exception|
|
92
|
+
# Error logic here
|
93
|
+
# return false to skip default error handling
|
94
|
+
|
95
|
+
puts "There was an error processing the command."
|
96
|
+
true
|
97
|
+
end
|
98
|
+
|
99
|
+
# Assign Command
|
100
|
+
desc 'Edit the configuration file in TextEdit'
|
101
|
+
command :editconfig do |c|
|
102
|
+
|
103
|
+
c.action do |global_options,options,args|
|
104
|
+
system("open -a TextEdit ~/.paperless.rc")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
# Append Command
|
110
|
+
# desc 'Append data to the end of an existing note.'
|
111
|
+
# arg_name 'note_name'
|
112
|
+
# command :append do |c|
|
113
|
+
|
114
|
+
# c.action do |global_options,options,args|
|
115
|
+
|
116
|
+
# end
|
117
|
+
# end
|
118
|
+
|
119
|
+
# Assign Command
|
120
|
+
desc 'Assign a tag to an existing note. (Not yet implemented)'
|
121
|
+
arg_name 'tag_name', :multiple
|
122
|
+
command :assign do |c|
|
123
|
+
|
124
|
+
c.action do |global_options,options,args|
|
125
|
+
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Create Command
|
130
|
+
desc 'Create a new note from a file'
|
131
|
+
arg_name 'file_name'
|
132
|
+
command :create do |c|
|
133
|
+
|
134
|
+
c.desc 'Open a prompt to rename the file before its processed through the rules.'
|
135
|
+
c.switch :prompt, :negatable => false, :default_value => false
|
136
|
+
|
137
|
+
c.desc 'Process the file through the rules.'
|
138
|
+
c.switch :proc_rules, :default_value => true
|
139
|
+
|
140
|
+
c.desc 'Delete the original file after its been imported into the target service.'
|
141
|
+
c.switch :delete, :default_value => true
|
142
|
+
|
143
|
+
c.desc 'OCR the document if it is a PDF'
|
144
|
+
c.switch :ocr, :negatable => false, :default_value => false
|
145
|
+
|
146
|
+
c.action do |global_options,options,args|
|
147
|
+
|
148
|
+
args.each do |file|
|
149
|
+
|
150
|
+
if File.exists?(File.expand_path file)
|
151
|
+
file = File.expand_path file
|
152
|
+
else
|
153
|
+
raise "File does not exist (#{file})"
|
154
|
+
end
|
155
|
+
|
156
|
+
if options[:prompt] && !global_options[:simulate]
|
157
|
+
# Cannot rename the file in simulate mode since we dont want to change the file name
|
158
|
+
file_ext = File.extname(file)
|
159
|
+
filename = File.basename(file, file_ext)
|
160
|
+
user_input = `#{COCOADIALOG} standard-inputbox --title "Paperless Prompt" --informative-text "Rename your file before its processed with rules..." --text "#{filename}" --no-newline --string-output`.split("\n")
|
161
|
+
|
162
|
+
if user_input[0].match(/ok/i) && user_input[1] != File.basename(file, file_ext)
|
163
|
+
new_filename = File.join(File.dirname(file), user_input[1] + file_ext)
|
164
|
+
puts "Renaming file based on input to #{new_filename}"
|
165
|
+
File.rename(file, new_filename)
|
166
|
+
file = new_filename
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
engine = Paperless::Engine.new({
|
171
|
+
:file => file,
|
172
|
+
:ocr_engine => global_options[:ocr_engine],
|
173
|
+
:text_ext => global_options[:text_ext],
|
174
|
+
:default_destination => global_options[:destination],
|
175
|
+
:date_format => global_options[:date_format],
|
176
|
+
:date_locale => global_options[:date_locale],
|
177
|
+
:date_default => global_options[:date_default],
|
178
|
+
:default_service => global_options[:service],
|
179
|
+
:rules => global_options[:rules]
|
180
|
+
})
|
181
|
+
|
182
|
+
file_ext = File.extname(file).gsub(/\./,'')
|
183
|
+
if file_ext == Paperless::PDF_EXT && options[:ocr]
|
184
|
+
puts "OCRing file..."
|
185
|
+
engine.ocr
|
186
|
+
end
|
187
|
+
|
188
|
+
if options[:proc_rules]
|
189
|
+
puts "Processing rules..."
|
190
|
+
engine.process_rules
|
191
|
+
end
|
192
|
+
|
193
|
+
if global_options[:simulate]
|
194
|
+
puts "Simulating changes..."
|
195
|
+
engine.print
|
196
|
+
else
|
197
|
+
puts "Saving #{file} to #{engine.service}"
|
198
|
+
engine.create({:delete => options[:delete]})
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
# Info Command
|
205
|
+
# desc 'Get Evernote account Info'
|
206
|
+
# arg_name 'note_name'
|
207
|
+
# command :info do |c|
|
208
|
+
|
209
|
+
# c.action do |global_options,options,args|
|
210
|
+
|
211
|
+
# end
|
212
|
+
# end
|
213
|
+
|
214
|
+
# Search Command
|
215
|
+
desc 'Search for a note in Evernote and perform actions on them. (Not yet implemented)'
|
216
|
+
arg_name 'note_name'
|
217
|
+
command :search do |c|
|
218
|
+
|
219
|
+
c.action do |global_options,options,args|
|
220
|
+
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# Unassign Command
|
225
|
+
desc 'Remove tags from a note. (Not yet implemented)'
|
226
|
+
arg_name 'note_name'
|
227
|
+
command :unassign do |c|
|
228
|
+
|
229
|
+
c.action do |global_options,options,args|
|
230
|
+
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
exit run(ARGV)
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module DateSearch
|
4
|
+
|
5
|
+
SEP = '\. \/\-\,'
|
6
|
+
DAY = '(\d{1,2})'
|
7
|
+
MONTH = '([a-zA-Z]{3,15})'
|
8
|
+
YEAR = '(\d{4}|\d{2})'
|
9
|
+
END_DATE = '(\s|$)'
|
10
|
+
|
11
|
+
def valid_day(num)
|
12
|
+
day = num.to_i
|
13
|
+
return day <= 31 ? day : nil;
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid_month(num)
|
17
|
+
month = num.to_i
|
18
|
+
return month <= 12 ? month : nil;
|
19
|
+
end
|
20
|
+
|
21
|
+
def valid_year(num)
|
22
|
+
year = num.to_i
|
23
|
+
now = DateTime.now
|
24
|
+
|
25
|
+
if year < 100
|
26
|
+
#transform 2 digit date into 4 digit date
|
27
|
+
now_two_digit_year = now.year - 2000
|
28
|
+
# In the 1900s? Need to add 1900. Else add 2000
|
29
|
+
year += year > now_two_digit_year ? 1900 : 2000
|
30
|
+
end
|
31
|
+
|
32
|
+
# No file can have a date prior to 1970
|
33
|
+
return year > 1970 && year <= now.year ? year : nil;
|
34
|
+
end
|
35
|
+
|
36
|
+
def repair_ocr_string(string)
|
37
|
+
string.downcase!
|
38
|
+
prev = ''
|
39
|
+
new_string = ''
|
40
|
+
|
41
|
+
# I noticed that letters tend to get duplicated during OCR. This tries to fix that.
|
42
|
+
# This only looks at letters since numbers could be duplicated
|
43
|
+
string.each_char {|letter|
|
44
|
+
new_string += letter unless letter == prev && letter.match(/[a-z][A-Z]/)
|
45
|
+
prev = letter
|
46
|
+
}
|
47
|
+
new_string
|
48
|
+
end
|
49
|
+
|
50
|
+
def date_search(text,date_locale)
|
51
|
+
date = nil
|
52
|
+
if match = text.match(/#{MONTH}[#{SEP}]{0,3}#{DAY}[#{SEP}]{1,3}#{YEAR}#{END_DATE}/i)
|
53
|
+
# December 29, 2011
|
54
|
+
if valid_day(match[2]) && valid_year(match[3])
|
55
|
+
puts "Basing the date off the discovered string (1): #{match[0]}"
|
56
|
+
begin
|
57
|
+
date = DateTime.parse(repair_ocr_string(match[0]))
|
58
|
+
rescue
|
59
|
+
puts "WARNING: Unable to create date object. #{$!}"
|
60
|
+
date = nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
elsif match = text.match(/#{DAY}[#{SEP}]{0,3}#{MONTH}[#{SEP}]{0,3}#{YEAR}#{END_DATE}/i)
|
64
|
+
# 29 December 2011
|
65
|
+
if valid_day(match[1]) && valid_year(match[3])
|
66
|
+
puts "Basing the date off the discovered string (2): #{match[0]}"
|
67
|
+
begin
|
68
|
+
date = DateTime.parse(repair_ocr_string(match[0]))
|
69
|
+
rescue
|
70
|
+
puts "WARNING: Unable to create date object. #{$!}"
|
71
|
+
date = nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
elsif match = text.match(/#{DAY}[#{SEP}]+#{DAY}[#{SEP}]+#{YEAR}#{END_DATE}/)
|
75
|
+
# US: 12-29-2011
|
76
|
+
# Euro: 29-12-2011
|
77
|
+
year = valid_year(match[3])
|
78
|
+
day = date_locale == 'us' ? valid_day(match[2]) : valid_day(match[1])
|
79
|
+
month = date_locale == 'us' ? valid_month(match[1]) : valid_month(match[2])
|
80
|
+
|
81
|
+
if month && day && year
|
82
|
+
puts "Basing the date off the discovered string (3): #{match[0]}"
|
83
|
+
begin
|
84
|
+
date = DateTime.new(year,month,day)
|
85
|
+
rescue
|
86
|
+
puts "WARNING: Unable to create date object. #{$!}"
|
87
|
+
date = nil
|
88
|
+
end
|
89
|
+
else
|
90
|
+
puts "WARNING: The discovered date string does not validate: #{match[0]}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
date
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|