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