Skip to content

Instantly share code, notes, and snippets.

@gowon
Forked from bgrins/detectDataURL.js
Last active June 14, 2021 17:03
Show Gist options
  • Select an option

  • Save gowon/e6cd6f490728f2214e01 to your computer and use it in GitHub Desktop.

Select an option

Save gowon/e6cd6f490728f2214e01 to your computer and use it in GitHub Desktop.

Revisions

  1. Gowon Patterson revised this gist Dec 2, 2015. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions detectDataURL.js
    Original file line number Diff line number Diff line change
    @@ -4,6 +4,6 @@
    // Valid URL Characters: http://tools.ietf.org/html/rfc2396#section2

    function isDataURL(s) {
    return !!s.match(isDataURL.regex);
    return isDataURL.regex.test(s);
    }
    isDataURL.regex = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
    isDataURI.regex = /^\s*data:([a-z]+\/[a-z0-9\-]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
  2. @bgrins bgrins revised this gist Aug 9, 2013. 3 changed files with 29 additions and 11 deletions.
    2 changes: 1 addition & 1 deletion detectDataURL.js
    Original file line number Diff line number Diff line change
    @@ -6,4 +6,4 @@
    function isDataURL(s) {
    return !!s.match(isDataURL.regex);
    }
    isDataURL.regex = /^\s*data:([a-z]+\/[a-z]+)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
    isDataURL.regex = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
    37 changes: 28 additions & 9 deletions test.js
    Original file line number Diff line number Diff line change
    @@ -6,35 +6,54 @@ var yes = [
    " data:,Hello World!",
    " data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D",
    " data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E",
    "data:,A%20brief%20note"
    "data:,A%20brief%20note",
    "data:text/html;charset=US-ASCII,%3Ch1%3EHello!%3C%2Fh1%3E"
    ];

    var no = [
    "dataxbase64",
    "data:HelloWorld",
    "data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC",
    "data:text/html;charset=,%3Ch1%3EHello!%3C%2Fh1%3E",
    "data:text/html;charset,%3Ch1%3EHello!%3C%2Fh1%3E", "data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC",
    "",
    "http://wikipedia.org",
    "base64",
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC"
    ];

    var log = document.createElement("pre");
    document.body.appendChild(log);

    function printError(msg) {
    var message = document.createElement("span");
    message.style.color = "red";
    message.textContent = msg + "\n";

    log.appendChild(message);
    }

    function printSuccess(msg) {
    var message = document.createElement("span");
    message.style.color = "green";
    message.textContent = msg + "\n";

    log.appendChild(message);
    }

    yes.forEach(function(s) {
    if (!isDataURL(s)) {
    throw "Assertion failed: " + s;
    printError("Expected yes, got no: " + s);
    }
    else {
    console.log("Matched as expected ", s);
    else {
    printSuccess("Expected yes, got yes: " + s);
    }
    });

    no.forEach(function(s) {
    if (isDataURL(s)) {
    throw "Assertion failed: " + s;
    printError("Expected no, got yes: " + s);
    }
    else {
    console.log("Matched as expected ", s);
    printSuccess("Expected no, got no: " + s);
    }
    });

    });
    1 change: 0 additions & 1 deletion uri-data-syntax.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@

    ## [Syntax](http://tools.ietf.org/html/rfc2397#page-2)

    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
  3. @bgrins bgrins revised this gist Aug 9, 2013. 1 changed file with 1 addition and 2 deletions.
    3 changes: 1 addition & 2 deletions uri-data-syntax.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,5 @@


    ** [Syntax](http://tools.ietf.org/html/rfc2397#page-2) **
    ## [Syntax](http://tools.ietf.org/html/rfc2397#page-2)

    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
    mediatype := [ type "/" subtype ] *( ";" parameter )
  4. @bgrins bgrins revised this gist Aug 9, 2013. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions uri-data-syntax.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    http://tools.ietf.org/html/rfc2397#page-2

    # Syntax

    ** [Syntax](http://tools.ietf.org/html/rfc2397#page-2) **

    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
    mediatype := [ type "/" subtype ] *( ";" parameter )
  5. @bgrins bgrins revised this gist Aug 9, 2013. 1 changed file with 13 additions and 13 deletions.
    26 changes: 13 additions & 13 deletions uri-data-syntax.md
    Original file line number Diff line number Diff line change
    @@ -1,22 +1,22 @@
    http://tools.ietf.org/html/rfc2397#page-2

    3. Syntax
    # Syntax

    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
    mediatype := [ type "/" subtype ] *( ";" parameter )
    data := *urlchar
    parameter := attribute "=" value

    where "urlchar" is imported from [RFC2396], and "type", "subtype",
    "attribute" and "value" are the corresponding tokens from [RFC2045],
    represented using URL escaped encoding of [RFC2396] as necessary.
    where "urlchar" is imported from [RFC2396], and "type", "subtype",
    "attribute" and "value" are the corresponding tokens from [RFC2045],
    represented using URL escaped encoding of [RFC2396] as necessary.

    Attribute values in [RFC2045] are allowed to be either represented as
    tokens or as quoted strings. However, within a "data" URL, the
    "quoted-string" representation would be awkward, since the quote mark
    is itself not a valid urlchar. For this reason, parameter values
    should use the URL Escaped encoding instead of quoted string if the
    parameter values contain any "tspecial".
    Attribute values in [RFC2045] are allowed to be either represented as
    tokens or as quoted strings. However, within a "data" URL, the
    "quoted-string" representation would be awkward, since the quote mark
    is itself not a valid urlchar. For this reason, parameter values
    should use the URL Escaped encoding instead of quoted string if the
    parameter values contain any "tspecial".

    The ";base64" extension is distinguishable from a content-type
    parameter by the fact that it doesn't have a following "=" sign.
    The ";base64" extension is distinguishable from a content-type
    parameter by the fact that it doesn't have a following "=" sign.
  6. @bgrins bgrins renamed this gist Aug 9, 2013. 1 changed file with 6 additions and 6 deletions.
    12 changes: 6 additions & 6 deletions syntax.md → uri-data-syntax.md
    Original file line number Diff line number Diff line change
    @@ -1,11 +1,11 @@
    [http://tools.ietf.org/html/rfc2397#page-2]
    http://tools.ietf.org/html/rfc2397#page-2

    3. Syntax

    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
    mediatype := [ type "/" subtype ] *( ";" parameter )
    data := *urlchar
    parameter := attribute "=" value
    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
    mediatype := [ type "/" subtype ] *( ";" parameter )
    data := *urlchar
    parameter := attribute "=" value

    where "urlchar" is imported from [RFC2396], and "type", "subtype",
    "attribute" and "value" are the corresponding tokens from [RFC2045],
  7. @bgrins bgrins revised this gist Aug 9, 2013. 1 changed file with 22 additions and 0 deletions.
    22 changes: 22 additions & 0 deletions syntax.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,22 @@
    [http://tools.ietf.org/html/rfc2397#page-2]

    3. Syntax

    dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
    mediatype := [ type "/" subtype ] *( ";" parameter )
    data := *urlchar
    parameter := attribute "=" value

    where "urlchar" is imported from [RFC2396], and "type", "subtype",
    "attribute" and "value" are the corresponding tokens from [RFC2045],
    represented using URL escaped encoding of [RFC2396] as necessary.

    Attribute values in [RFC2045] are allowed to be either represented as
    tokens or as quoted strings. However, within a "data" URL, the
    "quoted-string" representation would be awkward, since the quote mark
    is itself not a valid urlchar. For this reason, parameter values
    should use the URL Escaped encoding instead of quoted string if the
    parameter values contain any "tspecial".

    The ";base64" extension is distinguishable from a content-type
    parameter by the fact that it doesn't have a following "=" sign.
  8. @bgrins bgrins revised this gist Aug 9, 2013. 1 changed file with 2 additions and 4 deletions.
    6 changes: 2 additions & 4 deletions test.js
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@

    var yes = [
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC",
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC",
    @@ -20,8 +19,8 @@ var no = [
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC"
    ];

    yes.forEach(function(s) {

    yes.forEach(function(s) {
    if (!isDataURL(s)) {
    throw "Assertion failed: " + s;
    }
    @@ -31,12 +30,11 @@ yes.forEach(function(s) {
    });

    no.forEach(function(s) {

    if (isDataURL(s)) {
    throw "Assertion failed: " + s;
    }
    else {
    console.log("Matched as expected ", s);
    }

    });

  9. @bgrins bgrins revised this gist Aug 9, 2013. 2 changed files with 16 additions and 16 deletions.
    3 changes: 1 addition & 2 deletions detectDataURL.js
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,3 @@

    // Detecting data URLs
    // data URI - MDN https://developer.mozilla.org/en-US/docs/data_URIs
    // The "data" URL scheme: http://tools.ietf.org/html/rfc2397
    @@ -7,4 +6,4 @@
    function isDataURL(s) {
    return !!s.match(isDataURL.regex);
    }
    isDataURL.regex = /^\s*data:([a-z]+\/[a-z]+)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%]*\s*$/i;
    isDataURL.regex = /^\s*data:([a-z]+\/[a-z]+)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
    29 changes: 15 additions & 14 deletions test.js
    Original file line number Diff line number Diff line change
    @@ -1,22 +1,23 @@


    var yes = [
    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC",
    " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC ",
    " data:,Hello%2C%20World!",
    " data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D",
    " data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E",
    "data:,A%20brief%20note"
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC",
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC",
    " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC ",
    " data:,Hello%2C%20World!",
    " data:,Hello World!",
    " data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D",
    " data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E",
    "data:,A%20brief%20note"
    ];

    var no = [
    "dataxbase64",
    'data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
    '',
    'http://wikipedia.org',
    'base64',
    'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC'
    "dataxbase64",
    "data:HelloWorld",
    "data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC",
    "",
    "http://wikipedia.org",
    "base64",
    "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC"
    ];

    yes.forEach(function(s) {
  10. @bgrins bgrins created this gist Aug 9, 2013.
    10 changes: 10 additions & 0 deletions detectDataURL.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,10 @@

    // Detecting data URLs
    // data URI - MDN https://developer.mozilla.org/en-US/docs/data_URIs
    // The "data" URL scheme: http://tools.ietf.org/html/rfc2397
    // Valid URL Characters: http://tools.ietf.org/html/rfc2396#section2

    function isDataURL(s) {
    return !!s.match(isDataURL.regex);
    }
    isDataURL.regex = /^\s*data:([a-z]+\/[a-z]+)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%]*\s*$/i;
    41 changes: 41 additions & 0 deletions test.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@


    var yes = [
    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC",
    " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIBAMAAAA2IaO4AAAAFVBMVEXk5OTn5+ft7e319fX29vb5+fn///++GUmVAAAALUlEQVQIHWNICnYLZnALTgpmMGYIFWYIZTA2ZFAzTTFlSDFVMwVyQhmAwsYMAKDaBy0axX/iAAAAAElFTkSuQmCC ",
    " data:,Hello%2C%20World!",
    " data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D",
    " data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E",
    "data:,A%20brief%20note"
    ];

    var no = [
    "dataxbase64",
    'data:base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
    '',
    'http://wikipedia.org',
    'base64',
    'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD///+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4Ug9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC'
    ];

    yes.forEach(function(s) {

    if (!isDataURL(s)) {
    throw "Assertion failed: " + s;
    }
    else {
    console.log("Matched as expected ", s);
    }
    });

    no.forEach(function(s) {

    if (isDataURL(s)) {
    throw "Assertion failed: " + s;
    }
    else {
    console.log("Matched as expected ", s);
    }

    });