index.coffee 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. # Загрузка стилей компонента
  2. document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" page="Page">'+stylFns['app/pages/Page/index.styl']+'</style>')
  3. module.exports =
  4. name: 'PageView'
  5. render: (new Function '_ctx', '_cache', renderFns['app/pages/Page/index.pug'])()
  6. data: ->
  7. page: null
  8. loading: true
  9. error: null
  10. processedContent: ''
  11. components: {}
  12. beforeMount: ->
  13. @loadPageData()
  14. methods:
  15. # Загрузка данных страницы
  16. loadPageData: ->
  17. try
  18. @loading = true
  19. pageId = @$route.params.id
  20. if pageId
  21. # Загрузка конкретной страницы по ID
  22. @page = await AppDB.getDocumentById(pageId)
  23. else
  24. # Загрузка по slug из пути
  25. slug = @$route.path.replace(/^\//, '')
  26. @page = await @findPageBySlug(slug)
  27. if @page
  28. @processPageContent()
  29. else
  30. @error = "Страница не найдена"
  31. @loading = false
  32. catch error
  33. @error = "Ошибка загрузки страницы: "+error
  34. @loading = false
  35. # Поиск страницы по slug
  36. findPageBySlug: (slug) ->
  37. try
  38. result = await AppDB.db.query('multilingual_content/published_by_domain_language', {
  39. startkey: [_.currentDomain, _.currentLanguage, 'page']
  40. endkey: [_.currentDomain, _.currentLanguage, 'page', {}]
  41. include_docs: true
  42. })
  43. for row in result.rows
  44. doc = row.doc
  45. pageSlug = AppDB.multilingual.getText(doc.slug, '')
  46. if pageSlug == slug
  47. return AppDB.processMultilingualDocument(doc)
  48. return null
  49. catch error
  50. debug.log "Ошибка поиска страницы по slug: "+error
  51. return null
  52. # Обработка контента с компонентами
  53. processPageContent: ->
  54. if not @page?.content
  55. @processedContent = ''
  56. return
  57. # Получаем контент для текущего языка
  58. content = AppDB.multilingual.getText(@page.content, '')
  59. # Обрабатываем компоненты в Markdown
  60. @processedContent = @parseComponents(content)
  61. # Парсинг компонентов в Markdown
  62. parseComponents: (content) ->
  63. # Регулярное выражение для поиска компонентов
  64. componentPattern = /\[component\s+name="([^"]+)"\s*(?:props='([^']*)')?\s*\]/g
  65. # Заменяем компоненты на HTML-разметку
  66. processedContent = content.replace componentPattern, (match, componentName, propsJson = '{}') =>
  67. try
  68. props = JSON.parse(propsJson)
  69. catch
  70. props = {}
  71. # Создаем уникальный ID для компонента
  72. componentId = "component_"+Math.random().toString(36).substr(2, 9)
  73. # Регистрируем компонент для рендеринга
  74. @components[componentId] = {
  75. name: componentName
  76. props: props
  77. }
  78. # Возвращаем placeholder для Vue компонента
  79. return '<div class="dynamic-component" data-component-id="'+componentId+'"></div>'
  80. return processedContent
  81. # Рендеринг динамических компонентов
  82. renderDynamicComponents: ->
  83. elements = document.querySelectorAll('.dynamic-component')
  84. for element in elements
  85. componentId = element.getAttribute('data-component-id')
  86. componentInfo = @components[componentId]
  87. if componentInfo
  88. try
  89. # Загружаем компонент динамически
  90. componentModule = await @loadComponent(componentInfo.name)
  91. if componentModule
  92. # Создаем и монтируем компонент
  93. componentInstance = Vue.createAppComponent(
  94. componentModule.default or componentModule
  95. componentInfo.props
  96. )
  97. componentInstance.mount(element)
  98. catch error
  99. debug.log "Ошибка загрузки компонента "+componentInfo.name+": "+error
  100. # Динамическая загрузка компонента
  101. loadComponent: (componentName) ->
  102. # Преобразуем имя компонента в путь
  103. componentPath = @getComponentPath(componentName)
  104. try
  105. return await import(componentPath)
  106. catch error
  107. debug.log "Компонент не найден: "+componentPath
  108. return null
  109. # Получение пути к компоненту
  110. getComponentPath: (componentName) ->
  111. # Базовая карта компонентов
  112. componentMap =
  113. 'HeroSection': '@/app/shared/HeroSection'
  114. 'ImageGallery': '@/app/shared/ImageGallery'
  115. 'ContactForm': '@/app/shared/ContactForm'
  116. 'EventList': '@/app/shared/EventList'
  117. 'Testimonials': '@/app/shared/Testimonials'
  118. return componentMap[componentName] or '@/app/shared/'+componentName
  119. # Получение текста с учетом языка
  120. getText: (textArray) ->
  121. return AppDB.multilingual.getText(textArray, '')
  122. mounted: ->
  123. # Рендерим динамические компоненты после монтирования
  124. @$nextTick =>
  125. @renderDynamicComponents()
  126. watch:
  127. '$route': 'loadPageData'
  128. '_.currentLanguage': 'loadPageData'