@use "sass:math";
@use "sass:string";

/// URL-encode SVG markup for use as inline CSS content/uri
///
/// @author Jakob Eriksen
/// @link http://codepen.io/jakob-e/pen/doMoML
///
/// @param  {String} $svg - SVG markup to encode
/// @return {String}      - URL-encoded SVG data uri
@function svg-data-uri($svg) {
    $encoded: '';
    $slice: 2000;
    $index: 0;
    $loops: math.ceil(math.div(string.length($svg), $slice));

    @for $i from 1 through $loops {
        $chunk: string.slice($svg, $index, $index + $slice - 1);
        $chunk: _svg-data-uri-str-replace($chunk, '"', "'");
        $chunk: _svg-data-uri-str-replace($chunk, '<', '%3C');
        $chunk: _svg-data-uri-str-replace($chunk, '>', '%3E');
        $chunk: _svg-data-uri-str-replace($chunk, '&', '%26');
        $chunk: _svg-data-uri-str-replace($chunk, '#', '%23');
        $encoded: #{$encoded}#{$chunk};
        $index: $index + $slice;
    }

    @return url("data:image/svg+xml,#{$encoded}");
}

/// Replace substring within string
///
/// @author Hugo Giraudel
/// @link http://sassmeister.com/gist/1b4f2da5527830088e4d
///
/// @access private
/// @see svg-data-uri
///
/// @param  {String} $string       - Initial string
/// @param  {String} $search       - Substring to replace
/// @param  {String} $replace [''] - New value
/// @return {String}               - Updated string
@function _svg-data-uri-str-replace($string, $search, $replace: '') {
    $index: string.index($string, $search);

    @if $index {
        @return string.slice($string, 1, $index - 1) + $replace + _svg-data-uri-str-replace(string.slice($string, $index + string.length($search)), $search, $replace);
    }

    @return $string;
}
