overleaf/services/web/frontend/js/utils/meta.js

51 lines
1.5 KiB
JavaScript
Raw Normal View History

import _ from 'lodash'
// cache for parsed values
window.metaAttributesCache = window.metaAttributesCache || new Map()
export default function getMeta(name, fallback) {
if (window.metaAttributesCache.has(name)) {
return window.metaAttributesCache.get(name)
}
const element = document.head.querySelector(`meta[name="${name}"]`)
if (!element) {
return fallback
}
const plainTextValue = element.content
let value
switch (element.dataset.type) {
case 'boolean':
// in pug: content=false -> no content field
// in pug: content=true -> empty content field
value = element.hasAttribute('content')
break
case 'json':
if (!plainTextValue) {
// JSON.parse('') throws
value = undefined
} else {
value = JSON.parse(plainTextValue)
}
break
default:
value = plainTextValue
}
window.metaAttributesCache.set(name, value)
return value
}
function convertMetaToWindowAttributes() {
window.data = window.data || {}
Array.from(document.querySelectorAll('meta[name^="ol-"]'))
.map(element => element.name)
// process short labels before long ones:
// e.g. assign 'sharelatex' before 'sharelatex.templates'
.sort()
.forEach(nameWithNamespace => {
const label = nameWithNamespace.slice('ol-'.length)
_.set(window, label, getMeta(nameWithNamespace))
_.set(window.data, label, getMeta(nameWithNamespace))
})
}
convertMetaToWindowAttributes()