meta.js 1.3 KB

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