subtxt 0.1.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.
- checksums.yaml +7 -0
- data/bin/subtxt +3 -0
- data/lib/subtxt.rb +173 -0
- data/lib/subtxt/version.rb +3 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d499818212c731ddc510e2261c789f828e8a81d9
|
4
|
+
data.tar.gz: 55bb3fef7817cd2d3979dc5bf2a1b33c9ecff1a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a781d64ae1d7fddfa1ad39add43fab6248262b7593fbf83ed6ace1ca55d162f8462744290e8970e394793799cb118245895a581e0e7348a97480c37d6262e02d
|
7
|
+
data.tar.gz: 43407887e5a0613fddfea03310024645651c75424a07bf88fc6dc9e79b35ef9f666838fa23759a516d7b9749480e8509918d82098754532115817ff15f2c3098
|
data/bin/subtxt
ADDED
data/lib/subtxt.rb
ADDED
@@ -0,0 +1,173 @@
|
|
1
|
+
require "subtxt/version"
|
2
|
+
require 'optparse'
|
3
|
+
require 'logger'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
@ingestdir_def = "."
|
7
|
+
@filext_def = "*"
|
8
|
+
@expath_def = "_subtxt/output"
|
9
|
+
|
10
|
+
@options = {}
|
11
|
+
@options[:ingestdir] = @ingestdir_def
|
12
|
+
@options[:filext] = @filext_def
|
13
|
+
@options[:expath] = @expath_def
|
14
|
+
|
15
|
+
@logger = Logger.new(STDOUT)
|
16
|
+
@logger.level = Logger::WARN
|
17
|
+
@logger.formatter = proc do |severity, datetime, progname, msg|
|
18
|
+
"#{severity}: #{msg}\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_patterns pfile
|
22
|
+
records = []
|
23
|
+
File.open(pfile, "r") do |pats|
|
24
|
+
pair = {}
|
25
|
+
rowct = 0
|
26
|
+
pats.each_line do |row|
|
27
|
+
break if row.chomp.downcase == "eof"
|
28
|
+
unless pair['fnd'] and pair['rep']
|
29
|
+
unless pair['fnd']
|
30
|
+
pair['fnd'] = row.chomp
|
31
|
+
else
|
32
|
+
pair['rep'] = row.chomp
|
33
|
+
end
|
34
|
+
else
|
35
|
+
records << pair
|
36
|
+
pair = {}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
return records
|
41
|
+
end
|
42
|
+
|
43
|
+
def subtexts opts
|
44
|
+
patterns = load_patterns(opts[:patterns])
|
45
|
+
@logger.info "Reading patterns from #{@options[:patterns]}"
|
46
|
+
patterns_display = ""
|
47
|
+
patterns.each do |rec|
|
48
|
+
fndsize = rec['fnd'].size
|
49
|
+
fndgap = 90 - fndsize
|
50
|
+
if fndgap > 5
|
51
|
+
gapspaces = " "
|
52
|
+
fndgap.times do gapspaces += "." end
|
53
|
+
else
|
54
|
+
gapspaces = fndgap
|
55
|
+
end
|
56
|
+
patterns_display += "\n#{rec['fnd']}#{gapspaces}=> #{rec['rep']}"
|
57
|
+
end
|
58
|
+
@logger.info "Using patterns:\n#{patterns_display}\n"
|
59
|
+
Dir.glob(opts[:ingestpath]) do |f|
|
60
|
+
text = File.read(f)
|
61
|
+
@logger.debug "Processing file: #{File.basename(f)}"
|
62
|
+
patterns.each do |rec|
|
63
|
+
replace = rec['rep'].gsub(/\\n/, "\n")
|
64
|
+
text.gsub!(/#{rec['fnd']}/, replace)
|
65
|
+
end
|
66
|
+
unless opts[:expext]
|
67
|
+
outfile = File.basename f
|
68
|
+
else
|
69
|
+
fn = File.basename(f,".*")
|
70
|
+
outfile = "#{fn}.#{opts[:expext]}"
|
71
|
+
end
|
72
|
+
begin
|
73
|
+
FileUtils::mkdir_p(opts[:expath]) unless File.exists?(opts[:expath])
|
74
|
+
File.open("#{opts[:expath]}/#{outfile}", 'w') { |file| file.write(text) }
|
75
|
+
@logger.debug "File saved (#{outfile})"
|
76
|
+
rescue Exception => ex
|
77
|
+
raise "Failure: #{ex}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
parser = OptionParser.new do|opts|
|
83
|
+
opts.banner = """
|
84
|
+
Subtxt is a simple utility for matching and replacing patterns in target text.
|
85
|
+
It searches all of the files in a directory (optionally one type at a time)
|
86
|
+
for multiple patterns, each with its own dynamic replcement. Subtxt uses Ruby
|
87
|
+
regular expression (regex) patterns for matching and substituting text.
|
88
|
+
Check out http://refiddle.com/ and http://www.rexegg.com/regex-quickstart.html
|
89
|
+
|
90
|
+
Pattern files are formatted in 3-row sets. The first row is the find pattern,
|
91
|
+
the second row is the replace pattern, and he third row delimits the set for
|
92
|
+
the convenience of your eyeballs. Like so:
|
93
|
+
\t---------------------------------------
|
94
|
+
\tfind pattern
|
95
|
+
\treplace pattern
|
96
|
+
\t
|
97
|
+
\t(pattern|string|content)-(to)-(find)
|
98
|
+
\t$1 $2 replace
|
99
|
+
\t
|
100
|
+
\tregular expression pattern
|
101
|
+
\ttokenized substitute output
|
102
|
+
\t
|
103
|
+
\tEOF
|
104
|
+
\t---------------------------------------\n
|
105
|
+
Usage: subtxt [path/to/ingest/dir] [options]
|
106
|
+
Options:
|
107
|
+
"""
|
108
|
+
|
109
|
+
unless ARGV[0]
|
110
|
+
@logger.error "You must at least provide a patterns file option. For help, use\nsubtxt --help"
|
111
|
+
exit
|
112
|
+
end
|
113
|
+
|
114
|
+
if ARGV[0].split("").first == "-"
|
115
|
+
opts.on('-i', '--ingestdir', "Ingest files from this directory. Defaults to current directory. Superceded if a path is passed as\n\t\t\t\t\tthe first argument (subtxt path/to/files -p patterns.rgx). Ex: -i path/to/ingest/dir") do |n|
|
116
|
+
@options[:ingestdir] = n;
|
117
|
+
end
|
118
|
+
else # the first arg has no leading - or --, it must be our path
|
119
|
+
@options[:ingestdir] = ARGV[0]
|
120
|
+
end
|
121
|
+
|
122
|
+
opts.on('-p PATH', '--patterns PATH', "Full (relative or absolute) path to a text file containing find & replace patterns in the\n\t\t\t\t\tdesignated format. REQUIRED. Ex: -p path/to/patterns.rgxp") do |n|
|
123
|
+
@options[:patterns] = n;
|
124
|
+
end
|
125
|
+
|
126
|
+
## TODO recursion
|
127
|
+
# opts.on('-r', '--recursive', 'Whether to process the input directory recursively (traverse subdirectories).') do
|
128
|
+
# @options[:recursive] = true
|
129
|
+
# end
|
130
|
+
|
131
|
+
opts.on('-f STRING', '--filext STRING', 'Restrict ingested files to this extension. The first dot (.) is implied. Ex: -f htm') do |n|
|
132
|
+
@options[:filext] = n;
|
133
|
+
end
|
134
|
+
|
135
|
+
opts.on('-x PATH', '--expath PATH', 'Location for saving the converted files. Ex: -x processed/files/dir') do |n|
|
136
|
+
@options[:expath] = n;
|
137
|
+
end
|
138
|
+
|
139
|
+
opts.on('--expext STRING', "The export file\'s extension to reassign for all files. The first dot (.) is implied. Defaults to same\n\t\t\t\t\textension as original. Defaults to #{@expath_def} Ex: --expext htm") do |n|
|
140
|
+
@options[:expext] = n;
|
141
|
+
end
|
142
|
+
|
143
|
+
opts.on('--verbose', 'Print INFO level logs to console.') do
|
144
|
+
@options[:verbose] = true
|
145
|
+
end
|
146
|
+
|
147
|
+
opts.on('--debug', 'Print DEBUG (and INFO) level logs to console.') do
|
148
|
+
@options[:debug] = true
|
149
|
+
end
|
150
|
+
|
151
|
+
opts.on('-h', '--help', 'Displays help menu') do
|
152
|
+
puts opts
|
153
|
+
exit
|
154
|
+
end
|
155
|
+
|
156
|
+
opts.on_tail('-v', 'Show Subtxt release version') do
|
157
|
+
puts "You're using Subtxt v#{Subtxt::VERSION}"
|
158
|
+
exit
|
159
|
+
end
|
160
|
+
end
|
161
|
+
parser.parse!
|
162
|
+
|
163
|
+
# options postprocessing
|
164
|
+
@options[:ingestpath] = "#{@options[:ingestdir]}/*.#{@options[:filext]}"
|
165
|
+
if @options[:verbose]
|
166
|
+
@logger.level = Logger::INFO
|
167
|
+
end
|
168
|
+
if @options[:debug]
|
169
|
+
@logger.level = Logger::DEBUG
|
170
|
+
end
|
171
|
+
|
172
|
+
# call the proc
|
173
|
+
subtexts(@options)
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: subtxt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brian Dominick
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: A simple text conversion utility using regular expressions for searching
|
42
|
+
and replacing multiple strings across multiple files, for conversion projects.
|
43
|
+
email:
|
44
|
+
- badominick@gmail.com
|
45
|
+
executables:
|
46
|
+
- subtxt
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- bin/subtxt
|
51
|
+
- lib/subtxt.rb
|
52
|
+
- lib/subtxt/version.rb
|
53
|
+
homepage: https://github.com/DocOps/subtxt
|
54
|
+
licenses: []
|
55
|
+
metadata:
|
56
|
+
allowed_push_host: https://rubygems.org
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 2.4.8
|
74
|
+
signing_key:
|
75
|
+
specification_version: 4
|
76
|
+
summary: A simple utility for converting multiple strings across multiple files, for
|
77
|
+
conversion projects.
|
78
|
+
test_files: []
|