@docsector/docsector-reader 0.5.6 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/docsector.js CHANGED
@@ -11,9 +11,9 @@
11
11
  * docsector help — Show help information
12
12
  */
13
13
 
14
- import { execSync, spawn } from 'child_process'
14
+ import { spawn } from 'child_process'
15
15
  import { existsSync, mkdirSync, writeFileSync, copyFileSync } from 'fs'
16
- import { resolve, dirname, basename } from 'path'
16
+ import { resolve, dirname } from 'path'
17
17
  import { fileURLToPath } from 'url'
18
18
 
19
19
  const __filename = fileURLToPath(import.meta.url)
@@ -23,7 +23,7 @@ const packageRoot = resolve(__dirname, '..')
23
23
  const args = process.argv.slice(2)
24
24
  const command = args[0]
25
25
 
26
- const VERSION = '0.5.4'
26
+ const VERSION = '0.5.8'
27
27
 
28
28
  const HELP = `
29
29
  Docsector Reader v${VERSION}
@@ -71,7 +71,7 @@ function getTemplatePackageJson (name) {
71
71
  serve: 'docsector serve'
72
72
  },
73
73
  dependencies: {
74
- '@docsector/docsector-reader': '^0.5.4',
74
+ '@docsector/docsector-reader': '^0.5.8',
75
75
  '@quasar/extras': '^1.16.12',
76
76
  'quasar': '^2.16.6',
77
77
  'vue': '^3.5.13',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@docsector/docsector-reader",
3
- "version": "0.5.6",
3
+ "version": "0.5.8",
4
4
  "description": "A documentation rendering engine built with Vue 3, Quasar v2 and Vite. Transform Markdown into beautiful, navigable documentation sites.",
5
5
  "productName": "Docsector Reader",
6
6
  "author": "Rodrigo de Araujo Vieira",
@@ -78,6 +78,19 @@ const getPageStatusTooltip = (status) => {
78
78
  return t('menu.status.empty.tooltip')
79
79
  }
80
80
  }
81
+
82
+ const normalizePath = (path) => {
83
+ if (!path) {
84
+ return '/'
85
+ }
86
+
87
+ const normalized = String(path).replace(/\/+$/, '')
88
+ return normalized === '' ? '/' : normalized
89
+ }
90
+
91
+ const isMenuItemActive = (path) => {
92
+ return normalizePath(path) === normalizePath($route.path)
93
+ }
81
94
  </script>
82
95
 
83
96
  <template>
@@ -90,7 +103,7 @@ const getPageStatusTooltip = (status) => {
90
103
 
91
104
  <q-item
92
105
  :to="subitem.path + '/overview'"
93
- :active="subitem.path + subpage === $route.path"
106
+ :active="isMenuItemActive(subitem.path + subpage)"
94
107
  v-show="founds[subitem.path] || !founds"
95
108
  >
96
109
  <q-item-section side>
@@ -1,5 +1,5 @@
1
1
  <script setup>
2
- import { ref, computed, onMounted } from 'vue'
2
+ import { ref, computed, onMounted, onBeforeUnmount } from 'vue'
3
3
  import { useStore } from 'vuex'
4
4
  import { useRoute, useRouter } from 'vue-router'
5
5
  import { useQuasar } from 'quasar'
@@ -89,7 +89,75 @@ const resetPageScroll = () => {
89
89
  }
90
90
  }
91
91
 
92
+ const getPageScrollContainer = () => {
93
+ return pageScrollArea.value?.$el?.querySelector('.q-scrollarea__container') || null
94
+ }
95
+
96
+ const isEditableTarget = (target) => {
97
+ if (!(target instanceof HTMLElement)) {
98
+ return false
99
+ }
100
+
101
+ if (target.isContentEditable) {
102
+ return true
103
+ }
104
+
105
+ return ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)
106
+ }
107
+
108
+ const handleMainScrollKeys = (event) => {
109
+ const handledKeys = ['Home', 'End', 'PageUp', 'PageDown']
110
+
111
+ if (!handledKeys.includes(event.key)) {
112
+ return
113
+ }
114
+
115
+ if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey) {
116
+ return
117
+ }
118
+
119
+ if (isEditableTarget(event.target)) {
120
+ return
121
+ }
122
+
123
+ const container = getPageScrollContainer()
124
+ if (!container) {
125
+ return
126
+ }
127
+
128
+ const currentTop = container.scrollTop
129
+ const maxTop = Math.max(0, container.scrollHeight - container.clientHeight)
130
+ const pageStep = Math.max(120, Math.floor(container.clientHeight * 0.9))
131
+
132
+ let nextTop = currentTop
133
+ switch (event.key) {
134
+ case 'Home':
135
+ nextTop = 0
136
+ break
137
+ case 'End':
138
+ nextTop = maxTop
139
+ break
140
+ case 'PageUp':
141
+ nextTop = Math.max(0, currentTop - pageStep)
142
+ break
143
+ case 'PageDown':
144
+ nextTop = Math.min(maxTop, currentTop + pageStep)
145
+ break
146
+ }
147
+
148
+ event.preventDefault()
149
+
150
+ if (pageScrollArea.value?.setScrollPosition) {
151
+ pageScrollArea.value.setScrollPosition('vertical', nextTop, 0)
152
+ return
153
+ }
154
+
155
+ container.scrollTop = nextTop
156
+ }
157
+
92
158
  onMounted(() => {
159
+ window.addEventListener('keydown', handleMainScrollKeys)
160
+
93
161
  router.beforeEach((to, from, next) => {
94
162
  resetPageScroll()
95
163
 
@@ -102,6 +170,10 @@ onMounted(() => {
102
170
  next()
103
171
  })
104
172
  })
173
+
174
+ onBeforeUnmount(() => {
175
+ window.removeEventListener('keydown', handleMainScrollKeys)
176
+ })
105
177
  </script>
106
178
 
107
179
  <template>
package/src/store/App.js CHANGED
@@ -18,14 +18,18 @@ export default {
18
18
  const base = firstRoutePath.substr(1)
19
19
  let relative = secondRoutePath.substr(firstRoutePath.length)
20
20
 
21
- commit('page/setBase', base, { root: true })
22
- commit('page/setRelative', relative, { root: true })
23
- commit('page/setAbsolute', base + relative, { root: true })
21
+ if (relative !== '/') {
22
+ relative = relative.replace(/\/+$/, '')
23
+ }
24
24
 
25
25
  if (relative === '/' || relative === '') {
26
26
  relative = '/overview'
27
27
  }
28
28
 
29
+ commit('page/setBase', base, { root: true })
30
+ commit('page/setRelative', relative, { root: true })
31
+ commit('page/setAbsolute', base + relative, { root: true })
32
+
29
33
  if (firstRoutePath) {
30
34
  const i18nBase = base.replace(/_$/, '').replace(/\//g, '.')
31
35
  const i18nRelative = relative.replace(/_$/, '').replace(/\//g, '.')