meta.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import _ from 'lodash'
  2. // cache for parsed values
  3. window.metaAttributesCache = window.metaAttributesCache || new Map()
  4. export default function getMeta(name, fallback) {
  5. if (window.metaAttributesCache.has(name)) {
  6. return window.metaAttributesCache.get(name)
  7. }
  8. const element = document.head.querySelector(`meta[name="${name}"]`)
  9. if (!element) {
  10. return fallback
  11. }
  12. const plainTextValue = element.content
  13. let value
  14. switch (element.dataset.type) {
  15. case 'boolean':
  16. // in pug: content=false -> no content field
  17. // in pug: content=true -> empty content field
  18. value = element.hasAttribute('content')
  19. break
  20. case 'json':
  21. if (!plainTextValue) {
  22. // JSON.parse('') throws
  23. value = undefined
  24. } else {
  25. value = JSON.parse(plainTextValue)
  26. }
  27. break
  28. default:
  29. value = plainTextValue
  30. }
  31. window.metaAttributesCache.set(name, value)
  32. return value
  33. }
  34. function convertMetaToWindowAttributes() {
  35. window.data = window.data || {}
  36. Array.from(document.querySelectorAll('meta[name^="ol-"]'))
  37. .map(element => element.name)
  38. // process short labels before long ones:
  39. // e.g. assign 'sharelatex' before 'sharelatex.templates'
  40. .sort()
  41. .forEach(nameWithNamespace => {
  42. const label = nameWithNamespace.slice('ol-'.length)
  43. _.set(window, label, getMeta(nameWithNamespace))
  44. _.set(window.data, label, getMeta(nameWithNamespace))
  45. })
  46. }
  47. convertMetaToWindowAttributes()