-
+
+
+
-
+
-
-
diff --git a/src/components/WordformsTable.vue b/src/components/WordformsTable.vue
index 1be0b35..224f14e 100644
--- a/src/components/WordformsTable.vue
+++ b/src/components/WordformsTable.vue
@@ -1,45 +1,10 @@
-
-
-
-
- | {{ __('surface_form') }} |
-
- {{ __(f) }}
- |
-
-
- |
-
-
- |
-
-
-
-
- |
- {{ wf.surface_form }}
-
- ({{ wf.alternatives.join(', ') }})
-
- |
-
- {{ format(f, wf[f]) }}
- |
-
-
-
-
-
-
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+function format(field: string, value: any): any {
+ switch (field) {
+ case 'subject':
+ case 'dir_obj':
+ case 'ind_obj':
+ if (value) {
+ return UI.agr(value)
+ }
+ break
+ case 'phonetic':
+ return value ? `/${value}/` : ''
+ default:
+ return value
+ }
+}
+
+
+
+
+
+
+ | {{ __('surface_form') }} |
+
+ {{ __(f) }}
+ |
+
+
+ |
+
+
+ |
+
+
+
+
+ |
+ {{ wf.surface_form }}
+
+ ({{ wf.alternatives.join(', ') }})
+
+ |
+
+ {{ format(f, wf[f]) }}
+ |
+
+
+
+
diff --git a/src/helpers/UI.ts b/src/helpers/UI.ts
index c19aa38..697c469 100644
--- a/src/helpers/UI.ts
+++ b/src/helpers/UI.ts
@@ -18,6 +18,6 @@ export function agr (obj: {person?: string, number?: string, gender?: string}):
let out = ''
if (obj.person) out += obj.person + ' '
if (obj.number) out += obj.number + ' '
- if (obj.gender) out += obj.gender // TODO localise gender?
+ if (obj.gender) out += obj.gender
return out.trim()
}
diff --git a/src/main.ts b/src/main.ts
index c486d4f..0985b17 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,19 +1,20 @@
-import Vue from 'vue'
-import App from './App.vue'
-import router from './router'
-import store from './store'
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import { configure } from 'vue-gtag'
-import VueGtag from 'vue-gtag'
+import 'bootstrap/js/dist/collapse';
-Vue.use(VueGtag, {
- config: { id: 'UA-34654961-2' },
- enabled: process.env.NODE_ENV === 'production'
-}, router)
+import App from './App.vue'
+import router from './router'
-Vue.config.productionTip = false
+if (import.meta.env.PROD) {
+ configure({
+ tagId: 'UA-34654961-2'
+ })
+}
-new Vue({
- router,
- store,
- render: h => h(App)
-}).$mount('#app')
+const app = createApp(App)
+const pinia = createPinia()
+app.use(pinia)
+app.use(router)
+app.mount('#app')
diff --git a/src/router/index.ts b/src/router/index.ts
index a1202c5..eee4429 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,5 +1,5 @@
-import Vue from 'vue'
-import VueRouter from 'vue-router'
+import { createRouter, createWebHistory } from 'vue-router'
+
import Home from '../views/Home.vue'
import Lexemes from '../views/Lexemes.vue'
import LexemeView from '../views/LexemeView.vue'
@@ -8,8 +8,6 @@ import RootView from '../views/RootView.vue'
import Sources from '../views/Sources.vue'
import NotFound from '../views/NotFound.vue'
-Vue.use(VueRouter)
-
const routes = [
{
path: '/',
@@ -41,22 +39,20 @@ const routes = [
name: 'sources',
component: Sources
},
- // catch-all, see https://router.vuejs.org/guide/essentials/history-mode.html#caveat
{
- path: '*',
+ path: '/:pathMatch(.*)',
component: NotFound
}
]
-const router = new VueRouter({
- base: process.env.VUE_APP_BASE_URL,
- mode: 'history',
+const router = createRouter({
+ history: createWebHistory(import.meta.env.VITE_BASE_URL),
routes,
- scrollBehavior (_to, _from, savedPosition) {
+ scrollBehavior (to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
- return { x: 0, y: 0 }
+ return { top: 0 }
}
}
})
diff --git a/src/shims-data.d.ts b/src/shims-data.d.ts
index a5b8f80..c5add7a 100644
--- a/src/shims-data.d.ts
+++ b/src/shims-data.d.ts
@@ -1,13 +1,11 @@
-/* eslint-disable camelcase */
-
- interface Entry {
+interface Entry {
key?: string
en: string
mt: string
}
declare module '@/assets/data/i18n.yaml' {
- var es: Entry[]
+ const es: Entry[]
export default es
}
@@ -23,18 +21,52 @@ interface Lexeme {
type: 'full' | 'short'
}[]
}[]
+ alternatives?: string[]
+ root?: Root
+ sources: string[]
+ frequency?: string
+ transitive?: boolean
+ intransitive?: boolean
+ ditransitive?: boolean
+ hypothetical?: boolean
+ phonetic?: string
+ onomastic_type?: string
}
interface Wordform {
surface_form: string
+ generated?: boolean
+ alternatives?: string[]
+
+ number?: string
+ gender?: string
+ aspect?: string
+ subject?: Agreement
+ dir_obj?: Agreement
+ ind_obj?: Agreement
+ polarity?: Polarity
+}
+
+type Polarity = 'pos' | 'neg'
+
+interface Agreement {
+ person: 'p1' | 'p2' | 'p3'
+ number: 'sg' | 'pl'
+ gender?: 'm' | 'f'
}
interface Root {
radicals: string
variant?: number
type: string
+ alternatives?: string
+ sources: string[]
}
interface Source {
key: string
+ author: string
+ title: string
+ year: number
+ note: string
}
diff --git a/src/shims-tsx.d.ts b/src/shims-tsx.d.ts
deleted file mode 100644
index c656c68..0000000
--- a/src/shims-tsx.d.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import Vue, { VNode } from 'vue'
-
-declare global {
- namespace JSX {
- // tslint:disable no-empty-interface
- interface Element extends VNode {}
- // tslint:disable no-empty-interface
- interface ElementClass extends Vue {}
- interface IntrinsicElements {
- [elem: string]: any
- }
- }
-}
diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts
deleted file mode 100644
index d9f24fa..0000000
--- a/src/shims-vue.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.vue' {
- import Vue from 'vue'
- export default Vue
-}
diff --git a/src/store/index.ts b/src/store/index.ts
deleted file mode 100644
index 3feba23..0000000
--- a/src/store/index.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import Vue from 'vue'
-import Vuex from 'vuex'
-import VuexPersistence from 'vuex-persist'
-
-import { __l, Language } from '@/components/I18N.ts'
-
-Vue.use(Vuex)
-
-const vuexLocal = new VuexPersistence
({
- storage: window.localStorage,
- reducer: (state: State): PersistentState => {
- return {
- language: state.language
- }
- }
-})
-
-interface I18NString {
- key: string,
- replacements: {[key:string]: string} | string[]
-}
-
-interface Message {
- text: string
- type: MessageType
-}
-
-type MessageType = 'success' | 'info' | 'warning' | 'danger'
-
-interface State {
- language: Language
- title: I18NString | string
- messages: Message[]
-}
-
-interface PersistentState {
- language: Language
-}
-
-// Get preferred language from browser settings
-function preferredLanguage (): Language {
- if (window && window.navigator && window.navigator.language.startsWith('mt')) {
- return 'mt'
- } else {
- return 'en'
- }
-}
-
-export default new Vuex.Store({
- state: {
- language: preferredLanguage(),
- title: {
- key: '',
- replacements: {}
- },
- messages: []
- },
- mutations: {
- SET_LANGUAGE (state: State, lang: Language): void {
- state.language = lang
- },
- SET_TITLE (state: State, title?: I18NString | string): void {
- if (title) {
- state.title = title
- let t: string
- if (typeof title === 'string') {
- t = title as string
- } else {
- t = __l(state.language, title.key, title.replacements)
- }
- document.title = `${t} · Ġabra`
- } else {
- state.title = ''
- document.title = 'Ġabra'
- }
- },
- ADD_MESSAGE (state: State, message: Message): void {
- state.messages.push(message)
- },
- CLEAR_MESSAGES (state: State): void {
- state.messages = []
- }
- },
- actions: {
- setLanguage (context, lang: Language): void {
- context.commit('SET_LANGUAGE', lang)
- context.commit('SET_TITLE', context.state.title)
- },
- clearTitle (context): void {
- context.commit('SET_TITLE')
- },
- setTitle (context, title: I18NString | string): void {
- context.commit('SET_TITLE', title)
- },
- addError (context, message: string): void {
- context.commit('ADD_MESSAGE', { type: 'danger', text: message })
- },
- clearMessages (context): void {
- context.commit('CLEAR_MESSAGES')
- }
-
- },
- modules: {
- },
- getters: {
- },
- plugins: [vuexLocal.plugin]
-})
diff --git a/src/stores/root.ts b/src/stores/root.ts
new file mode 100644
index 0000000..9b85a05
--- /dev/null
+++ b/src/stores/root.ts
@@ -0,0 +1,71 @@
+import { defineStore } from 'pinia'
+
+import { __l, type Language } from '@/components/I18N.ts'
+
+interface I18NString {
+ key: string,
+ replacements?: {[key:string]: string} | string[]
+}
+
+interface Message {
+ text: string
+ type: MessageType
+}
+
+type MessageType = 'success' | 'info' | 'warning' | 'danger'
+
+interface State {
+ language: Language
+ title: I18NString | string
+ messages: Message[]
+}
+
+// Get preferred language from browser settings
+function preferredLanguage (): Language {
+ if (window && window.navigator && window.navigator.language.startsWith('mt')) {
+ return 'mt'
+ } else {
+ return 'en'
+ }
+}
+
+export const useRootStore = defineStore('root', {
+ state: (): State => ({
+ language: preferredLanguage(),
+ title: {
+ key: '',
+ replacements: {}
+ },
+ messages: []
+ }),
+ actions: {
+ setLanguage (lang: Language): void {
+ this.language = lang
+ this.setTitle(this.title)
+ },
+ clearTitle (): void {
+ this.title = ''
+ },
+ setTitle (title: I18NString | string): void {
+ if (title) {
+ this.title = title
+ let t: string
+ if (typeof title === 'string') {
+ t = title as string
+ } else {
+ t = __l(this.language, title.key, title.replacements)
+ }
+ document.title = `${t} · Ġabra`
+ } else {
+ this.title = ''
+ document.title = 'Ġabra'
+ }
+ },
+ addError (message: string): void {
+ this.messages.push({ type: 'danger', text: message })
+ },
+ clearMessages (): void {
+ this.messages = []
+ }
+ },
+})
diff --git a/src/views/Home.vue b/src/views/Home.vue
index 28160a8..4bb5471 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -1,8 +1,54 @@
+
+
-
-
{{ __('home.title') }}
+
+
{{ __('home.title') }}
@@ -11,7 +57,7 @@
:placeholder="__('home.search.placeholder')"
:showSubmit="true"
class="input-group-lg"
- @update="(s) => { term = s }"
+ @update="(s: string) => { term = s }"
>
@@ -35,73 +81,13 @@
-
-
-
-
diff --git a/src/views/LexemeView.vue b/src/views/LexemeView.vue
index 2a08b80..18e8545 100644
--- a/src/views/LexemeView.vue
+++ b/src/views/LexemeView.vue
@@ -1,3 +1,79 @@
+
+
@@ -48,7 +124,7 @@
{{ __('features') }}
- {{ lexeme.derived_form ? __('derived_form') + ' ' + derivedForm(lexeme.derived_form) : '' }}
+ {{ lexeme.derived_form ? __('derived_form') + ' ' + UI.derivedForm(lexeme.derived_form) : '' }}
{{ lexeme.frequency }}
{{ lexeme.onomastic_type }}
{{ lexeme.transitive ? __('transitive') : '' }}
@@ -59,8 +135,8 @@
{{ __('source') }}
-
- {{ s }}
+
+ {{ s }}
,
@@ -70,9 +146,9 @@
{{ r.lemma }}
-
+
{{ __(`pos.${r.pos }`) }}
- {{ derivedForm(r.derived_form) }}
+ {{ UI.derivedForm(r.derived_form || 0) }}
@@ -83,11 +159,11 @@
-
+
-
{{ __('examples') }}
+
{{ __('examples') }}
-
“{{ e }}”
@@ -99,97 +175,8 @@
-
-