131 lines
3.7 KiB
Plaintext
131 lines
3.7 KiB
Plaintext
|
|
<!---
|
|||
|
|
Supported attribute list:
|
|||
|
|
* src (required)
|
|||
|
|
* width
|
|||
|
|
* formats
|
|||
|
|
* url-path
|
|||
|
|
* output-dir
|
|||
|
|
|
|||
|
|
<img
|
|||
|
|
webc:is="eleventy-image"
|
|||
|
|
src="./src/img/possum-geri.png"
|
|||
|
|
alt="The possum is Eleventy’s mascot"
|
|||
|
|
width="222, 350"
|
|||
|
|
class="some-custom-class"
|
|||
|
|
sizes="(min-width: 43.75em) 100px, 15vw">
|
|||
|
|
|
|||
|
|
Alternative attribute formats:
|
|||
|
|
:width="[222, 350]"
|
|||
|
|
formats="avif,webp,jpeg"
|
|||
|
|
:formats="['avif', 'webp', 'jpeg']"
|
|||
|
|
--->
|
|||
|
|
<script webc:type="js">
|
|||
|
|
const path = require("path");
|
|||
|
|
|
|||
|
|
// TODO expose this for re-use in a provided shortcode.
|
|||
|
|
async function imagePlugin(attributes, globalPluginOptions) {
|
|||
|
|
if(!attributes.src) {
|
|||
|
|
throw new Error("Missing `src` attribute on <eleventy-image>");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TODO allow remote optimization automatically on full urls
|
|||
|
|
|
|||
|
|
let imagePackage;
|
|||
|
|
let defaultGlobalAttributes;
|
|||
|
|
|
|||
|
|
if(globalPluginOptions) {
|
|||
|
|
defaultGlobalAttributes = globalPluginOptions.defaultAttributes;
|
|||
|
|
delete globalPluginOptions.defaultAttributes;
|
|||
|
|
|
|||
|
|
imagePackage = globalPluginOptions.packages?.image;
|
|||
|
|
delete globalPluginOptions.packages;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(!imagePackage) {
|
|||
|
|
imagePackage = require("@11ty/eleventy-img");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let instanceOptions = {};
|
|||
|
|
|
|||
|
|
// Note that multiple widths require a `sizes`
|
|||
|
|
|
|||
|
|
if(attributes.width) {
|
|||
|
|
if(typeof attributes.width === "string") {
|
|||
|
|
instanceOptions.widths = attributes.width.split(",").map(entry => parseInt(entry, 10));
|
|||
|
|
delete attributes.width;
|
|||
|
|
} else if(Array.isArray(attributes.width)) {
|
|||
|
|
instanceOptions.widths = attributes.width;
|
|||
|
|
delete attributes.width;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(attributes.formats) {
|
|||
|
|
if(typeof attributes.formats === "string") {
|
|||
|
|
instanceOptions.formats = attributes.formats.split(",").map(entry => entry.trim());
|
|||
|
|
delete attributes.formats;
|
|||
|
|
} else if(Array.isArray(attributes.formats)) {
|
|||
|
|
instanceOptions.formats = attributes.formats;
|
|||
|
|
delete attributes.formats;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// These defaults are set only if addPlugin was **not** called:
|
|||
|
|
if(!globalPluginOptions) {
|
|||
|
|
// Using eleventy.directories global data (Eleventy 2.0.2+)
|
|||
|
|
if(eleventy.directories) {
|
|||
|
|
instanceOptions.urlPath = "/img/";
|
|||
|
|
|
|||
|
|
// write to output folder by default
|
|||
|
|
instanceOptions.outputDir = path.join(eleventy.directories.output, instanceOptions.urlPath);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Overrides via attributes (hopefully you don’t need these)
|
|||
|
|
if(attributes.urlPath) {
|
|||
|
|
instanceOptions.urlPath = attributes.urlPath;
|
|||
|
|
delete attributes.urlPath;
|
|||
|
|
|
|||
|
|
if(eleventy.directories && !attributes.outputDir) {
|
|||
|
|
// use output folder if available (Eleventy v2.0.2+)
|
|||
|
|
instanceOptions.outputDir = path.join(eleventy.directories.output, instanceOptions.urlPath);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(attributes.outputDir) {
|
|||
|
|
instanceOptions.outputDir = attributes.outputDir;
|
|||
|
|
delete attributes.outputDir;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let options = Object.assign({}, globalPluginOptions, instanceOptions);
|
|||
|
|
|
|||
|
|
// see Util.addConfig
|
|||
|
|
if(globalPluginOptions.eleventyConfig) {
|
|||
|
|
Object.defineProperty(options, "eleventyConfig", {
|
|||
|
|
value: globalPluginOptions.eleventyConfig,
|
|||
|
|
enumerable: false,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let metadata = await imagePackage(src, options);
|
|||
|
|
|
|||
|
|
let imageAttributes = Object.assign({}, defaultGlobalAttributes, attributes);
|
|||
|
|
|
|||
|
|
// You bet we throw an error on missing alt in `imageAttributes` (alt="" works okay)
|
|||
|
|
return imagePackage.generateHTML(metadata, imageAttributes);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
(async () => {
|
|||
|
|
let globalPluginOptions;
|
|||
|
|
// fetch global options from from addPlugin call
|
|||
|
|
if(typeof __private_eleventyImageConfigurationOptions === "function") {
|
|||
|
|
globalPluginOptions = __private_eleventyImageConfigurationOptions();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(!("filterPublicAttributes" in webc)) {
|
|||
|
|
throw new Error("The <eleventy-image> WebC component requires WebC v0.10.1+");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let attributes = webc.filterPublicAttributes(webc.attributes);
|
|||
|
|
return imagePlugin(attributes, globalPluginOptions);
|
|||
|
|
})();
|
|||
|
|
</script>
|