INÍCIO
This commit is contained in:
commit
f269aace6b
4722 files changed
+512564
No files matched your search
+7
@@ -0,0 +1,7 @@
|
||||
title: Lightbox
|
||||
author: Posit Software, PBC
|
||||
version: 0.1.9
|
||||
quarto-required: ">=1.2.198"
|
||||
contributes:
|
||||
filters:
|
||||
- lightbox.lua
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
|
||||
|
||||
|
||||
body:not(.glightbox-mobile) div.gslide div.gslide-description,
|
||||
body:not(.glightbox-mobile) div.gslide-description .gslide-title,
|
||||
body:not(.glightbox-mobile) div.gslide-description .gslide-desc {
|
||||
color: var(--quarto-body-color);
|
||||
background-color: var(--quarto-body-bg);
|
||||
}
|
||||
Executable
+251
@@ -0,0 +1,251 @@
|
||||
-- whether we're automatically lightboxing
|
||||
local auto = false
|
||||
|
||||
-- whether we need lightbox dependencies added
|
||||
local needsLightbox = false
|
||||
|
||||
-- a counter used to ensure each image is in its own gallery
|
||||
local imgCount = 0
|
||||
|
||||
-- attributes to forward from the image to the newly created link
|
||||
local kDescription = "description"
|
||||
local kForwardedAttr = {
|
||||
"title", kDescription, "desc-position",
|
||||
"type", "effect", "zoomable", "draggable"
|
||||
}
|
||||
|
||||
local kLightboxClass = "lightbox"
|
||||
local kNoLightboxClass = "nolightbox"
|
||||
local kGalleryPrefix = "quarto-lightbox-gallery-"
|
||||
|
||||
-- A list of images already within links that we can use to filter
|
||||
local imagesWithinLinks = pandoc.List({})
|
||||
|
||||
local function readAttrValue(el, attrName)
|
||||
if attrName == kDescription then
|
||||
local doc = pandoc.read(el.attr.attributes[attrName])
|
||||
local attrInlines = doc.blocks[1].content
|
||||
return pandoc.write(pandoc.Pandoc(attrInlines), "html")
|
||||
else
|
||||
return el[attrName]
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return {
|
||||
{
|
||||
Meta = function(meta)
|
||||
|
||||
-- If the mode is auto, we need go ahead and
|
||||
-- run if there are any images (ideally we would)
|
||||
-- filter to images in the body, but that can be
|
||||
-- left for future me to deal with
|
||||
-- supports:
|
||||
-- lightbox: auto
|
||||
-- or
|
||||
-- lightbox:
|
||||
-- match: auto
|
||||
local lbMeta = meta.lightbox
|
||||
if lbMeta ~= nil and type(lbMeta) == 'table' then
|
||||
if lbMeta[1] ~= nil then
|
||||
if lbMeta[1]['text'] == "auto" then
|
||||
auto = true
|
||||
end
|
||||
elseif lbMeta.match ~= nil and pandoc.utils.stringify(lbMeta.match) == 'auto' then
|
||||
auto = true
|
||||
elseif lbMeta == true then
|
||||
auto = true
|
||||
end
|
||||
end
|
||||
end,
|
||||
-- Find images that are already within links
|
||||
-- we'll use this to filter out these images if
|
||||
-- the most is auto
|
||||
Link = function(linkEl)
|
||||
pandoc.walk_inline(linkEl, {
|
||||
Image = function(imageEl)
|
||||
imagesWithinLinks[#imagesWithinLinks + 1] = imageEl
|
||||
end
|
||||
})
|
||||
end
|
||||
},{
|
||||
Div = function(div)
|
||||
if div.classes:includes("cell") and div.attributes["lightbox"] ~= nil then
|
||||
meta = quarto.json.decode(div.attributes["lightbox"])
|
||||
local imgCount=0
|
||||
div = div:walk({
|
||||
Image = function(imgEl)
|
||||
imgCount = imgCount + 1
|
||||
if (type(meta) == "table" and meta[kNoLightboxClass] == true) or meta == false then
|
||||
imgEl.classes:insert(kNoLightboxClass)
|
||||
else
|
||||
if not auto and ((type(meta) == "table" and not meta[kNoLightboxClass]) or meta == true) then
|
||||
imgEl.classes:insert(kLightboxClass)
|
||||
end
|
||||
if (type(meta) == "table") then
|
||||
if meta.group then
|
||||
imgEl.attr.attributes.group = meta.group or imgEl.attr.attributes.group
|
||||
end
|
||||
for _, v in next, kForwardedAttr do
|
||||
if type(meta[v]) == "table" and #meta[v] > 1 then
|
||||
-- if list attributes it should be one per plot
|
||||
if imgCount > #meta[v] then
|
||||
quarto.log.warning("More plots than '" .. v .. "' passed in YAML chunk options.")
|
||||
else
|
||||
attrLb = meta[v][imgCount]
|
||||
end
|
||||
else
|
||||
-- Otherwise reuse the single attributes
|
||||
attrLb = meta[v]
|
||||
end
|
||||
imgEl.attr.attributes[v] = attrLb or imgEl.attr.attributes[v]
|
||||
end
|
||||
end
|
||||
end
|
||||
return imgEl
|
||||
end
|
||||
})
|
||||
div.attributes["lightbox"] = nil
|
||||
end
|
||||
return div
|
||||
end
|
||||
},
|
||||
{
|
||||
Image = function(imgEl)
|
||||
if quarto.doc.is_format("html:js") then
|
||||
local isAlreadyLinked = imagesWithinLinks:includes(imgEl)
|
||||
if (not isAlreadyLinked and auto and not imgEl.classes:includes(kNoLightboxClass))
|
||||
or imgEl.classes:includes('lightbox') then
|
||||
-- note that we need to include the dependency for lightbox
|
||||
needsLightbox = true
|
||||
imgCount = imgCount + 1
|
||||
|
||||
-- remove the class from the image
|
||||
imgEl.attr.classes = imgEl.attr.classes:filter(function(clz)
|
||||
return clz ~= kLightboxClass
|
||||
end)
|
||||
|
||||
-- attributes for the link
|
||||
local linkAttributes = {}
|
||||
|
||||
-- mark this image as a lightbox target
|
||||
linkAttributes.class = kLightboxClass
|
||||
|
||||
-- get the alt text from image and use that as title
|
||||
local title = nil
|
||||
if imgEl.caption ~= nil and #imgEl.caption > 0 then
|
||||
linkAttributes.title = pandoc.utils.stringify(imgEl.caption)
|
||||
elseif imgEl.attributes['fig-alt'] ~= nil and #imgEl.attributes['fig-alt'] > 0 then
|
||||
linkAttributes.title = pandoc.utils.stringify(imgEl.attributes['fig-alt'])
|
||||
end
|
||||
|
||||
-- move a group attribute to the link, if present
|
||||
if imgEl.attr.attributes.group ~= nil then
|
||||
linkAttributes.gallery = imgEl.attr.attributes.group
|
||||
imgEl.attr.attributes.group = nil
|
||||
else
|
||||
linkAttributes.gallery = kGalleryPrefix .. imgCount
|
||||
end
|
||||
|
||||
-- forward any other known attributes
|
||||
for i, v in ipairs(kForwardedAttr) do
|
||||
if imgEl.attr.attributes[v] ~= nil then
|
||||
-- forward the attribute
|
||||
linkAttributes[v] = readAttrValue(imgEl, v)
|
||||
|
||||
-- clear the attribute
|
||||
imgEl.attr.attributes[v] = nil
|
||||
end
|
||||
|
||||
-- clear the title
|
||||
if (imgEl.title == 'fig:') then
|
||||
imgEl.title = ""
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
-- wrap decorated images in a link with appropriate attrs
|
||||
local link = pandoc.Link({imgEl}, imgEl.src, nil, linkAttributes)
|
||||
return link
|
||||
end
|
||||
end
|
||||
end,
|
||||
Meta = function(meta)
|
||||
-- If we discovered lightbox-able images
|
||||
-- we need to include the dependencies
|
||||
if needsLightbox then
|
||||
-- add the dependency
|
||||
quarto.doc.add_html_dependency({
|
||||
name = 'glightbox',
|
||||
scripts = {'resources/js/glightbox.min.js'},
|
||||
stylesheets = {'resources/css/glightbox.min.css', 'lightbox.css'}
|
||||
})
|
||||
|
||||
-- read lightbox options
|
||||
local lbMeta = meta.lightbox
|
||||
local lbOptions = {}
|
||||
local readEffect = function(el)
|
||||
local val = pandoc.utils.stringify(el)
|
||||
if val == "fade" or val == "zoom" or val == "none" then
|
||||
return val
|
||||
else
|
||||
error("Invalid effect " + val)
|
||||
end
|
||||
end
|
||||
|
||||
-- permitted options include:
|
||||
-- lightbox:
|
||||
-- effect: zoom | fade | none
|
||||
-- desc-position: top | bottom | left |right
|
||||
-- loop: true | false
|
||||
-- class: <class-name>
|
||||
local effect = "zoom"
|
||||
local descPosition = "bottom"
|
||||
local loop = true
|
||||
local skin = nil
|
||||
|
||||
-- The selector controls which elements are targeted.
|
||||
-- currently, it always targets .lightbox elements
|
||||
-- and there is no way for the user to change this
|
||||
local selector = "." .. kLightboxClass
|
||||
|
||||
if lbMeta ~= nil and type(lbMeta) == 'table' then
|
||||
if lbMeta.effect ~= nil then
|
||||
effect = readEffect(lbMeta.effect)
|
||||
end
|
||||
|
||||
if lbMeta['desc-position'] ~= nil then
|
||||
descPosition = pandoc.utils.stringify(lbMeta['desc-position'])
|
||||
end
|
||||
|
||||
if lbMeta['css-class'] ~= nil then
|
||||
skin = pandoc.utils.stringify(lbMeta['css-class'])
|
||||
end
|
||||
|
||||
if lbMeta.loop ~= nil then
|
||||
loop = lbMeta.loop
|
||||
end
|
||||
end
|
||||
|
||||
-- Generate the options to configure lightbox
|
||||
local options = {
|
||||
selector = selector,
|
||||
closeEffect = effect,
|
||||
openEffect = effect,
|
||||
descPosition = descPosition,
|
||||
loop = loop,
|
||||
}
|
||||
if skin ~= nil then
|
||||
options.skin = skin
|
||||
end
|
||||
local optionsJson = quarto.json.encode(options)
|
||||
|
||||
-- generate the initialization script with the correct options
|
||||
local scriptTag = "<script>var lightboxQuarto = GLightbox(" .. optionsJson .. ");</script>"
|
||||
|
||||
-- inject the rendering code
|
||||
quarto.doc.include_text("after-body", scriptTag)
|
||||
|
||||
end
|
||||
end
|
||||
}}
|
||||
+1
@@ -0,0 +1 @@
|
||||
.glightbox-container{width:100%;height:100%;position:fixed;top:0;left:0;z-index:999999!important;overflow:hidden;-ms-touch-action:none;touch-action:none;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0}.glightbox-container.inactive{display:none}.glightbox-container .gcontainer{position:relative;width:100%;height:100%;z-index:9999;overflow:hidden}.glightbox-container .gslider{-webkit-transition:-webkit-transform .4s ease;transition:-webkit-transform .4s ease;transition:transform .4s ease;transition:transform .4s ease,-webkit-transform .4s ease;height:100%;left:0;top:0;width:100%;position:relative;overflow:hidden;display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.glightbox-container .gslide{width:100%;position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;opacity:0}.glightbox-container .gslide.current{opacity:1;z-index:99999;position:relative}.glightbox-container .gslide.prev{opacity:1;z-index:9999}.glightbox-container .gslide-inner-content{width:100%}.glightbox-container .ginner-container{position:relative;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-width:100%;margin:auto;height:100vh}.glightbox-container .ginner-container.gvideo-container{width:100%}.glightbox-container .ginner-container.desc-bottom,.glightbox-container .ginner-container.desc-top{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.glightbox-container .ginner-container.desc-left,.glightbox-container .ginner-container.desc-right{max-width:100%!important}.gslide iframe,.gslide video{outline:0!important;border:none;min-height:165px;-webkit-overflow-scrolling:touch;-ms-touch-action:auto;touch-action:auto}.gslide:not(.current){pointer-events:none}.gslide-image{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.gslide-image img{max-height:100vh;display:block;padding:0;float:none;outline:0;border:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;max-width:100vw;width:auto;height:auto;-o-object-fit:cover;object-fit:cover;-ms-touch-action:none;touch-action:none;margin:auto;min-width:200px}.desc-bottom .gslide-image img,.desc-top .gslide-image img{width:auto}.desc-left .gslide-image img,.desc-right .gslide-image img{width:auto;max-width:100%}.gslide-image img.zoomable{position:relative}.gslide-image img.dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.gslide-video{position:relative;max-width:100vh;width:100%!important}.gslide-video .plyr__poster-enabled.plyr--loading .plyr__poster{display:none}.gslide-video .gvideo-wrapper{width:100%;margin:auto}.gslide-video::before{content:'';position:absolute;width:100%;height:100%;background:rgba(255,0,0,.34);display:none}.gslide-video.playing::before{display:none}.gslide-video.fullscreen{max-width:100%!important;min-width:100%;height:75vh}.gslide-video.fullscreen video{max-width:100%!important;width:100%!important}.gslide-inline{background:#fff;text-align:left;max-height:calc(100vh - 40px);overflow:auto;max-width:100%;margin:auto}.gslide-inline .ginlined-content{padding:20px;width:100%}.gslide-inline .dragging{cursor:-webkit-grabbing!important;cursor:grabbing!important;-webkit-transition:none;transition:none}.ginlined-content{overflow:auto;display:block!important;opacity:1}.gslide-external{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;min-width:100%;background:#fff;padding:0;overflow:auto;max-height:75vh;height:100%}.gslide-media{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto}.zoomed .gslide-media{-webkit-box-shadow:none!important;box-shadow:none!important}.desc-bottom .gslide-media,.desc-top .gslide-media{margin:0 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gslide-description{position:relative;-webkit-box-flex:1;-ms-flex:1 0 100%;flex:1 0 100%}.gslide-description.description-left,.gslide-description.description-right{max-width:100%}.gslide-description.description-bottom,.gslide-description.description-top{margin:0 auto;width:100%}.gslide-description p{margin-bottom:12px}.gslide-description p:last-child{margin-bottom:0}.zoomed .gslide-description{display:none}.glightLine truncated
|
||||
+1
@@ -0,0 +1 @@
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).GLightbox=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var i=0;i<t.length;i++){var n=t[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}function n(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}var s=Date.now();function l(){var e={},t=!0,i=0,n=arguments.length;"[object Boolean]"===Object.prototype.toString.call(arguments[0])&&(t=arguments[0],i++);for(var s=function(i){for(var n in i)Object.prototype.hasOwnProperty.call(i,n)&&(t&&"[object Object]"===Object.prototype.toString.call(i[n])?e[n]=l(!0,e[n],i[n]):e[n]=i[n])};i<n;i++){var o=arguments[i];s(o)}return e}function o(e,t){if((k(e)||e===window||e===document)&&(e=[e]),A(e)||L(e)||(e=[e]),0!=P(e))if(A(e)&&!L(e))for(var i=e.length,n=0;n<i&&!1!==t.call(e[n],e[n],n,e);n++);else if(L(e))for(var s in e)if(O(e,s)&&!1===t.call(e[s],e[s],s,e))break}function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=e[s]=e[s]||[],l={all:n,evt:null,found:null};return t&&i&&P(n)>0&&o(n,(function(e,n){if(e.eventName==t&&e.fn.toString()==i.toString())return l.found=!0,l.evt=n,!1})),l}function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.onElement,n=t.withCallback,s=t.avoidDuplicate,l=void 0===s||s,a=t.once,h=void 0!==a&&a,d=t.useCapture,c=void 0!==d&&d,u=arguments.length>2?arguments[2]:void 0,g=i||[];function v(e){T(n)&&n.call(u,e,this),h&&v.destroy()}return C(g)&&(g=document.querySelectorAll(g)),v.destroy=function(){o(g,(function(t){var i=r(t,e,v);i.found&&i.all.splice(i.evt,1),t.removeEventListener&&t.removeEventListener(e,v,c)}))},o(g,(function(t){var i=r(t,e,v);(t.addEventListener&&l&&!i.found||!l)&&(t.addEventListener(e,v,c),i.all.push({eventName:e,fn:v}))})),v}function h(e,t){o(t.split(" "),(function(t){return e.classList.add(t)}))}function d(e,t){o(t.split(" "),(function(t){return e.classList.remove(t)}))}function c(e,t){return e.classList.contains(t)}function u(e,t){for(;e!==document.body;){if(!(e=e.parentElement))return!1;if("function"==typeof e.matches?e.matches(t):e.msMatchesSelector(t))return e}}function g(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(!e||""===t)return!1;if("none"===t)return T(i)&&i(),!1;var n=x(),s=t.split(" ");o(s,(function(t){h(e,"g"+t)})),a(n,{onElement:e,avoidDuplicate:!1,once:!0,withCallback:function(e,t){o(s,(function(e){d(t,"g"+e)})),T(i)&&i()}})}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(""===t)return e.style.webkitTransform="",e.style.MozTransform="",e.style.msTransform="",e.style.OTransform="",e.style.transform="",!1;e.style.webkitTransform=t,e.style.MozTransform=t,e.style.msTransform=t,e.style.OTransform=t,e.style.transform=t}function f(e){e.style.display="block"}function p(e){e.style.display="none"}function m(e){var t=document.createDocumentFragment(),i=document.createElement("div");for(i.innerHTML=e;i.firstChild;)t.appendChild(i.firstChild);return t}function y(){return{width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}}function x(){var e,t=document.createElement("fakeelement"),i={animation:"animationend",OAnimation:"oAnimationEnd",MozAnimation:"animationend",WebkitAnimation:"webkitAnimationEnd"};for(e in i)if(void 0!==t.style[e])return i[e]}function b(e,t,i,n){if(e())t();else{var s;i||(i=100);var l=setInterval((function(){e()&&(clearInterval(l),s&&clearTimeout(s),t())}),i);n&&(s=setTimeout((function(){clearInterval(l)}),n))}}function S(e,t,i){if(I(e))console.error("Inject assets error");else if(T(t)&&(i=t,t=!1),C(t)&&t in window)T(i)&&i();else{var n;if(-1!==e.indexOf(".css")){if((n=document.querySelectorAll('link[href="'+e+'"]'))&&n.length>0)return void(T(i)&&i());var s=document.getElementsByTagName("head")[0],l=s.querySelectorAll('link[rel="stylesheet"]'),o=document.createElement("link");return o.rel="stylesheet",o.type="text/css",o.href=e,o.media="all",l?s.insertBefore(o,l[0]):s.appendChild(o),void(T(i)&&i())}if((n=document.querySelectorAll('script[src="'+e+'"]'))&&n.length>0){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()})),!1;i()}}else{var r=document.createElement("script");r.type="text/javascript",r.src=e,r.onload=function(){if(T(i)){if(C(t))return b((function(){return void 0!==window[t]}),(function(){i()Line truncated
|
||||
Reference in new issue
Block a user