Newer
Older
import ReactHtmlParser from 'react-html-parser'
import { Link } from 'react-router-dom'
import Tooltip from '@material-ui/core/Tooltip'
export default class HTMLParser {
constructor (props) {
this.props = props
}
parseHTML (html) {
let transform
switch (this.props.HTMLParserTask) {
case 'addReactRouterLinks':
transform = this.addReactRouterLinks
break
case 'addAnnotationTooltips':
transform = this.addAnnotationTooltips
break
default:
transform = null
}
return ReactHtmlParser(html, { transform })
}
addReactRouterLinks (node, index) {
if (node.type === 'tag' && node.name === 'a') {
const href = node.attribs.href
const text = node.children[0].data
return <Link key={index} to={href}>{text}</Link>
}
}
processReferencedTerms = () => {
const { referencedTerm } = this.props
if (Array.isArray(referencedTerm)) {
this.referencedTermsObj = arrayToObject({ array: referencedTerm, keyField: 'id' })
}
}
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
addAnnotationTooltips = (node, index) => {
const props = this.props
if (node.type === 'tag' && node.name === 'span' && node.attribs.name === 'namedentity' && node.attribs['data-link'] !== '') {
const linkStr = node.attribs['data-link']
const occurrenceID = node.attribs['data-occurrence-id']
let tooltipJSX
if (linkStr.includes(',')) {
const uris = linkStr.split(',')
const listItemsJSX = []
uris.map((uri, index) => {
listItemsJSX.push(
<li key={index}>
<ul>
{this.renderAnnotation(uri)}
</ul>
</li>
)
})
tooltipJSX = (
<div className={props.classes.tooltipContent}>
<ol className={props.classes.tooltipList}>{listItemsJSX}</ol>
</div>
)
} else {
const uri = linkStr
tooltipJSX = (
<div className={props.classes.tooltipContent}>
<ul className={props.classes.tooltipList}>
{this.renderAnnotation(uri)}
</ul>
</div>
)
}
let text
if (node.children.length > 1 && node.children[1].name === 'a') {
const a = node.children[1]
text = a.children[0].data
} else {
text = node.children[0].data
}
return (
<Tooltip
key={occurrenceID}
title={tooltipJSX}
interactive
placement='top'
arrow
classes={{
tooltip: props.classes.tooltip
}}
>
<span style={{ color: 'red', cursor: 'pointer' }}>{text}</span>
</Tooltip>
)
}
}
renderAnnotation = uri => {
if (uri.startsWith('http://ldf.fi/ttp/')) {
const localID = uri.replace('http://ldf.fi/ttp/', '')
uri = `http://ldf.fi/ttp/${encodeURIComponent(localID)}`
}
return (
<>
<li><i><small>URI:</small></i> <a href={uri} target='_blank' rel='noopener noreferrer'>{this.referencedTermsObj[uri].id}</a></li>
<li><i><small>dctems:hasFormat:</small></i> <a href={this.referencedTermsObj[uri].format} target='_blank' rel='noopener noreferrer'>{this.referencedTermsObj[uri].format}</a></li>
<li><i><small>skos:prefLabel:</small></i> {this.referencedTermsObj[uri].prefLabel}</li>
<li><i><small>rdfs:comment:</small></i> {this.referencedTermsObj[uri].comment}</li>