--- /dev/null
+/**
+ * Created by onvelocity on 2/2/16.
+ */
+
+import React from 'react'
+import Prism from 'prismjs'
+import PureRenderMixin from 'react-addons-pure-render-mixin'
+
+import './JSONViewer.scss'
+
+const YAML = require('json2yaml');
+
+const cssString = `
+ html, body {
+ padding:0;
+ margin:0;
+ }
+ /*
+ copied from node_modules/prismjs/themes/prismjs.css
+ */
+ :not(pre) > code[class*="language-"],
+ pre[class*="language-"] {
+ font-size: 12px;
+ padding:1rem;
+ /*
+ border: 1px solid rgba(220, 220, 220, 0.5);
+ border-radius: 4px;
+ */
+ background-color: rgba(255, 255, 255, .25);
+ }
+
+ /* Inline code */
+ :not(pre) > code[class*="language-"] {
+ padding: .1em;
+ }
+
+ .token.comment,
+ .token.prolog,
+ .token.doctype,
+ .token.cdata {
+ color: slategray;
+ }
+
+ .token.punctuation {
+ color: #333;
+ }
+
+ .namespace {
+ opacity: .7;
+ }
+
+ .token.property,
+ .token.tag,
+ .token.boolean,
+ .token.number,
+ .token.constant,
+ .token.symbol,
+ .token.deleted {
+ color: #905;
+ }
+
+ .token.selector,
+ .token.attr-name,
+ .token.string,
+ .token.char,
+ .token.builtin,
+ .token.inserted {
+ color: #df5000;
+ }
+
+ .token.operator,
+ .token.entity,
+ .token.url,
+ .language-css .token.string,
+ .style .token.string {
+ color: #a67f59;
+ }
+
+ .token.atrule,
+ .token.attr-value,
+ .token.keyword {
+ color: #07a;
+ }
+
+ .token.function {
+ color: #DD4A68;
+ }
+
+ .token.regex,
+ .token.important,
+ .token.variable {
+ color: #e90;
+ }
+
+ .token.important,
+ .token.bold {
+ font-weight: bold;
+ }
+ .token.italic {
+ font-style: italic;
+ }
+
+ .token.entity {
+ cursor: help;
+ }
+`;
+
+const JSONViewer = React.createClass({
+ mixins: [PureRenderMixin],
+ getInitialState: function () {
+ return {};
+ },
+ getDefaultProps: function () {
+ return {};
+ },
+ componentWillMount: function () {
+ },
+ componentDidMount: function () {
+ },
+ componentDidUpdate: function () {
+ },
+ componentWillUnmount: function () {
+ },
+ render() {
+ const text = YAML.stringify(this.props.json, undefined, 12).replace(/ /g, ' ');
+ const result = Prism.highlight(text, Prism.languages.javascript, 'javascript');
+ return (
+ <div className="JSONViewer">
+ <style dangerouslySetInnerHTML={{__html: cssString}}></style>
+ <label className="descriptor">
+ <pre className="language-js">
+ <code dangerouslySetInnerHTML={{__html: result}} />
+ </pre>
+ </label>
+ </div>
+ );
+ }
+});
+
+export default JSONViewer;