substance
Version:
Substance is a JavaScript library for web-based content editing. It provides building blocks for realizing custom text editors and web-based publishing systems.
77 lines (64 loc) • 2 kB
JavaScript
import { forEach, isBoolean, isNumber, isString } from '../util'
import { DefaultDOMElement } from '../dom'
import DOMExporter from './DOMExporter'
/*
Base class for custom HTML exporters. If you want to use XML as your
exchange format see {@link model/XMLExporter}.
*/
class HTMLExporter extends DOMExporter {
constructor(config, context) {
super(_defaultConfig(config), context)
}
exportDocument(doc) {
let htmlEl = DefaultDOMElement.parseHTML('<html><head></head><body></body></html>')
return this.convertDocument(doc, htmlEl)
}
getDefaultBlockConverter() {
return defaultBlockConverter // eslint-disable-line no-use-before-define
}
getDefaultPropertyAnnotationConverter() {
return defaultAnnotationConverter // eslint-disable-line no-use-before-define
}
}
function _defaultConfig(config) {
config = Object.assign({
idAttribute: 'data-id'
}, config)
if (!config.elementFactory) {
config.elementFactory = DefaultDOMElement.createDocument('html')
}
return config
}
const defaultAnnotationConverter = {
tagName: 'span',
export: function(node, el) {
el.tagName = 'span'
el.attr('data-type', node.type)
var properties = node.toJSON()
forEach(properties, function(value, name) {
if (name === 'id' || name === 'type') return
if (isString(value) || isNumber(value) || isBoolean(value)) {
el.attr('data-'+name, value)
}
})
}
}
const defaultBlockConverter = {
export: function(node, el, converter) {
el.attr('data-type', node.type)
var properties = node.toJSON()
forEach(properties, function(value, name) {
if (name === 'id' || name === 'type') {
return
}
var prop = converter.$$('div').attr('property', name)
if (node.getPropertyType(name) === 'string' && value) {
prop.append(converter.annotatedText([node.id, name]))
} else {
prop.text(value)
}
el.append(prop)
})
}
}
export default HTMLExporter