Pure Javascript OCR for more than 100 Languages 📖🎉🖥
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

191 lines
4.6 KiB

function array_join(array, glue){
var new_array = []
for(var i = 0; i < array.length; i++){
new_array.push(array[i])
if(i != array.length - 1) new_array.push(glue);
}
return new_array
}
class Node extends React.Component {
constructor(props){
super(props)
this.state = {
expanded: props.expanded
}
}
toggleExpand = e => {
this.setState({expanded: !this.state.expanded})
}
render(){
var {node, label} = this.props
var {expanded} = this.state
var rep
if(typeof node === "string"){
rep = <TextNode html={label === "html"} node={node} className="clickable" onClick={this.toggleExpand} toggleExpand={this.toggleExpand} expanded={expanded}/>
}
else if(typeof node === "boolean"){
rep = <BooleanNode node={node} className="clickable" onClick={this.toggleExpand} toggleExpand={this.toggleExpand} expanded={expanded}/>
}
else if(typeof node === "number"){
rep = <NumberNode node={node} className="clickable" onClick={this.toggleExpand} toggleExpand={this.toggleExpand} expanded={expanded}/>
}
else if(Array.isArray(node)){
rep = <ListNode node={node} className="clickable" onClick={this.toggleExpand} toggleExpand={this.toggleExpand} expanded={expanded}/>
}
else {
rep = <ObjectNode node={node} className="clickable" onClick={this.toggleExpand} toggleExpand={this.toggleExpand} expanded={expanded}/>
}
if(!label){
return rep
}
return <span><span className="label clickable" onClick={this.toggleExpand}>{label}</span>: {rep}</span>
}
}
class TextNode extends React.Component {
render(){
var {node, expanded, html, toggleExpand} = this.props
if(expanded){
var content = node
if (html) {
var content = []
CodeMirror.runMode(node, {name: 'xml', htmlMode: true}, (text, className) => {
content.push(<span className={"cm-"+className}>{text}</span>)
})
}
return <span className={(html ? "cm-s-default html ":"") + "textNode expanded clickable"} onClick={toggleExpand} >{content}</span>
}
else{
return <span>
<span className={(html? "html " : "")+"textNode clickable"} onClick={toggleExpand} >{node.substring(0,30)}</span>
{node.length > 30 ? <span className="ellipsis">...</span> : ''}
</span>
}
}
}
class BooleanNode extends React.Component {
render(){
var {node} = this.props
return <span className="booleanNode">{JSON.stringify(node)}</span>
}
}
class NumberNode extends React.Component {
render(){
var {node} = this.props
return <span className="numberNode">{JSON.stringify(node)}</span>
}
}
class ListNode extends React.Component {
render(){
var {node, expanded, toggleExpand} = this.props
if(expanded){
return <span className="listNode expanded">
<span className="clickable" onClick={toggleExpand}>[</span>
<br />
<span className="indent">
{array_join(node.map((e, i) =>
<Node node={e} />
),<Comma br/>)}
</span>
<br />
<span onClick={toggleExpand}>]</span>
</span>
}
else{
return <span className="listNode clickable" onClick={toggleExpand}>[{node.length}]</span>
}
}
}
class ObjectNode extends React.Component {
render(){
var {node, expanded, toggleExpand} = this.props
if(null === node){
return <span className="nullNode">null</span>
}
else if(expanded){
return <span className="objectNode expanded">
<span className="clickable" onClick={toggleExpand}>{"{"}</span>
<br />
<span className="indent">
{array_join(Object.keys(node).map(
key => <Node node={node[key]} label={key} />
),<Comma br/>)}
</span>
<br />
<span onClick={toggleExpand}>{"}"}</span>
</span>
}
else{
var keys = Object.keys(node), toolong = false
if (keys.length > 4) {
keys = keys.slice(0,4)
toolong = true
}
var contents = array_join(keys.map(k => <span className="label">{k}</span>), <Comma />)
return <span className="objectNode clickable" onClick={toggleExpand} >{"{"}{contents}{toolong?<Ellipsis /> : ''}{"}"}</span>
}
}
}
class Comma extends React.Component {
render(){
var {br} = this.props
return <span className="comma">, {br?<br />:''}</span>
}
}
class Ellipsis extends React.Component {
render(){
return <span className="ellipsis">...</span>
}
}
var simplething = {
hello: 42,
derp: 324,
wumbo: [
1,
2,
3,
4,
"hello",
{
blah: 32,
asdf: [],
walp: 32,
strings: "asdfsd",
}
],
merp: {
blah: 32,
asdf: [],
walp: 32,
strings: "asdfsd",
},
strings: "asdfsd",
asdoijfo: {
strings: "asdfsd",
adfds: {
asdf: {
asdfadsf: {},
merp: 32
}
}
}
}
// React.render(<Node node={simplething} />, document.getElementById('explorer'))