drakkon 0.0.3
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/README.md +50 -0
- data/bin/drakkon +16 -0
- data/lib/drakkon/build.rb +126 -0
- data/lib/drakkon/cli.rb +64 -0
- data/lib/drakkon/gem/bundle.rb +116 -0
- data/lib/drakkon/gem/cli.rb +46 -0
- data/lib/drakkon/gem/configure.rb +73 -0
- data/lib/drakkon/gem/gem.rb +56 -0
- data/lib/drakkon/gem/helpers/check.rb +110 -0
- data/lib/drakkon/gem/helpers/files.rb +57 -0
- data/lib/drakkon/gem/helpers/general.rb +21 -0
- data/lib/drakkon/gem/helpers/modules.rb +51 -0
- data/lib/drakkon/gem/helpers/source.rb +43 -0
- data/lib/drakkon/gem/install.rb +24 -0
- data/lib/drakkon/init.rb +85 -0
- data/lib/drakkon/lib/hub.rb +112 -0
- data/lib/drakkon/lib/images/biggest.rb +43 -0
- data/lib/drakkon/lib/images/blur.rb +76 -0
- data/lib/drakkon/lib/images/bulk_rename.rb +86 -0
- data/lib/drakkon/lib/images/canvas.rb +74 -0
- data/lib/drakkon/lib/images/cli.rb +78 -0
- data/lib/drakkon/lib/images/desaturate.rb +58 -0
- data/lib/drakkon/lib/images/flip_flop.rb +76 -0
- data/lib/drakkon/lib/images/gif.rb +61 -0
- data/lib/drakkon/lib/images/index.rb +185 -0
- data/lib/drakkon/lib/images/list.rb +56 -0
- data/lib/drakkon/lib/images/modulate.rb +69 -0
- data/lib/drakkon/lib/images/resize.rb +83 -0
- data/lib/drakkon/lib/images/roll.rb +68 -0
- data/lib/drakkon/lib/images/rotate.rb +60 -0
- data/lib/drakkon/lib/images/scale.rb +86 -0
- data/lib/drakkon/lib/images/sepia.rb +64 -0
- data/lib/drakkon/lib/images/shift.rb +89 -0
- data/lib/drakkon/lib/images/split.rb +93 -0
- data/lib/drakkon/lib/images/spritesheet.rb +85 -0
- data/lib/drakkon/lib/images/trim.rb +56 -0
- data/lib/drakkon/lib/images/white.rb +56 -0
- data/lib/drakkon/lib/logbot.rb +86 -0
- data/lib/drakkon/lib/manifest.rb +74 -0
- data/lib/drakkon/lib/pastel.rb +49 -0
- data/lib/drakkon/lib/settings.rb +130 -0
- data/lib/drakkon/lib/shims.rb +8 -0
- data/lib/drakkon/lib/version.rb +79 -0
- data/lib/drakkon/release.rb +3 -0
- data/lib/drakkon/run/commands/images.rb +14 -0
- data/lib/drakkon/run/commands/log.rb +57 -0
- data/lib/drakkon/run/commands/restart.rb +14 -0
- data/lib/drakkon/run/helpers.rb +60 -0
- data/lib/drakkon/run/reader_shim.rb +110 -0
- data/lib/drakkon/run/tty.rb +119 -0
- data/lib/drakkon/run.rb +80 -0
- data/lib/drakkon/setup.rb +31 -0
- data/lib/drakkon/skeleton/cli.rb +46 -0
- data/lib/drakkon/skeleton/deploy.rb +105 -0
- data/lib/drakkon/skeleton/helpers/check.rb +143 -0
- data/lib/drakkon/skeleton/helpers/general.rb +21 -0
- data/lib/drakkon/skeleton/helpers/source.rb +43 -0
- data/lib/drakkon/skeleton/install.rb +31 -0
- data/lib/drakkon/skeleton/template.rb +14 -0
- data/lib/drakkon/web.rb +68 -0
- data/lib/drakkon.rb +43 -0
- metadata +302 -0
@@ -0,0 +1,57 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# Gem file manipulation and selection
|
4
|
+
module GemHelpers
|
5
|
+
def select_files
|
6
|
+
data[:files] ||= {}
|
7
|
+
file_edit
|
8
|
+
end
|
9
|
+
|
10
|
+
def file_edit
|
11
|
+
# Select File
|
12
|
+
file = prompt_file
|
13
|
+
file_id = file.to_sym
|
14
|
+
|
15
|
+
if data[:files].key?(file_id) && prompt.yes?("Remove File? #{file.pastel(:bright_blue)}")
|
16
|
+
data[:files].delete file_id
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
# Fine Weight
|
21
|
+
weight = prompt.ask("File: #{file.pastel(:bright_blue)}, What weight?", convert: :integer, default: 10)
|
22
|
+
|
23
|
+
# Datas
|
24
|
+
file_data = {
|
25
|
+
weight:,
|
26
|
+
file:
|
27
|
+
}
|
28
|
+
|
29
|
+
# Save
|
30
|
+
data[:files][file_id] = file_data
|
31
|
+
end
|
32
|
+
|
33
|
+
def path_files
|
34
|
+
Dir["#{data[:path]}/**/*.rb"].map { |x| x.gsub("#{data[:path]}/", '') }
|
35
|
+
end
|
36
|
+
|
37
|
+
def prompt_file
|
38
|
+
prompt.select('Select File:', filter: true, per_page: 25) do |menu|
|
39
|
+
path_files.each do |file|
|
40
|
+
name = if data[:files].key? file.to_sym
|
41
|
+
"#{file.pastel(:bright_blue)} #{'✔'.pastel(:bright_green)}"
|
42
|
+
else
|
43
|
+
file
|
44
|
+
end
|
45
|
+
|
46
|
+
menu.choice name:, value: file
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Return
|
51
|
+
end
|
52
|
+
|
53
|
+
# =============================================================
|
54
|
+
end
|
55
|
+
# =============================================================
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# General Helpers for Gem Class
|
4
|
+
module GemHelpers
|
5
|
+
def prompt
|
6
|
+
TTY::Prompt.new(active_color: :cyan)
|
7
|
+
end
|
8
|
+
|
9
|
+
def read_config
|
10
|
+
@config = JSON.parse(File.read(config_file), { symbolize_names: true })
|
11
|
+
end
|
12
|
+
|
13
|
+
def config_file
|
14
|
+
"#{data[:path]}/drakkon.json"
|
15
|
+
end
|
16
|
+
|
17
|
+
# =============================================================
|
18
|
+
end
|
19
|
+
# =============================================================
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# General Helpers for Gem Class
|
4
|
+
module GemHelpers
|
5
|
+
def select_modules
|
6
|
+
data[:modules] = prompt_modules.map do |selected|
|
7
|
+
modules.find { |x| x[:name] == selected }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def refresh_modules
|
12
|
+
read_config
|
13
|
+
valid_structure?
|
14
|
+
load_modules
|
15
|
+
|
16
|
+
data[:modules] = data[:modules].map(&:name).map do |selected|
|
17
|
+
modules.find { |x| x[:name] == selected }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def prompt_modules
|
22
|
+
prompt.multi_select('Select Modules:', filter: true, per_page: modules.count) do |menu|
|
23
|
+
# menu.default *data[:modules].map(&:name) if data[:modules]
|
24
|
+
# menu.default 'Core - Daemon Core Modules'
|
25
|
+
|
26
|
+
defaults = []
|
27
|
+
|
28
|
+
modules.each do |mod|
|
29
|
+
# Format
|
30
|
+
name = mod.name.pastel(:bright_blue)
|
31
|
+
name += " - #{mod[:description]}".pastel(:bright_black) if mod.key?(:description)
|
32
|
+
|
33
|
+
# Preselect Previous ones if exists
|
34
|
+
defaults.push(name) if data[:modules]&.any? { |x| x[:name] == mod&.name }
|
35
|
+
|
36
|
+
# Choice
|
37
|
+
menu.choice name:, value: mod[:name]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Defaults
|
41
|
+
menu.default(*defaults)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Return
|
45
|
+
end
|
46
|
+
|
47
|
+
# =============================================================
|
48
|
+
end
|
49
|
+
# =============================================================
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# General Helpers for Gem Class
|
4
|
+
module GemHelpers
|
5
|
+
def source_setup
|
6
|
+
@source = source?(args.shift).to_sym
|
7
|
+
|
8
|
+
case source
|
9
|
+
when :local
|
10
|
+
data[:path] = path?(args.shift)
|
11
|
+
# Using Name within package
|
12
|
+
# @id = "#{source}--#{data[:path]}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def source?(source)
|
17
|
+
return source if sources.include?(source)
|
18
|
+
|
19
|
+
prompt.select('Gem Source?', sources, filter: true)
|
20
|
+
end
|
21
|
+
|
22
|
+
def sources
|
23
|
+
[
|
24
|
+
'local'
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
def path?(path)
|
29
|
+
return path unless path.nil?
|
30
|
+
|
31
|
+
loop do
|
32
|
+
dir = prompt.ask('Local Path? (e.g. /data/gem/location)')
|
33
|
+
|
34
|
+
return dir if File.directory?(dir)
|
35
|
+
|
36
|
+
LogBot.fatal('Gem', "Invalid Directory / Not found! #{dir.pastel(:red)}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
# =============================================================
|
40
|
+
end
|
41
|
+
# =============================================================
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# Run Command for CLI
|
4
|
+
module Install
|
5
|
+
def self.opts
|
6
|
+
@opts
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.start(args)
|
10
|
+
gem = Gems::Gem.new
|
11
|
+
gem.intall_setup(args)
|
12
|
+
rescue TTY::Reader::InputInterrupt
|
13
|
+
exit 0
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.prompt
|
17
|
+
TTY::Prompt.new(active_color: :cyan)
|
18
|
+
end
|
19
|
+
|
20
|
+
#=======================================================
|
21
|
+
end
|
22
|
+
#=======================================================
|
23
|
+
end
|
24
|
+
end
|
data/lib/drakkon/init.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
module Drakkon
|
2
|
+
# Run Command for CLI
|
3
|
+
module Init
|
4
|
+
# General Run
|
5
|
+
def self.go!(_raw = nil)
|
6
|
+
if Settings.init?
|
7
|
+
LogBot.info('Init', 'Already Configured!')
|
8
|
+
exit(0)
|
9
|
+
end
|
10
|
+
|
11
|
+
run!
|
12
|
+
rescue SystemExit, Interrupt
|
13
|
+
LogBot.info('Init', 'Exiting')
|
14
|
+
exit
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.run!
|
18
|
+
exit if prompt.no?("Init Drakkon here? #{Dir.pwd.pastel(:yellow)}")
|
19
|
+
LogBot.info('Init', 'Start')
|
20
|
+
settings
|
21
|
+
directories
|
22
|
+
metadata
|
23
|
+
|
24
|
+
# TODO: Validate / Confirm
|
25
|
+
File.write('app/main.rb', main_tick)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.metadata
|
29
|
+
# Icon is required for build
|
30
|
+
FileUtils.cp(metdata_dir('icon.png'), 'metadata/')
|
31
|
+
|
32
|
+
# Copy metdata files
|
33
|
+
FileUtils.cp(metdata_dir('game_metadata.txt'), 'metadata/')
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.metdata_dir(file_name = nil)
|
37
|
+
"#{Run.version_dir}/mygame/metadata/#{file_name}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.settings
|
41
|
+
LogBot.info('Init', 'Settings Setup')
|
42
|
+
|
43
|
+
opts = {
|
44
|
+
platforms: [],
|
45
|
+
version: Hub.version_latest,
|
46
|
+
image_index: true,
|
47
|
+
manifest: true,
|
48
|
+
gems: {}
|
49
|
+
}
|
50
|
+
|
51
|
+
# TODO: Be better, this is lazy...
|
52
|
+
opts.each do |key, value|
|
53
|
+
Settings.update(key, value)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.directories
|
58
|
+
LogBot.info('Init', 'Directories Setup')
|
59
|
+
|
60
|
+
['app', 'fonts', 'metadata', 'fonts', 'sounds', 'sprites', 'app/drakkon'].each do |dir|
|
61
|
+
next if Dir.exist?(dir)
|
62
|
+
|
63
|
+
Dir.mkdir dir
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.main_tick
|
68
|
+
<<~MAIN
|
69
|
+
require 'app/drakkon/bundle.rb'
|
70
|
+
|
71
|
+
def tick(gtk_args)
|
72
|
+
# args.gtk.slowmo! 2
|
73
|
+
# =========================================================
|
74
|
+
end
|
75
|
+
MAIN
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.prompt
|
79
|
+
TTY::Prompt.new(active_color: :cyan)
|
80
|
+
end
|
81
|
+
|
82
|
+
#=======================================================
|
83
|
+
end
|
84
|
+
#=======================================================
|
85
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Drakkon
|
2
|
+
# General Info Helpers
|
3
|
+
module Hub
|
4
|
+
# Ensrue Setup
|
5
|
+
def self.init
|
6
|
+
# rubocop:disable Lint/NonAtomicFileOperation
|
7
|
+
# Ensure Home Directory; It is neccessary stupid rubocop
|
8
|
+
Dir.mkdir(Hub.dir) unless Dir.exist?(Hub.dir)
|
9
|
+
# rubocop:enable Lint/NonAtomicFileOperation
|
10
|
+
|
11
|
+
setup unless File.exist?(config_file)
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.setup
|
15
|
+
LogBot.info('Hub', 'Init Config')
|
16
|
+
opts = config_defaults
|
17
|
+
|
18
|
+
# TODO: Be better, this is lazy...
|
19
|
+
opts.each do |key, value|
|
20
|
+
Hub.update(key, value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.config_defaults
|
25
|
+
{
|
26
|
+
versions: [],
|
27
|
+
skeletons: {}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
# Combine Dir Location
|
32
|
+
def self.dir
|
33
|
+
"#{Dir.home}/.drakkon"
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.config_file
|
37
|
+
"#{dir}/config.json"
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.version?(version)
|
41
|
+
versions.include? version
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.versions
|
45
|
+
config.versions
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.version_latest
|
49
|
+
list = versions.map { |v| v.split('.').map(&:to_i) }
|
50
|
+
latest = list.sort.reverse.max
|
51
|
+
latest.join('.')
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.versions_sorted
|
55
|
+
list = versions.map { |v| v.split('.').map(&:to_i) }
|
56
|
+
list.sort.reverse.map { |v| v.join('.') }
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.version_add(version)
|
60
|
+
config[:versions].push version
|
61
|
+
|
62
|
+
update(:versions, config[:versions])
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.config
|
66
|
+
# Write Default
|
67
|
+
File.write(config_file, Oj.dump({})) unless File.exist?(config_file)
|
68
|
+
|
69
|
+
@config ||= JSON.parse(File.read(config_file), { symbolize_names: true })
|
70
|
+
|
71
|
+
# TODO: Optimize this a bit more
|
72
|
+
config_defaults.each do |key, value|
|
73
|
+
@config[key] ||= value
|
74
|
+
end
|
75
|
+
|
76
|
+
@config
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.update(key, value)
|
80
|
+
config[key] = value
|
81
|
+
write
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.delete(key)
|
85
|
+
config.delete key
|
86
|
+
write
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.write
|
90
|
+
# LogBot.debug('Hub', "Writing Config: #{config_file}")
|
91
|
+
File.write(config_file, Oj.dump(config))
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.log_file
|
95
|
+
"#{dir}/output.log"
|
96
|
+
end
|
97
|
+
|
98
|
+
# =========================
|
99
|
+
# Template Helpers
|
100
|
+
# =========================
|
101
|
+
def self.skeletons?
|
102
|
+
!config.skeletons.empty?
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.skeletons
|
106
|
+
config.skeletons
|
107
|
+
end
|
108
|
+
|
109
|
+
# ======================================================================
|
110
|
+
end
|
111
|
+
# ======================================================================
|
112
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Images
|
3
|
+
# General Image Index Helper
|
4
|
+
module Biggest
|
5
|
+
def self.run!(_args = [])
|
6
|
+
start
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.start
|
10
|
+
index = []
|
11
|
+
LogBot.info('Image Biggest Index')
|
12
|
+
images.each do |img|
|
13
|
+
index.push process(img)
|
14
|
+
end
|
15
|
+
|
16
|
+
w = index.max_by(&:w).w
|
17
|
+
h = index.max_by(&:h).h
|
18
|
+
|
19
|
+
puts "Largest Size is: { w: #{w}, h: #{h} }"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.process(file)
|
23
|
+
# LogBot.info('Image Biggest', file)
|
24
|
+
img = MiniMagick::Image.open(file)
|
25
|
+
|
26
|
+
{
|
27
|
+
w: img.width,
|
28
|
+
h: img.height
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.images
|
33
|
+
Dir["#{Dir.pwd}/**/*.png"]
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.prompt
|
37
|
+
TTY::Prompt.new(active_color: :cyan)
|
38
|
+
end
|
39
|
+
# =========================================================
|
40
|
+
end
|
41
|
+
# =========================================================
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Images
|
3
|
+
# General Image Index Helper
|
4
|
+
module Blur
|
5
|
+
def self.run!(args = [])
|
6
|
+
# Sizing
|
7
|
+
size = if args.empty?
|
8
|
+
prompt.ask('Blur Size? (e.g. 20x20): ', default: '5x5')
|
9
|
+
else
|
10
|
+
args.shift
|
11
|
+
end
|
12
|
+
|
13
|
+
# TODO: Recommend as Options
|
14
|
+
# TODO: Blur Options
|
15
|
+
|
16
|
+
# Potentially Support Custom Filters?
|
17
|
+
filter = if args.empty?
|
18
|
+
'Gaussian'
|
19
|
+
else
|
20
|
+
args.shift
|
21
|
+
end
|
22
|
+
|
23
|
+
puts <<~HELP
|
24
|
+
Usage [size] [filter = Gaussian]
|
25
|
+
- Run in the directory you wish to modify the images
|
26
|
+
- Blurs the images via MiniMagick
|
27
|
+
|
28
|
+
Filter: #{filter} to Size: #{size}
|
29
|
+
Current Directory;
|
30
|
+
#{Dir.pwd.pastel(:yellow)}
|
31
|
+
|
32
|
+
Images:
|
33
|
+
HELP
|
34
|
+
|
35
|
+
images.sort.each do |img|
|
36
|
+
img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
|
37
|
+
puts " - #{img_s}"
|
38
|
+
end
|
39
|
+
puts
|
40
|
+
|
41
|
+
exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Blur!? #{'(Destructive)'.pastel(:red)}"
|
42
|
+
|
43
|
+
start(filter, size)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.start(filter, size)
|
47
|
+
images.each do |img|
|
48
|
+
LogBot.info('Image Blur', img)
|
49
|
+
process(img, filter, size)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.process(file, filter, size)
|
54
|
+
image = MiniMagick::Image.open(file)
|
55
|
+
|
56
|
+
# Ignore if the same
|
57
|
+
return if image.width == size.split('x', 2).first.to_i
|
58
|
+
|
59
|
+
LogBot.info('Image Blur', "Blurring: #{file}")
|
60
|
+
image.filter filter
|
61
|
+
image.blur size
|
62
|
+
image.write file
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.images
|
66
|
+
Dir["#{Dir.pwd}/**/*.png"]
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.prompt
|
70
|
+
TTY::Prompt.new(active_color: :cyan)
|
71
|
+
end
|
72
|
+
# =========================================================
|
73
|
+
end
|
74
|
+
# =========================================================
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Images
|
3
|
+
# This renames png's in a directory to match the index_frame 0..10 etc
|
4
|
+
module BulkRename
|
5
|
+
def self.run!(args = [])
|
6
|
+
args ||= []
|
7
|
+
sort_method = if args.empty?
|
8
|
+
:mtime
|
9
|
+
else
|
10
|
+
args.shift.to_sym
|
11
|
+
end
|
12
|
+
|
13
|
+
# Lazy Safety
|
14
|
+
sort_method = :mtime unless %i[name mtime].include?(sort_method)
|
15
|
+
|
16
|
+
puts <<~HELP
|
17
|
+
Usage [sort_method = mtime, name]
|
18
|
+
- Run in the directory you wish to rename the images (uses mtime)
|
19
|
+
|
20
|
+
Current Directory;
|
21
|
+
#{Dir.pwd.pastel(:yellow)}
|
22
|
+
|
23
|
+
Images:
|
24
|
+
HELP
|
25
|
+
|
26
|
+
list = sorted_images(sort_method)
|
27
|
+
|
28
|
+
list.each do |img|
|
29
|
+
img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
|
30
|
+
puts " - #{img_s}"
|
31
|
+
end
|
32
|
+
puts
|
33
|
+
|
34
|
+
exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Rename!? #{'(Destructive)'.pastel(:red)}"
|
35
|
+
|
36
|
+
start(list)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.start(list)
|
40
|
+
# Create tmp_dir to send stuff too
|
41
|
+
Dir.mktmpdir do |tmp_dir|
|
42
|
+
# Move / rename all out into tmp_dir to avoid clobbering
|
43
|
+
list.each_with_index do |f, i|
|
44
|
+
FileUtils.mv(f, "#{tmp_dir}/#{i}.png")
|
45
|
+
end
|
46
|
+
|
47
|
+
# Move all back
|
48
|
+
Dir["#{tmp_dir}/*.png"].each do |f|
|
49
|
+
FileUtils.mv(f, Dir.pwd)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.sorted_images(sort_method)
|
55
|
+
case sort_method
|
56
|
+
when :mtime then images.sort_by { |x| File.mtime(x) }
|
57
|
+
when :name then images.sort_by { |x| File.basename(x) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.process(file, filter, size)
|
62
|
+
image = MiniMagick::Image.open(file)
|
63
|
+
|
64
|
+
# Ignore if the same for w/h
|
65
|
+
return if image.width == size.split('x', 2).first.to_i && image.height == size.split('x', 2).last.to_i
|
66
|
+
|
67
|
+
LogBot.info('Image Resize', "Resizing: #{file}: #{size}")
|
68
|
+
image.filter filter
|
69
|
+
image.resize size
|
70
|
+
image.write file
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.images
|
74
|
+
# Dir["#{Dir.pwd}/*.png"].sort_by(&:File.basename)
|
75
|
+
|
76
|
+
Dir["#{Dir.pwd}/*.png"].sort_by { |x| File.mtime(x) }
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.prompt
|
80
|
+
TTY::Prompt.new(active_color: :cyan)
|
81
|
+
end
|
82
|
+
# =========================================================
|
83
|
+
end
|
84
|
+
# =========================================================
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Images
|
3
|
+
# General Image Index Helper
|
4
|
+
module Canvas
|
5
|
+
def self.run!(args = [])
|
6
|
+
# Sizing
|
7
|
+
size = if args.empty?
|
8
|
+
prompt.ask('Size? (e.g. 200x200): ')
|
9
|
+
else
|
10
|
+
args.shift
|
11
|
+
end
|
12
|
+
|
13
|
+
gravity = if args.empty?
|
14
|
+
prompt.ask('Gravity? (west,east,north,south): ', default: 'south')
|
15
|
+
else
|
16
|
+
args.shift
|
17
|
+
end
|
18
|
+
|
19
|
+
puts <<~HELP
|
20
|
+
Usage [WxH] [gravity]
|
21
|
+
- Run in the directory you wish to modify the images
|
22
|
+
- Adjust images via MiniMagick (extent)
|
23
|
+
#{' '}
|
24
|
+
|
25
|
+
Canvas: Size: #{size}, Gravity: #{gravity}
|
26
|
+
Current Directory;
|
27
|
+
#{Dir.pwd.pastel(:yellow)}
|
28
|
+
|
29
|
+
Images:
|
30
|
+
HELP
|
31
|
+
|
32
|
+
images.sort.each do |img|
|
33
|
+
img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
|
34
|
+
puts " - #{img_s}"
|
35
|
+
end
|
36
|
+
puts
|
37
|
+
|
38
|
+
exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Canvas!? #{'(Destructive)'.pastel(:red)}"
|
39
|
+
|
40
|
+
start(size, gravity)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.start(size, gravity)
|
44
|
+
images.each do |img|
|
45
|
+
LogBot.info('Image Shift', img)
|
46
|
+
process(img, gravity, size)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.process(file, gravity, size)
|
51
|
+
image = MiniMagick::Image.open(file)
|
52
|
+
LogBot.info('Image Canvas', file)
|
53
|
+
|
54
|
+
img = image.combine_options do |cmd|
|
55
|
+
cmd.gravity gravity
|
56
|
+
cmd.background 'transparent'
|
57
|
+
cmd.extent size
|
58
|
+
end
|
59
|
+
|
60
|
+
img.write file
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.images
|
64
|
+
Dir["#{Dir.pwd}/**/*.png"]
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.prompt
|
68
|
+
TTY::Prompt.new(active_color: :cyan)
|
69
|
+
end
|
70
|
+
# =========================================================
|
71
|
+
end
|
72
|
+
# =========================================================
|
73
|
+
end
|
74
|
+
end
|