Skip to content
Grav 2.0 is officially stable. Read the announcement →

Community guidelines

Please keep discussions civil and on-topic. Repeated violations may lead to a temporary ban.

Support

Embed SVG inline

Started by Gerhard Sitzmann 9 years ago · 6 replies · 3956 views
9 years ago

Hello,
I'm trying to embed SVG graphics as inline SVG that are saved as page media files.

I know, that I can embed them as <img> with something like
{{ angebot.media.files|first.html('', '', 'img-responsive icon svg') }}

But this won't let me manipulate the SVG via CSS.
I need to have the SVG code inline in the DOM.

I searched, but all I could find was the TWIG
{{ source('my-svg.svg') }}
which only works for files that are inside the template directory.

In PHP I would use file_get_contents. But for TWIG I couldn't find an equivalent that works with files outside of the templates directory.

Is there some filter or function or an existing plugin that I can use or would I have to write a plugin?

9 years ago

I use that script : this will turn your image into an inline SVG including all attributes, like IDs, classes, width and height which you can now easily target using CSS
It works very well, i use it in all my procjects

PHP
jQuery(document).ready(function ($) {
    $(function(){
    jQuery('img.svg').each(function(){
        var $img = jQuery(this);
        var imgID = $img.attr('id');
        var imgClass = $img.attr('class');
        var imgURL = $img.attr('src');

        jQuery.get(imgURL, function(data) {
            // Get the SVG tag, ignore the rest
            var $svg = jQuery(data).find('svg');

            // Add replaced image's ID to the new SVG
            if(typeof imgID !== 'undefined') {
                $svg = $svg.attr('id', imgID);
            }
            // Add replaced image's classes to the new SVG
            if(typeof imgClass !== 'undefined') {
                $svg = $svg.attr('class', imgClass+' replaced-svg');
            }

            // Remove any invalid XML tags as per http://validator.w3.org
            $svg = $svg.removeAttr('xmlns:a');

            // Check if the viewport is set, else we gonna set it if we can.
            if(!$svg.attr('viewBox') && $svg.attr('height') && $svg.attr('width')) {
                $svg.attr('viewBox', '0 0 ' + $svg.attr('height') + ' ' + $svg.attr('width'))
            }

            // Replace image with new SVG
            $img.replaceWith($svg);

        }, 'xml');    
    });
    });
});

EDIT : don't forget to add svg classe name to img

last edited 10/02/17 by Dimitri Longo
9 years ago

You could write your own twig extension for that.

9 years ago

But you would have the external requests though, since you're downloading the images via ajax.

9 years ago

@dimitrilongo Thank you for the suggestion. Actually I was using a JS solution but having display problems that I can't resolve. This is why I would like to embed the SVGs via Twig.

@chris_jung I was hoping there was a Twig extension that I can use. I'll look into writing my own.

8 years ago

See this thread: /forum/themes-styling/included-grav-logo-svg-missing-on-extending-theme-t7522?u=mahish

Suggested topics

Topic Participants Replies Views Activity
Support · by Thomas, 1 week ago
2 56 14 hours ago
Support · by Anna, 3 days ago
2 61 17 hours ago
Support · by Justin Young, 18 hours ago
1 32 17 hours ago
Support · by Duc , 1 week ago
2 66 5 days ago
Support · by Colin Hume, 1 week ago
2 59 6 days ago