rubyfy
Version:
Easily write ruby annotations and output it as HTML.
55 lines (48 loc) • 1.46 kB
JavaScript
const document = require('global/document')
module.exports = class Renderer {
constructor({ openRp = '(', closeRp = ')' } = {}) {
this.openRp = openRp
this.closeRp = closeRp
}
render(objects) {
let { openRp, closeRp } = this
if (objects == null) {
return
}
if (!Array.isArray(objects)) {
throw new TypeError("objects must be an array")
}
return objects.map(obj => this.renderSingle(obj))
}
renderSingle(single) {
const { openRp, closeRp } = this
if (typeof single === 'string' || typeof single === 'number') {
return document.createTextNode(single)
}
if (!single.rb) {
return single
}
if (!(single.rt && single.rt.length)) {
return document.createTextNode(single.rb)
}
let ret = document.createElement('ruby')
appendText(ret, single.rb)
if (openRp.length) {
let openRpElement = document.createElement('rp')
appendText(openRpElement, openRp)
ret.appendChild(openRpElement)
}
let rtElement = document.createElement('rt')
appendText(rtElement, single.rt)
ret.appendChild(rtElement)
if (closeRp.length) {
let closeRpElement = document.createElement('rp')
appendText(closeRpElement, closeRp)
ret.appendChild(closeRpElement)
}
return ret
}
}
function appendText(node, text) {
node.appendChild(document.createTextNode(text))
}