Skip to content

Instantly share code, notes, and snippets.

@trey
Last active January 18, 2025 01:35
Show Gist options
  • Save trey/fed51ef90fbc546059e84eceae7e8eea to your computer and use it in GitHub Desktop.
Save trey/fed51ef90fbc546059e84eceae7e8eea to your computer and use it in GitHub Desktop.

Revisions

  1. trey revised this gist Jun 28, 2020. No changes.
  2. trey revised this gist Jun 28, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion template.liquid
    Original file line number Diff line number Diff line change
    @@ -3,4 +3,4 @@
    <figcaption>
    {% exifData image %}
    </figcaption>
    </figure>
    </figure>
  3. trey revised this gist Jun 28, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion exif-data.js
    Original file line number Diff line number Diff line change
    @@ -31,7 +31,7 @@ module.exports = async(src) => {
    // where it exists and makes sense.
    for (const [key, value] of items) {
    if (value) {
    markup += `<div>${key}: ${value}<div>`;
    markup += `<div>${key}: ${value}</div>`;
    }
    }

  4. trey revised this gist Jun 28, 2020. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions .eleventy.js
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    const responsiveImage = require('./src/_includes/shortcodes/responsive-image');
    const exifData = require('./src/_includes/shortcodes/exif-data');

    // …
  5. trey revised this gist Jun 28, 2020. 1 changed file with 3 additions and 3 deletions.
    6 changes: 3 additions & 3 deletions template.liquid
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    <figure>
    {% comment %} Put an image here {% endcomment %}
    {% responsiveImage image %}
    <figcaption>
    {% exifData 'whatever.jpg' %}
    {% exifData image %}
    </figcaption>
    </figure>
    </figure>
  6. trey revised this gist Jun 28, 2020. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion responsive-image.js
    Original file line number Diff line number Diff line change
    @@ -11,7 +11,7 @@ module.exports = async (src, alt, title, width, height) => {
    };

    if (alt === undefined) {
    // Pull in EXIF data if we don't have alt text.
    // Pull in Exif data if we dont have alt text.
    const altText = await exif.read(`${options.inputDir}/${src}`).then(
    exifData => exifData.image.ImageDescription
    );
  7. trey revised this gist Jun 28, 2020. 1 changed file with 4 additions and 4 deletions.
    8 changes: 4 additions & 4 deletions exif-data.js
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    const exif = require('fast-exif');
    const imgFolder = '';
    const imgFolder = 'src/img/gallery/';

    module.exports = async(src) => {
    const path = imgFolder + src;
    @@ -18,18 +18,18 @@ module.exports = async(src) => {
    : `Photo from ${DateTime.getFullYear()}`;

    // Create an object with the items we want.
    const entries = Object.entries({
    const items = Object.entries({
    Year: DateTime.getFullYear(),
    Camera: `${exifData.image.Make} ${exifData.image.Model}`,
    Caption: imgDescription,
    'ƒ/stop': exifData.exif.FNumber,
    Shutter: isNaN(exifData.exif.ExposureTime) ? null : `1/${1 / exifData.exif.ExposureTime}`,
    Shutter: !(isNaN(exifData.exif.ExposureTime)) ? `1/${1 / exifData.exif.ExposureTime}` : null,
    'ISO': exifData.exif.ISO,
    });

    // Loop through the objects one by one and only include output
    // where it exists and makes sense.
    for (const [key, value] of entries) {
    for (const [key, value] of items) {
    if (value) {
    markup += `<div>${key}: ${value}<div>`;
    }
  8. trey revised this gist Jun 28, 2020. 2 changed files with 46 additions and 0 deletions.
    2 changes: 2 additions & 0 deletions .eleventy.js
    Original file line number Diff line number Diff line change
    @@ -5,6 +5,8 @@ const exifData = require('./src/_includes/shortcodes/exif-data');
    module.exports = function(eleventyConfig) {
    // …

    eleventyConfig.addShortcode('responsiveImage', responsiveImage);

    eleventyConfig.addShortcode('exifData', exifData);

    // …
    44 changes: 44 additions & 0 deletions responsive-image.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,44 @@
    const Image = require('@11ty/eleventy-img');
    const exif = require('fast-exif');

    module.exports = async (src, alt, title, width, height) => {
    const options = {
    inputDir: 'src/img/gallery',
    outputDir: 'dist/img/gallery',
    urlPath: '/img/gallery',
    widths: [800, 1600, 2200, null],
    formats: 'jpeg',
    };

    if (alt === undefined) {
    // Pull in EXIF data if we don't have alt text.
    const altText = await exif.read(`${options.inputDir}/${src}`).then(
    exifData => exifData.image.ImageDescription
    );

    if (altText) {
    alt = altText;
    } else {
    throw new Error(`Missing alt on responsiveImage from: ${src}`);
    }
    }

    let stats = await Image(`${options.inputDir}/${src}`, options);
    let lowestSrc = stats.jpeg[0];
    let titleAttribute = (title) ? `title="${title}"` : '';
    let props = stats[options.formats].pop();

    // If sizes are passed in, use them. Otherwise, analyze the files.
    let definedWidth = (width) ? width : props.width;
    let definedHeight = (height) ? height : props.height;

    const imgTag = `<img ${titleAttribute}
    alt="${alt}"
    src="${lowestSrc.url}"
    width="${definedWidth}"
    height="${definedHeight}"
    srcset="${stats.jpeg.map(entry => `${entry.url} ${entry.width}w`)}" />`;

    // Remove extraneous spaces and newlines.
    return imgTag.replace(/\n/g, '').replace(/\s+/g, ' ');
    };
  9. trey revised this gist Jun 27, 2020. 1 changed file with 14 additions and 14 deletions.
    28 changes: 14 additions & 14 deletions exif-data.js
    Original file line number Diff line number Diff line change
    @@ -1,12 +1,13 @@
    const exif = require('fast-exif');
    const imgFolder = 'src/img/gallery/';
    const imgFolder = '';

    module.exports = async(src) => {
    const path = imgFolder + src;

    const imageData = await exif.read(path).then(exifData => {

    let DateTime;
    let markup = '';

    if (exifData.exif.DateTimeDigitized) {
    DateTime = new Date(exifData.exif.DateTimeDigitized);
    } else {
    @@ -17,22 +18,21 @@ module.exports = async(src) => {
    : `Photo from ${DateTime.getFullYear()}`;

    // Create an object with the items we want.
    // Loop through the objects one by one and only include output
    // where it exists and makes sense.
    const items = {
    year: DateTime.getFullYear(),
    camera: `${exifData.image.Make} ${exifData.image.Model}`,
    caption: imgDescription,
    const entries = Object.entries({
    Year: DateTime.getFullYear(),
    Camera: `${exifData.image.Make} ${exifData.image.Model}`,
    Caption: imgDescription,
    'ƒ/stop': exifData.exif.FNumber,
    shutter: isNaN(exifData.exif.ExposureTime) ? null : `1/${1 / exifData.exif.ExposureTime}`,
    Shutter: isNaN(exifData.exif.ExposureTime) ? null : `1/${1 / exifData.exif.ExposureTime}`,
    'ISO': exifData.exif.ISO,
    };

    const entries = Object.entries(items);
    let markup = '';
    });

    // Loop through the objects one by one and only include output
    // where it exists and makes sense.
    for (const [key, value] of entries) {
    markup += `<div>${key}: ${value}<div>`;
    if (value) {
    markup += `<div>${key}: ${value}<div>`;
    }
    }

    return markup;
  10. trey revised this gist Jun 27, 2020. 1 changed file with 7 additions and 9 deletions.
    16 changes: 7 additions & 9 deletions exif-data.js
    Original file line number Diff line number Diff line change
    @@ -5,7 +5,6 @@ module.exports = async(src) => {
    const path = imgFolder + src;

    const imageData = await exif.read(path).then(exifData => {
    // console.log('exifData', exifData);

    let DateTime;
    if (exifData.exif.DateTimeDigitized) {
    @@ -29,15 +28,14 @@ module.exports = async(src) => {
    'ISO': exifData.exif.ISO,
    };

    console.log('items', items);
    const entries = Object.entries(items);
    let markup = '';

    return `
    <div>year: ${DateTime.getFullYear()}</div>
    <div>camera: ${exifData.image.Make} ${exifData.image.Model}</div>
    <div>caption: ${imgDescription}</div>
    <div>fstop: ${exifData.exif.FNumber}</div>
    <div>shutter: 1/${1/exifData.exif.ExposureTime}</div>
    <div>iso: ${exifData.exif.ISO}</div>`;
    for (const [key, value] of entries) {
    markup += `<div>${key}: ${value}<div>`;
    }

    return markup;
    }).catch(console.error);

    return imageData;
  11. trey revised this gist Jun 26, 2020. 1 changed file with 17 additions and 0 deletions.
    17 changes: 17 additions & 0 deletions exif-data.js
    Original file line number Diff line number Diff line change
    @@ -5,6 +5,8 @@ module.exports = async(src) => {
    const path = imgFolder + src;

    const imageData = await exif.read(path).then(exifData => {
    // console.log('exifData', exifData);

    let DateTime;
    if (exifData.exif.DateTimeDigitized) {
    DateTime = new Date(exifData.exif.DateTimeDigitized);
    @@ -15,8 +17,23 @@ module.exports = async(src) => {
    ? exifData.image.ImageDescription
    : `Photo from ${DateTime.getFullYear()}`;

    // Create an object with the items we want.
    // Loop through the objects one by one and only include output
    // where it exists and makes sense.
    const items = {
    year: DateTime.getFullYear(),
    camera: `${exifData.image.Make} ${exifData.image.Model}`,
    caption: imgDescription,
    'ƒ/stop': exifData.exif.FNumber,
    shutter: isNaN(exifData.exif.ExposureTime) ? null : `1/${1 / exifData.exif.ExposureTime}`,
    'ISO': exifData.exif.ISO,
    };

    console.log('items', items);

    return `
    <div>year: ${DateTime.getFullYear()}</div>
    <div>camera: ${exifData.image.Make} ${exifData.image.Model}</div>
    <div>caption: ${imgDescription}</div>
    <div>fstop: ${exifData.exif.FNumber}</div>
    <div>shutter: 1/${1/exifData.exif.ExposureTime}</div>
  12. trey revised this gist Jun 25, 2020. 1 changed file with 10 additions and 10 deletions.
    20 changes: 10 additions & 10 deletions exif-data.js
    Original file line number Diff line number Diff line change
    @@ -11,17 +11,17 @@ module.exports = async(src) => {
    } else {
    DateTime = new Date(exifData.exif.DateTimeOriginal);
    }
    const imgDescription = (exifData.image.ImageDescription)
    ? exifData.image.ImageDescription
    : `Photo from ${DateTime.getFullYear()}`;

    return {
    height: exifData.exif.PixelYDimension,
    width: exifData.exif.PixelXDimension,
    year: DateTime.getFullYear(),
    caption: exifData.image.ImageDescription || `Photo from ${DateTime.getFullYear()}`,
    fstop: exifData.exif.FNumber,
    shutter: 1 / exifData.exif.ExposureTime,
    iso: exifData.exif.ISO,
    };
    return `
    <div>year: ${DateTime.getFullYear()}</div>
    <div>caption: ${imgDescription}</div>
    <div>fstop: ${exifData.exif.FNumber}</div>
    <div>shutter: 1/${1/exifData.exif.ExposureTime}</div>
    <div>iso: ${exifData.exif.ISO}</div>`;
    }).catch(console.error);

    console.log('imageData', imageData);
    return imageData;
    };
  13. trey revised this gist Jun 25, 2020. 1 changed file with 11 additions and 0 deletions.
    11 changes: 11 additions & 0 deletions .eleventy.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    const exifData = require('./src/_includes/shortcodes/exif-data');

    // …

    module.exports = function(eleventyConfig) {
    // …

    eleventyConfig.addShortcode('exifData', exifData);

    // …
    }
  14. trey created this gist Jun 25, 2020.
    27 changes: 27 additions & 0 deletions exif-data.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,27 @@
    const exif = require('fast-exif');
    const imgFolder = 'src/img/gallery/';

    module.exports = async(src) => {
    const path = imgFolder + src;

    const imageData = await exif.read(path).then(exifData => {
    let DateTime;
    if (exifData.exif.DateTimeDigitized) {
    DateTime = new Date(exifData.exif.DateTimeDigitized);
    } else {
    DateTime = new Date(exifData.exif.DateTimeOriginal);
    }

    return {
    height: exifData.exif.PixelYDimension,
    width: exifData.exif.PixelXDimension,
    year: DateTime.getFullYear(),
    caption: exifData.image.ImageDescription || `Photo from ${DateTime.getFullYear()}`,
    fstop: exifData.exif.FNumber,
    shutter: 1 / exifData.exif.ExposureTime,
    iso: exifData.exif.ISO,
    };
    }).catch(console.error);

    console.log('imageData', imageData);
    };
    6 changes: 6 additions & 0 deletions template.liquid
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,6 @@
    <figure>
    {% comment %} Put an image here {% endcomment %}
    <figcaption>
    {% exifData 'whatever.jpg' %}
    </figcaption>
    </figure>