diff --git a/spec/parser/javascript_spec.js b/spec/parser/javascript_spec.js index 7ac50bb..1225c2d 100644 --- a/spec/parser/javascript_spec.js +++ b/spec/parser/javascript_spec.js @@ -61,18 +61,32 @@ describe('parser/javascript.js', function() { this.parser.parsed.render.and.returnValue(this.renderPromise.promise); this.svgStyles = 'example styles'; - this.svg = Snap(document.createElement('svg')); - spyOn(this.svg, 'group').and.returnValue('example group'); + this.svgContainer = document.createElement('div'); }); - it('adds the svg styles to the svg element', function() { - this.parser.render(this.svg, this.svgStyles); - expect(this.svg.innerHTML).toEqual(''); + it('creates the SVG element', function() { + var svg; + + this.parser.render(this.svgContainer, this.svgStyles); + + svg = this.svgContainer.querySelector('svg'); + expect(svg.getAttribute('xmlns')).toEqual('http://www.w3.org/2000/svg'); + expect(svg.getAttribute('version')).toEqual('1.1'); + }); + + it('sets the styles on the SVG element', function() { + var styles; + + this.parser.render(this.svgContainer, this.svgStyles); + + styles = this.svgContainer.querySelector('svg defs style'); + expect(styles.getAttribute('type')).toEqual('text/css'); + expect(styles.firstChild.nodeValue).toEqual(this.svgStyles); }); it('render the parsed expression', function() { - this.parser.render(this.svg, this.svgStyles); - expect(this.parser.parsed.render).toHaveBeenCalledWith('example group'); + this.parser.render(this.svgContainer, this.svgStyles); + expect(this.parser.parsed.render).toHaveBeenCalled(); }); describe('when rendering is complete', function() { @@ -86,9 +100,7 @@ describe('parser/javascript.js', function() { height: 24 }); - spyOn(this.svg, 'attr'); - - this.parser.render(this.svg, this.svgStyles); + this.parser.render(this.svgContainer, this.svgStyles); this.renderPromise.resolve(this.result); setTimeout(done, 10); @@ -100,10 +112,10 @@ describe('parser/javascript.js', function() { }); it('sets the dimensions of the image', function() { - expect(this.svg.attr).toHaveBeenCalledWith({ - width: 62, - height: 44 - }); + var svg = this.svgContainer.querySelector('svg'); + + expect(svg.getAttribute('width')).toEqual('62'); + expect(svg.getAttribute('height')).toEqual('44'); }); }); diff --git a/spec/regexper_spec.js b/spec/regexper_spec.js index b011ec8..d19133f 100644 --- a/spec/regexper_spec.js +++ b/spec/regexper_spec.js @@ -15,7 +15,7 @@ describe('regexper.js', function() { '
', '
', '
', - '
', + '
', '
example styles
' ].join(''); @@ -429,7 +429,7 @@ describe('regexper.js', function() { }); it('renders the expression', function() { - expect(this.parser.render).toHaveBeenCalledWith(this.regexper.svg, this.regexper.svgStyles); + expect(this.parser.render).toHaveBeenCalledWith(this.regexper.svgContainer, this.regexper.svgStyles); }); }); diff --git a/src/index.html b/src/index.html index 9129c82..be48e1e 100644 --- a/src/index.html +++ b/src/index.html @@ -26,10 +26,7 @@ - -
- -
+
diff --git a/src/js/main.js b/src/js/main.js index d077ea0..8fe1f98 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -20,7 +20,7 @@ import _ from 'lodash'; element.className = _.compact([element.className, 'loading']).join(' '); element.innerHTML = [ - '', + '
', '
', '
', '
', @@ -28,7 +28,7 @@ import _ from 'lodash'; element.innerHTML ].join(''); - svg = element.querySelector('svg'); + svg = element.querySelector('.svg'); setTimeout(() => { parser.parse(element.getAttribute('data-expr')) diff --git a/src/js/parser/javascript.js b/src/js/parser/javascript.js index 39efcb9..1ac8652 100644 --- a/src/js/parser/javascript.js +++ b/src/js/parser/javascript.js @@ -32,16 +32,22 @@ export default class Parser { return deferred.promise; } - render(svgElement, styles) { - var svg; + render(containerElement, styles) { + var svg, + style = document.createElement('style'); - svgElement.innerHTML = [ - '' - ].join(''); + containerElement.innerHTML = ''; - svg = Snap(svgElement); + svg = Snap(containerElement.querySelector('svg')); + + style.setAttribute('type', 'text/css'); + if (style.styleSheet) { + style.styleSheet.cssText = styles; + } else { + style.appendChild(document.createTextNode(styles)); + } + + svg.select('defs').append(style); return this.parsed.render(svg.group()) .then(result => { diff --git a/src/js/regexper.js b/src/js/regexper.js index 3487f4d..9c5dd7e 100644 --- a/src/js/regexper.js +++ b/src/js/regexper.js @@ -13,7 +13,7 @@ export default class Regexper { this.permalink = root.querySelector('a[data-glyph="link-intact"]'); this.download = root.querySelector('a[data-glyph="data-transfer-download"]'); this.percentage = root.querySelector('#progress div'); - this.svg = root.querySelector('#regexp-render svg'); + this.svgContainer = root.querySelector('#regexp-render'); this.svgStyles = this.root.querySelector('#svg-styles').innerHTML; this.gaq = (typeof window._gaq === 'undefined') ? [] : window._gaq; @@ -108,7 +108,7 @@ export default class Regexper { updateLinks() { try { this.download.parentNode.style.display = null; - this.download.href = this.buildBlobURL(this.svg.parentNode.innerHTML); + this.download.href = this.buildBlobURL(this.svgContainer.innerHTML); } catch(e) { // Blobs or URLs created from them don't work here. @@ -158,7 +158,7 @@ export default class Regexper { throw message; }) - .invoke('render', this.svg, this.svgStyles) + .invoke('render', this.svgContainer, this.svgStyles) .then(() => { this.state = 'has-results'; this.updateLinks(); diff --git a/src/sass/main.scss b/src/sass/main.scss index 29b0aac..89f1de8 100644 --- a/src/sass/main.scss +++ b/src/sass/main.scss @@ -264,12 +264,17 @@ header { margin-left: -24px; } - svg { + .svg { position: absolute; top: -10000px; } } + .svg { + margin: 0; + text-align: center; + } + figcaption { @include adjust-font-size-to($base-font-size); background: $green;