print-js
Version:
A tiny javascript library to help printing from the web.
110 lines (83 loc) • 3.47 kB
JavaScript
export function addWrapper (htmlData, params) {
let bodyStyle = 'font-family:' + params.font + ' !important; font-size: ' + params.font_size + ' !important; width:100%;'
return '<div style="' + bodyStyle + '">' + htmlData + '</div>'
}
export function capitalizePrint (string) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
export function collectStyles (element, params) {
let win = document.defaultView || window
let styles = win.getComputedStyle
// String variable to hold styling for each element
let elementStyle = ''
// Optional - include margin and padding
if (params.honorMarginPadding) params.targetStyles.push('margin', 'padding')
// Optional - include color
if (params.honorColor) params.targetStyles.push('color')
// Loop over computed styles
styles = win.getComputedStyle(element, '')
Object.keys(styles).map(key => {
// Check if style should be processed
if (params.targetStyles === '*' || params.targetStyle.indexOf(styles[key]) !== -1 || targetStylesMatch(params.targetStyles, styles[key])) {
elementStyle += styles[key] + ':' + styles.getPropertyValue(styles[key]) + ';'
}
})
// Print friendly defaults
elementStyle += 'max-width: ' + params.maxWidth + 'px !important;' + params.font_size + ' !important;'
return elementStyle
}
function targetStylesMatch (styles, value) {
for (let i = 0; i < styles.length; i++) {
if (value.indexOf(styles[i]) !== -1) return true
}
return false
}
export function loopNodesCollectStyles (elements, params) {
for (let n = 0; n < elements.length; n++) {
let currentElement = elements[n]
// Check if we are skiping this element
if (params.ignoreElements.indexOf(currentElement.getAttribute('id')) !== -1) {
currentElement.parentNode.removeChild(currentElement)
continue
}
// Form Printing - check if is element Input
let tag = currentElement.tagName
if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') {
// Save style to variable
let textStyle = collectStyles(currentElement, params)
// Remove INPUT element and insert a text node
let parent = currentElement.parentNode
// Get text value
let textNode = tag === 'SELECT'
? document.createTextNode(currentElement.options[currentElement.selectedIndex].text)
: document.createTextNode(currentElement.value)
// Create text element
let textElement = document.createElement('div')
textElement.appendChild(textNode)
// Add style to text
textElement.setAttribute('style', textStyle)
// Add text
parent.appendChild(textElement)
// Remove input
parent.removeChild(currentElement)
} else {
// Get all styling for print element
currentElement.setAttribute('style', collectStyles(currentElement, params))
}
// Check if more elements in tree
let children = currentElement.children
if (children && children.length) {
loopNodesCollectStyles(children, params)
}
}
}
export function addHeader (printElement, header, headerStyle) {
// Create header element
let headerElement = document.createElement('h1')
// Create header text node
let headerNode = document.createTextNode(header)
// Build and style
headerElement.appendChild(headerNode)
headerElement.setAttribute('style', headerStyle)
printElement.insertBefore(headerElement, printElement.childNodes[0])
}