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.
70 lines (60 loc) • 1.79 kB
JavaScript
import { forEach, isBoolean, isNumber, isString } from '../util'
import { DefaultDOMElement } from '../dom'
import DOMExporter from './DOMExporter'
/*
Base class for custom XML exporters. If you want to use HTML as your
exchange format see {@link model/HTMLExporter}.
*/
class XMLExporter extends DOMExporter {
constructor(config, context) {
super(_defaultConfig(config), context)
}
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: 'id'
}, config)
if (!config.elementFactory) {
config.elementFactory = DefaultDOMElement.createDocument('xml')
}
return config
}
const defaultAnnotationConverter = {
tagName: 'annotation',
export: function(node, el) {
el.attr('type', node.type)
const properties = node.toJSON()
forEach(properties, function(value, name) {
if (name === 'id' || name === 'type') return
if (isString(value) || isNumber(value) || isBoolean(value)) {
el.attr(name, value)
}
})
}
}
const defaultBlockConverter = {
tagName: 'block',
export: function(node, el, converter) {
el.attr('type', node.type)
const properties = node.toJSON()
forEach(properties, function(value, name) {
if (name === 'id' || name === 'type') {
return
}
const prop = converter.$$(name)
if (node.getPropertyType(name) === 'string') {
prop.append(converter.annotatedText([node.id, name]))
} else {
prop.text(value)
}
el.append(prop)
})
}
}
export default XMLExporter