all files / commonform-docx/templates/ run.js

100% Statements 50/50
100% Branches 36/36
100% Functions 6/6
100% Lines 50/50
1 statement, 1 branch Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 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               33×         66×     33×                   33×         33× 33×   33×   33× 20× 13× 10×                                       31×    
var escape = require('../escape')
var merge = require('merge')
var tag = require('./tag')
 
var defaults = {
  highlight: false,
  bold: false,
  italic: false,
  underline: false
}
 
var underlineFlag = function (underline) {
  return '<w:u w:val="' + (underline ? 'single' : 'none') + '"/>'
}
 
var highlightFlag = function (highlight) {
  return '<w:highlight w:val="' + highlight + '"/>'
}
 
var flag = function (name, value) {
  return value ? '<w:' + name + '/>' : ''
}
 
var runProperties = function (options) {
  return tag('w:rPr',
    (
      flag('b', options.bold || false) +
      flag('i', options.italic || false) +
      (options.highlight ? highlightFlag(options.highlight) : '') +
      underlineFlag(options.underline || false)
    )
  )
}
 
var runText = function (text) {
  return '<w:t xml:space="preserve">' + escape(text) + '</w:t>'
}
 
module.exports = function run (
  element, numberStyle, conspicuous, blanks
) {
  var properties = merge(true, defaults)
  if (conspicuous === true) {
    properties.italic = true
    properties.bold = true
  }
  var text = ''
  /* istanbul ignore else */
  if (typeof element === 'string') {
    text = element
  } else if (element.hasOwnProperty('caption')) {
    text = element.caption
    properties.underline = true
  } else if (element.hasOwnProperty('title')) {
    text = element.title
    properties.bold = true
  } else if (element.hasOwnProperty('definition')) {
    var term = element.definition
    return (
      run('"', numberStyle, conspicuous) +
      tag('w:r', runProperties({bold: true}) + runText(term)) +
      run('"', numberStyle, conspicuous)
    )
  } else if (element.hasOwnProperty('blank')) {
    if (element.blank !== undefined) {
      text = element.blank
    } else {
      text = blanks.text
      if (blanks.highlight) {
        properties.highlight = blanks.highlight
      }
    }
  } else if (element.hasOwnProperty('use')) {
    text = element.use
  } else Eif (element.hasOwnProperty('heading')) {
    var numbering = element.numbering
    var heading = element.heading
    if (
      element.hasOwnProperty('broken') ||
      element.hasOwnProperty('ambiguous')
    ) {
      text = '[Broken Cross-Reference to "' + heading + '"]'
      properties.highlight = 'red'
    } else {
      text = numberStyle(numbering)
      properties.underline = true
      return (
        // Underlined reference.
        tag('w:r', runProperties(properties) + runText(text)) +
        // Name of referenced section in parentheses.
        run(' (' + heading + ')', numberStyle, conspicuous)
      )
    }
  } else {
    throw new Error('Invalid type: ' + JSON.stringify(element, null, 2))
  }
  return tag('w:r', runProperties(properties) + runText(text))
}