jekyll-svg-viewer 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/LICENSE.txt +22 -0
- data/README.md +110 -0
- data/assets/svg-viewer/css/svg-viewer.css +439 -0
- data/assets/svg-viewer/i18n/locales.json +78 -0
- data/assets/svg-viewer/js/svg-viewer.js +1604 -0
- data/assets/svg-viewer/preview/index.html +178 -0
- data/assets/svg-viewer/preview/preset-builder.css +338 -0
- data/assets/svg-viewer/preview/preset-builder.js +793 -0
- data/lib/jekyll/svg_viewer/asset_manager.rb +129 -0
- data/lib/jekyll/svg_viewer/config.rb +40 -0
- data/lib/jekyll/svg_viewer/preview_page.rb +54 -0
- data/lib/jekyll/svg_viewer/tag.rb +528 -0
- data/lib/jekyll/svg_viewer/version.rb +6 -0
- data/lib/jekyll/svg_viewer.rb +6 -0
- data/lib/jekyll-svg-viewer.rb +11 -0
- metadata +93 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
require "fileutils"
|
|
2
|
+
require "json"
|
|
3
|
+
require "set"
|
|
4
|
+
|
|
5
|
+
module Jekyll
|
|
6
|
+
module SvgViewer
|
|
7
|
+
class AssetManager
|
|
8
|
+
ASSET_ROOT = File.expand_path("../../../assets/svg-viewer", __dir__)
|
|
9
|
+
OUTPUT_DIR = "assets/svg-viewer"
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
def hooks_registered?
|
|
13
|
+
@hooks_registered ||= false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def register(_site)
|
|
17
|
+
return if hooks_registered?
|
|
18
|
+
|
|
19
|
+
@hooks_registered = true
|
|
20
|
+
|
|
21
|
+
Jekyll::Hooks.register [:pages, :documents], :post_render do |doc|
|
|
22
|
+
ensure_asset_tags(doc)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
Jekyll::Hooks.register :site, :post_write do |s|
|
|
26
|
+
copy_assets(s)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def flag_page_for_assets(site, page)
|
|
31
|
+
runtime = site.config["svg_viewer_runtime"] ||= {}
|
|
32
|
+
runtime["required_paths"] ||= Set.new
|
|
33
|
+
|
|
34
|
+
mark_page_hash!(page)
|
|
35
|
+
path = extract_path(page)
|
|
36
|
+
runtime["required_paths"] << path if path
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def copy_assets(site)
|
|
40
|
+
destination = File.join(site.dest, OUTPUT_DIR)
|
|
41
|
+
FileUtils.mkdir_p(destination)
|
|
42
|
+
Dir.glob(File.join(ASSET_ROOT, "**", "*")).each do |path|
|
|
43
|
+
next if File.directory?(path)
|
|
44
|
+
|
|
45
|
+
relative = path.delete_prefix("#{ASSET_ROOT}/")
|
|
46
|
+
target = File.join(destination, relative)
|
|
47
|
+
FileUtils.mkdir_p(File.dirname(target))
|
|
48
|
+
FileUtils.cp(path, target)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def locale_payload(_site)
|
|
53
|
+
locales_path = File.join(ASSET_ROOT, "i18n", "locales.json")
|
|
54
|
+
return {} unless File.exist?(locales_path)
|
|
55
|
+
|
|
56
|
+
JSON.parse(File.read(locales_path))
|
|
57
|
+
rescue JSON::ParserError
|
|
58
|
+
{}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def ensure_asset_tags(doc)
|
|
64
|
+
return unless requires_assets?(doc)
|
|
65
|
+
return unless doc.respond_to?(:output) && doc.output
|
|
66
|
+
return unless html_output?(doc)
|
|
67
|
+
|
|
68
|
+
baseurl = doc.site.config["baseurl"].to_s.chomp("/")
|
|
69
|
+
css_href = "#{baseurl}/#{OUTPUT_DIR}/css/svg-viewer.css"
|
|
70
|
+
js_src = "#{baseurl}/#{OUTPUT_DIR}/js/svg-viewer.js"
|
|
71
|
+
|
|
72
|
+
unless doc.output.include?(css_href)
|
|
73
|
+
replaced = doc.output.sub(/<head[^>]*>/i) do |match|
|
|
74
|
+
"#{match}\n<link rel=\"stylesheet\" href=\"#{css_href}\" data-svg-viewer=\"style\">"
|
|
75
|
+
end
|
|
76
|
+
doc.output = replaced unless replaced.nil?
|
|
77
|
+
doc.output =
|
|
78
|
+
"<link rel=\"stylesheet\" href=\"#{css_href}\" data-svg-viewer=\"style\">\n#{doc.output}" if replaced.nil?
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
unless doc.output.include?(js_src)
|
|
82
|
+
replaced = doc.output.sub(/<\/head>/i) do |match|
|
|
83
|
+
"<script src=\"#{js_src}\" defer data-svg-viewer=\"script\"></script>\n#{match}"
|
|
84
|
+
end
|
|
85
|
+
doc.output = replaced unless replaced.nil?
|
|
86
|
+
doc.output =
|
|
87
|
+
"#{doc.output}\n<script src=\"#{js_src}\" defer data-svg-viewer=\"script\"></script>" if replaced.nil?
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def requires_assets?(doc)
|
|
92
|
+
return true if doc.respond_to?(:data) && doc.data["svg_viewer_required"]
|
|
93
|
+
|
|
94
|
+
runtime = doc.site.config["svg_viewer_runtime"] || {}
|
|
95
|
+
required_paths = runtime["required_paths"]
|
|
96
|
+
return false unless required_paths
|
|
97
|
+
|
|
98
|
+
path = extract_path(doc)
|
|
99
|
+
required_paths.include?(path)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def mark_page_hash!(page)
|
|
103
|
+
if page.is_a?(Hash)
|
|
104
|
+
page["svg_viewer_required"] = true
|
|
105
|
+
elsif page.respond_to?(:data)
|
|
106
|
+
page.data["svg_viewer_required"] = true
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def extract_path(page)
|
|
111
|
+
if page.respond_to?(:relative_path)
|
|
112
|
+
page.relative_path
|
|
113
|
+
elsif page.respond_to?(:path)
|
|
114
|
+
page.path
|
|
115
|
+
elsif page.is_a?(Hash)
|
|
116
|
+
page["path"] || page["page_path"]
|
|
117
|
+
else
|
|
118
|
+
nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def html_output?(doc)
|
|
123
|
+
ext = doc.respond_to?(:output_ext) ? doc.output_ext : File.extname(doc.path)
|
|
124
|
+
%w[.html .htm].include?(ext.downcase)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Jekyll
|
|
2
|
+
module SvgViewer
|
|
3
|
+
module Config
|
|
4
|
+
DEFAULTS = {
|
|
5
|
+
"assets" => {
|
|
6
|
+
"auto_include" => "auto",
|
|
7
|
+
"cache_bust" => false
|
|
8
|
+
},
|
|
9
|
+
"defaults" => {
|
|
10
|
+
"height" => "600px",
|
|
11
|
+
"class" => "",
|
|
12
|
+
"zoom" => "100",
|
|
13
|
+
"min_zoom" => "25",
|
|
14
|
+
"max_zoom" => "800",
|
|
15
|
+
"zoom_step" => "10",
|
|
16
|
+
"center_x" => nil,
|
|
17
|
+
"center_y" => nil,
|
|
18
|
+
"show_coords" => false,
|
|
19
|
+
"title" => "",
|
|
20
|
+
"caption" => "",
|
|
21
|
+
"controls_position" => "top",
|
|
22
|
+
"controls_buttons" => "both",
|
|
23
|
+
"button_fill" => "",
|
|
24
|
+
"button_border" => "",
|
|
25
|
+
"button_foreground" => "",
|
|
26
|
+
"pan_mode" => "",
|
|
27
|
+
"zoom_mode" => ""
|
|
28
|
+
}
|
|
29
|
+
}.freeze
|
|
30
|
+
|
|
31
|
+
module_function
|
|
32
|
+
|
|
33
|
+
def for(site)
|
|
34
|
+
config = site.config.fetch("svg_viewer", {})
|
|
35
|
+
Jekyll::Utils.deep_merge_hashes(DEFAULTS, config)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require_relative "config"
|
|
2
|
+
|
|
3
|
+
module Jekyll
|
|
4
|
+
module SvgViewer
|
|
5
|
+
class PreviewPage
|
|
6
|
+
TEMPLATE_PATH = File.expand_path("../../../assets/svg-viewer/preview/index.html", __dir__)
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
def register(_site)
|
|
10
|
+
return if hook_registered?
|
|
11
|
+
|
|
12
|
+
@hook_registered = true
|
|
13
|
+
|
|
14
|
+
Jekyll::Hooks.register :site, :post_read do |site|
|
|
15
|
+
add_preview_page(site)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def hook_registered?
|
|
22
|
+
@hook_registered ||= false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def add_preview_page(site)
|
|
26
|
+
return unless File.exist?(TEMPLATE_PATH)
|
|
27
|
+
|
|
28
|
+
runtime = site.config["svg_viewer_runtime"] ||= {}
|
|
29
|
+
return if runtime["preview_page_registered"]
|
|
30
|
+
|
|
31
|
+
site.pages << new_page(site)
|
|
32
|
+
runtime["preview_page_registered"] = true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def new_page(site)
|
|
36
|
+
config = Jekyll::SvgViewer::Config.for(site)
|
|
37
|
+
data = {
|
|
38
|
+
"layout" => nil,
|
|
39
|
+
"title" => "SVG Viewer Preset Builder",
|
|
40
|
+
"permalink" => "/svg-viewer/preset-builder/",
|
|
41
|
+
"svg_viewer_defaults" => config["defaults"]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
content = File.read(TEMPLATE_PATH)
|
|
45
|
+
PageWithoutAFile.new(site, site.source, "svg-viewer/preset-builder", "index.html").tap do |page|
|
|
46
|
+
page.data = data
|
|
47
|
+
page.content = content
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|