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;