mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 02:00:43 +00:00
Fix rendering of exported SVG (#2794)
Replace invalid characters in attribute value; fixes the error
Unescaped '<' not allowed in attributes values
Fixes #2534
This commit is contained in:
@@ -3,6 +3,7 @@ import { connect } from 'react-redux';
|
||||
import classNames from 'classnames';
|
||||
|
||||
import { enterEdge, leaveEdge } from '../actions/app-actions';
|
||||
import { encodeIdAttribute, decodeIdAttribute } from '../utils/dom-utils';
|
||||
|
||||
class Edge extends React.Component {
|
||||
|
||||
@@ -19,7 +20,7 @@ class Edge extends React.Component {
|
||||
|
||||
return (
|
||||
<g
|
||||
id={id} className={className}
|
||||
id={encodeIdAttribute(id)} className={className}
|
||||
onMouseEnter={this.handleMouseEnter}
|
||||
onMouseLeave={this.handleMouseLeave}
|
||||
>
|
||||
@@ -35,11 +36,11 @@ class Edge extends React.Component {
|
||||
}
|
||||
|
||||
handleMouseEnter(ev) {
|
||||
this.props.enterEdge(ev.currentTarget.id);
|
||||
this.props.enterEdge(decodeIdAttribute(ev.currentTarget.id));
|
||||
}
|
||||
|
||||
handleMouseLeave(ev) {
|
||||
this.props.leaveEdge(ev.currentTarget.id);
|
||||
this.props.leaveEdge(decodeIdAttribute(ev.currentTarget.id));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,13 +20,14 @@ import {
|
||||
octagonShapeProps,
|
||||
cloudShapeProps,
|
||||
} from '../utils/node-shape-utils';
|
||||
import { encodeIdAttribute } from '../utils/dom-utils';
|
||||
|
||||
|
||||
function NodeShape(shapeType, shapeElement, shapeProps, { id, highlighted, color, metric }) {
|
||||
const { height, hasMetric, formattedValue } = getMetricValue(metric);
|
||||
const className = classNames('shape', `shape-${shapeType}`, { metrics: hasMetric });
|
||||
const metricStyle = { fill: getMetricColor(metric) };
|
||||
const clipId = `metric-clip-${id}`;
|
||||
const clipId = encodeIdAttribute(`metric-clip-${id}`);
|
||||
|
||||
return (
|
||||
<g className={className}>
|
||||
|
||||
15
client/app/scripts/utils/__tests__/dom-utils-test.js
Normal file
15
client/app/scripts/utils/__tests__/dom-utils-test.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import { encodeIdAttribute, decodeIdAttribute } from '../dom-utils';
|
||||
|
||||
describe('DomUtils', () => {
|
||||
describe('encodeIdAttribute/decodeIdAttribute', () => {
|
||||
it('encode should be reversible by decode ', () => {
|
||||
[
|
||||
'123-abc;<foo>',
|
||||
';;<<><>',
|
||||
'!@#$%^&*()+-\'"',
|
||||
].forEach((input) => {
|
||||
expect(decodeIdAttribute(encodeIdAttribute(input))).toEqual(input);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
16
client/app/scripts/utils/dom-utils.js
Normal file
16
client/app/scripts/utils/dom-utils.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Cleans up a value to be used as an element ID.
|
||||
*
|
||||
* Encodes invalid characters to be valid in XHTML and makes it
|
||||
* so that it can be reversed by {@link decodeIdAttribute}.
|
||||
*/
|
||||
export function encodeIdAttribute(id) {
|
||||
return id.replace(/[<>&;]/gm, m => `__u${m.charCodeAt(0)}__`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverts {@link encodeIdAttribute}.
|
||||
*/
|
||||
export function decodeIdAttribute(id) {
|
||||
return id.replace(/__u(\d+)__/gm, (m, d) => String.fromCharCode(d));
|
||||
}
|
||||
Reference in New Issue
Block a user