zenml-slide 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/source/zenml/slide.rb +17 -0
- data/source/zenml/slide/converter.rb +189 -0
- metadata +75 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '09ffc8ce977c18086776bae46f104cf501ecc199b07da17130a2a4449d89bfad'
|
4
|
+
data.tar.gz: 58a16ab6b6810aea461156e02ddfcb005bc3bdd208583568a58b2d7a8649021d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2bdf8c46b02a64a23fa2b01c946e7c5a1e9a94eea60098f642a33e57de3267eabe3933530371609f6199461bc62f78f57edb712cb8ec0cdbeda83d95292719f9
|
7
|
+
data.tar.gz: 6008043f2aad0e21ce747c4ac9b5914b8f968e5c5aed39202ca8a487249ec3e65b8707d363b0b0d33043e7a70f1a89c59c740763fdc9a1c305c994df86232e1c
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module Zenithal::Slide
|
5
|
+
|
6
|
+
VERSION = "1.0.0"
|
7
|
+
VERSION_ARRAY = VERSION.split(/\./).map(&:to_i)
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
require 'fileutils'
|
13
|
+
require 'open3'
|
14
|
+
require 'rexml/document'
|
15
|
+
require 'selenium-webdriver'
|
16
|
+
|
17
|
+
require_relative 'slide/converter'
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
class Zenithal::Slide::WholeSlideConverter
|
5
|
+
|
6
|
+
def initialize(args)
|
7
|
+
@mode, @open = nil, false
|
8
|
+
@dirs = {:output => "out", :document => "document", :template => "template"}
|
9
|
+
@image_size = [1920, 1080]
|
10
|
+
options, rest_args = args.partition{|s| s =~ /^\-\w$/}
|
11
|
+
if options.include?("-i")
|
12
|
+
@mode = :image
|
13
|
+
else
|
14
|
+
if options.include?("-o")
|
15
|
+
@open = true
|
16
|
+
end
|
17
|
+
@mode = :normal
|
18
|
+
end
|
19
|
+
@rest_args = rest_args
|
20
|
+
@paths = create_paths
|
21
|
+
@parser = create_parser
|
22
|
+
@converter = create_converter
|
23
|
+
@driver = create_driver
|
24
|
+
end
|
25
|
+
|
26
|
+
def execute
|
27
|
+
case @mode
|
28
|
+
when :image
|
29
|
+
execute_image
|
30
|
+
when :normal
|
31
|
+
execute_normal
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute_normal
|
36
|
+
@paths.each_with_index do |path, index|
|
37
|
+
convert_normal(path)
|
38
|
+
convert_open(path) if @open
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_image
|
43
|
+
@paths.each_with_index do |path, index|
|
44
|
+
convert_image(path)
|
45
|
+
end
|
46
|
+
@driver.quit
|
47
|
+
end
|
48
|
+
|
49
|
+
def convert_normal(path)
|
50
|
+
extension = File.extname(path).gsub(/^\./, "")
|
51
|
+
output_path = path.gsub(@dirs[:document], @dirs[:output]).then(&method(:modify_extension))
|
52
|
+
count_path = path.gsub(@dirs[:document], @dirs[:output]).gsub("slide", "image").gsub(".zml", ".txt")
|
53
|
+
output_dir = File.dirname(output_path)
|
54
|
+
count_dir = File.dirname(count_path)
|
55
|
+
FileUtils.mkdir_p(output_dir)
|
56
|
+
FileUtils.mkdir_p(count_dir)
|
57
|
+
case extension
|
58
|
+
when "zml"
|
59
|
+
@parser.update(File.read(path))
|
60
|
+
document = @parser.run
|
61
|
+
@converter.update(document)
|
62
|
+
output = @converter.convert
|
63
|
+
count = @converter.variables[:slide_count].to_i.to_s
|
64
|
+
File.write(output_path, output)
|
65
|
+
File.write(count_path, count)
|
66
|
+
when "scss"
|
67
|
+
option = {}
|
68
|
+
option[:style] = :expanded
|
69
|
+
option[:filename] = path
|
70
|
+
output = SassC::Engine.new(File.read(path), option).render
|
71
|
+
File.write(output_path, output)
|
72
|
+
when "html", "js", "svg"
|
73
|
+
output = File.read(path)
|
74
|
+
File.write(output_path, output)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def convert_image(path)
|
79
|
+
page_path = path.gsub(@dirs[:document], @dirs[:output]).then(&method(:modify_extension))
|
80
|
+
output_path = path.gsub(@dirs[:document], @dirs[:output]).gsub("slide", "image").gsub(".zml", "")
|
81
|
+
count_path = path.gsub(@dirs[:document], @dirs[:output]).gsub("slide", "image").gsub(".zml", ".txt")
|
82
|
+
output_dir = File.dirname(output_path)
|
83
|
+
count = File.read(count_path).to_i
|
84
|
+
FileUtils.mkdir_p(output_dir)
|
85
|
+
@driver.navigate.to("file:///#{page_path}")
|
86
|
+
@driver.manage.window.resize_to(*@image_size)
|
87
|
+
@driver.execute_script("document.body.classList.add('simple');")
|
88
|
+
count.times do |index|
|
89
|
+
@driver.execute_script("document.querySelectorAll('*[class$=\\'slide\\']')[#{index}].scrollIntoView();")
|
90
|
+
@driver.save_screenshot("#{output_path}-#{index}.png")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def convert_open(path)
|
95
|
+
output_path = path.gsub(@dirs[:document], @dirs[:output]).then(&method(:modify_extension))
|
96
|
+
Kernel.spawn("start #{output_path}")
|
97
|
+
end
|
98
|
+
|
99
|
+
def create_paths
|
100
|
+
paths = []
|
101
|
+
if @rest_args.empty?
|
102
|
+
dirs = []
|
103
|
+
dirs << File.join(@dirs[:document], "slide")
|
104
|
+
if @mode == :normal
|
105
|
+
dirs << File.join(@dirs[:document], "asset")
|
106
|
+
paths << File.join(@dirs[:document], "style", "style.scss")
|
107
|
+
paths << File.join(@dirs[:document], "script", "script.js")
|
108
|
+
end
|
109
|
+
dirs.each do |dir|
|
110
|
+
Dir.each_child(dir) do |entry|
|
111
|
+
if entry =~ /\.\w+$/
|
112
|
+
paths << File.join(dir, entry)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
else
|
117
|
+
path = @rest_args.map{|s| s.gsub("\\", "/").gsub("c:/", "C:/")}[0].encode("utf-8")
|
118
|
+
paths << path
|
119
|
+
end
|
120
|
+
return paths
|
121
|
+
end
|
122
|
+
|
123
|
+
def create_parser(main = true)
|
124
|
+
parser = ZenithalParser.new("")
|
125
|
+
parser.brace_name = "x"
|
126
|
+
parser.bracket_name = "xn"
|
127
|
+
parser.slash_name = "i"
|
128
|
+
if main
|
129
|
+
parser.register_macro("import") do |attributes, _|
|
130
|
+
import_path = attributes["src"]
|
131
|
+
import_parser = create_parser(false)
|
132
|
+
import_parser.update(File.read(File.join(@dirs[:document], import_path)))
|
133
|
+
document = import_parser.run
|
134
|
+
import_nodes = (attributes["expand"]) ? document.root.children : [document.root]
|
135
|
+
next import_nodes
|
136
|
+
end
|
137
|
+
end
|
138
|
+
return parser
|
139
|
+
end
|
140
|
+
|
141
|
+
def create_converter
|
142
|
+
converter = ZenithalConverter.new(nil, :text)
|
143
|
+
Dir.each_child(@dirs[:template]) do |entry|
|
144
|
+
if entry.end_with?(".rb")
|
145
|
+
binding = TOPLEVEL_BINDING
|
146
|
+
binding.local_variable_set(:converter, converter)
|
147
|
+
Kernel.eval(File.read(File.join(@dirs[:template], entry)), binding, entry)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
return converter
|
151
|
+
end
|
152
|
+
|
153
|
+
def create_driver
|
154
|
+
if @mode == :image
|
155
|
+
options = Selenium::WebDriver::Chrome::Options.new
|
156
|
+
options.add_argument("--headless")
|
157
|
+
options.add_option("excludeSwitches", ["enable-logging"])
|
158
|
+
driver = Selenium::WebDriver.for(:chrome, options: options)
|
159
|
+
else
|
160
|
+
driver = nil
|
161
|
+
end
|
162
|
+
return driver
|
163
|
+
end
|
164
|
+
|
165
|
+
def modify_extension(path)
|
166
|
+
result = path.clone
|
167
|
+
result.gsub!(/\.zml$/, ".html")
|
168
|
+
result.gsub!(/\.scss$/, ".css")
|
169
|
+
result.gsub!(/\.ts$/, ".js")
|
170
|
+
return result
|
171
|
+
end
|
172
|
+
|
173
|
+
def output_dir=(dir)
|
174
|
+
@dirs[:output] = dir
|
175
|
+
end
|
176
|
+
|
177
|
+
def document_dir=(dir)
|
178
|
+
@dirs[:document] = dir
|
179
|
+
end
|
180
|
+
|
181
|
+
def template_dir=(dir)
|
182
|
+
@dirs[:template] = dir
|
183
|
+
end
|
184
|
+
|
185
|
+
def image_size=(image_size)
|
186
|
+
@image_size = image_size
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zenml-slide
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ziphil
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-11-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sassc
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: selenium-webdriver
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: 'To be written.
|
42
|
+
|
43
|
+
'
|
44
|
+
email:
|
45
|
+
- ziphil.shaleiras@gmail.com
|
46
|
+
executables: []
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- source/zenml/slide.rb
|
51
|
+
- source/zenml/slide/converter.rb
|
52
|
+
homepage: https://github.com/Ziphil/ZenithalSlide
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- source
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '2.5'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubygems_version: 3.0.3
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: Summary
|
75
|
+
test_files: []
|