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.
@@ -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
+