diff --git a/.env b/.env index e2df1ae2fd01253f8c3a7f993dd8a223a657dd59..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/.env +++ b/.env @@ -1 +0,0 @@ -VUE_APP_SEARCH_ENDPOINT='https://oda.uib.no/opal/api/' diff --git a/.env.dev_server b/.env.dev_server index 8c9f2bf6a3d82dfdbb6325b70a80b79d300a3a5e..31573c1642cf525ffbcb86d3a26f5c3f8c3a6010 100644 --- a/.env.dev_server +++ b/.env.dev_server @@ -1,3 +1,3 @@ NODE_ENV=production -VUE_APP_API_STAGE=dev VUE_APP_ARTICLE_ENDPOINT='https://oda.uib.no/opal/dev/' +VUE_APP_SEARCH_ENDPOINT='https://oda.uib.no/opal/dev/api/' diff --git a/.env.local b/.env.local index 6750c0ed21db114acd6f7a4c7ae67928f35226c2..53d6b6d7911d76507e18fafad482ea4f6f9237fc 100644 --- a/.env.local +++ b/.env.local @@ -1,4 +1,4 @@ -VUE_APP_API_STAGE=dev VUE_APP_ARTICLE_ENDPOINT='https://oda.uib.no/opal/dev/' +VUE_APP_SEARCH_ENDPOINT='https://oda.uib.no/opal/dev/api/' VUE_APP_VERSION_LABEL=LOCAL VUE_APP_RELEASE=test diff --git a/.env.production b/.env.production index 49ffbcdede3a033d81ec1948aa97c38864ecd66d..e67c7aae3624d404de5bb2442d86222a9a414427 100644 --- a/.env.production +++ b/.env.production @@ -1,4 +1,4 @@ NODE_ENV=production VUE_APP_VERSION_LABEL=Beta -VUE_APP_API_STAGE=prod VUE_APP_ARTICLE_ENDPOINT='https://oda.uib.no/opal/prod/' +VUE_APP_SEARCH_ENDPOINT='https://oda.uib.no/opal/prod/api/' diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 262e9bfa93e493f9e807b751354ab0a9a2f74853..ba2c72e430eee2065efd8fce0f5eece6a535a045 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,7 @@ workflow: - if: $CI_COMMIT_TAG != null build-dev: - image: node:latest + image: node:16 tags: - spraaksamlingene_01 stage: build @@ -36,7 +36,7 @@ build-dev: - dist build-prod: - image: node:latest + image: node:16 tags: - spraaksamlingene_01 stage: build diff --git a/package.json b/package.json index 9af2ffcb301583b152f1816fda34792b97173da3..a4d78dedd52638b85b62e2e1f1d8ed73b344049f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "axios-cache-adapter": "^2.7.3", "core-js": "~3.6.5", "debounce": "^1.2.1", - "inflection-table": "https://git.app.uib.no/api/v4/projects/16442/jobs/artifacts/0.2.31/raw/module.tar.gz?job=publish", + "inflection-table": "https://git.app.uib.no/api/v4/projects/16442/jobs/artifacts/0.2.40/raw/module.tar.gz?job=publish", "vue": "^2.6.12", "vue-material-design-icons": "^4.11.0", "vue-plausible": "^1.1.4", diff --git a/src/components/Article.vue b/src/components/Article.vue index 1cfc9c012b445d59da5106e3f590a77148895260..62e8619ffa07da03a1ea4009b61112677fef347d 100644 --- a/src/components/Article.vue +++ b/src/components/Article.vue @@ -87,10 +87,10 @@ export default { return this.article.dictionary }, def_label: function() { - return this.dictionary == 'bob' ? 'Betydning og bruk' : 'Tyding og bruk' + return this.dictionary == 'bm' ? 'Betydning og bruk' : 'Tyding og bruk' }, example_label: function() { - return this.dictionary == 'bob' ? 'Eksempel' : 'Døme' + return this.dictionary == 'bm' ? 'Eksempel' : 'Døme' }, sub_articles: function() { return this.article.body.definitions.reduce((acc, val) => acc.concat(find_sub_articles(val)), []).sort((s1, s2) => s1.lemmas[0].localeCompare(s2.lemmas[0])) diff --git a/src/components/ArticleFooter.vue b/src/components/ArticleFooter.vue index 4a7793ed84d9b5f43ff898d2d98060d831aaa122..0825e436d896a7b89a91c0f4dc59f70b55f967ea 100644 --- a/src/components/ArticleFooter.vue +++ b/src/components/ArticleFooter.vue @@ -1,6 +1,6 @@ <template> <div class="article_footer"> - <v-btn v-if="!webShareApiSupported" x-small depressed class="toolbar-button" rounded tabindex="0" @click="copy_link"> + <v-btn v-if="!webShareApiSupported" x-small depressed class="toolbar-button" rounded tabindex="0" @click="copy_link"> <v-icon small>link</v-icon> <span class = "button-text">Kopier lenke</span> </v-btn> @@ -68,8 +68,8 @@ export default { let citation = {"bob": `«${this.article.lemmas[0].lemma}». I: <em>Bokmålsordboka.</em> Språkrådet og Universitetet i Bergen. <${this.create_link()}> (hentet ${dd}.${mm}.${yyyy}).`, "nob":`«${this.article.lemmas[0].lemma}». I: <em>Nynorskordboka.</em> Språkrådet og Universitetet i Bergen. <${this.create_link()}> (henta ${dd}.${mm}.${yyyy}).` }[this.article.dictionary] - - + + return citation }, copy_link() { @@ -83,7 +83,7 @@ export default { this.menu = false } - + } } diff --git a/src/components/Autocomplete.vue b/src/components/Autocomplete.vue index d67a8a3d67cd7d336de9fae4e8813d0c4b8b2639..fbabe1bfc33ec9dc71ec86d012a68acbf93c5a4a 100644 --- a/src/components/Autocomplete.vue +++ b/src/components/Autocomplete.vue @@ -31,7 +31,10 @@ <span class="search-hit"> {{data.item.label}} </span> - <span v-if="get_lang()=='bob,nob'">({{{"b": "bm", "n": "nn", "bn": "bm, nn" }[data.item.lang] || ["søker...","ingen treff","avansert søk"][data.item.search]}})</span> + <span v-if="(get_lang()=='bm,nn')"> + ({{{"b": "bm", "n": "nn", "bn": "bm, nn" }[data.item.lang] || + ["søker...","ingen treff","avansert søk"][data.item.search]}}) + </span> </template> <template slot="no-data"> <div></div> @@ -96,7 +99,7 @@ this.items.push({q: q, label: q, time: time, search: search}) } let self = this - self.api.get('suggest?', {params: {q: q, dict: self.get_lang(), n: 80, scope: 'w', stage: self.$parent.stage}}) + self.api.get('suggest?', {params: {q: q, dict: self.get_lang(), n: 80, scope: 'w'}}) .then(async (response) => { if (self.$refs.autocomplete.searchInput == q & self.suggesting) { diff --git a/src/components/CompoundList.vue b/src/components/CompoundList.vue index 0189fc94ac59e5d6d45c91470bcf2b671b372738..fd02c8520342469b2dd9c1ca9ae2aedc03a208f8 100644 --- a/src/components/CompoundList.vue +++ b/src/components/CompoundList.vue @@ -5,10 +5,10 @@ <li :key="index" v-for="(item, index) in body.elements" - ><router-link + >{{' '}}<router-link :to="'/' + dictionary + '/' + item.article_id + (item.definition_id ? '#def'+item.definition_id : '')" @click.native="article_link_click(item)" - > {{item.lemmas[0].lemma}}</router-link> + >{{item.lemmas[0].lemma}}</router-link> </li> </ul> </li> diff --git a/src/components/Definition.vue b/src/components/Definition.vue index 5f47c647884d2ff4df2838e1ca89b40d37ab2e81..fa0a2a2342d59719cf3158a20c1010ea05efc169 100644 --- a/src/components/Definition.vue +++ b/src/components/Definition.vue @@ -47,7 +47,7 @@ var Definition = { return this.body.elements.filter(el => el.type_ == 'compound_list') }, example_header: function() { - return this.dictionary == 'bob' ? 'Eksempel' : 'Døme' + return this.dictionary == 'bm' ? 'Eksempel' : 'Døme' }, subdefs: function() { // filtrerer bort definisjoner som bare inneholder underartikler diff --git a/src/components/DictionaryView.vue b/src/components/DictionaryView.vue index 58ba0fa5274982e75c3fd427a836a3cf07252c65..74a087bcc64e6ddda3461c42bca78d2b3306a342 100644 --- a/src/components/DictionaryView.vue +++ b/src/components/DictionaryView.vue @@ -6,21 +6,21 @@ <template v-slot:label tabindex="1"> <span aria-label="Vis resultat i begge ordbøkene eller bruk radioknapp for bokmålsordboka eller radioknapp for nynorskordboka">VIS</span> </template> - <v-radio value="bob,nob" color="primary"> + <v-radio value="bm,nn" color="primary"> <template v-slot:label> <span> begge{{$vuetify.breakpoint.smAndDown ? '' : ' ordbøkene'}} </span> </template> </v-radio> - <v-radio value="bob" color="primary"> + <v-radio value="bm" color="primary"> <template v-slot:label> <span> {{$vuetify.breakpoint.xs ? 'bm' : 'bokmål (bm)'}} </span> </template> </v-radio> - <v-radio value="nob" color="primary"> + <v-radio value="nn" color="primary"> <template v-slot:label> <span> {{$vuetify.breakpoint.xs ? 'nn' : 'nynorsk (nn)'}} @@ -44,7 +44,7 @@ <div id="single_article_container" v-if="article"> <div class="return_to_results" v-if="search_results && search_results.length"> <router-link :to="article.source" @click.native="return_to_results()"> - <v-icon class="nav_arrow">arrow_left</v-icon>Tilbake til {{article.dictionary == 'bob' ? 'søkeresultater' : 'søkjeresultat'}} + <v-icon class="nav_arrow">arrow_left</v-icon>Tilbake til {{article.dictionary == 'bm' ? 'søkeresultater' : 'søkjeresultat'}} </router-link> </div> <Article :key="article_key" :article="article" @article-click="article_link_click" /> @@ -78,11 +78,10 @@ import { setup } from 'axios-cache-adapter' const SEARCH_ENDPOINT = process.env.VUE_APP_SEARCH_ENDPOINT const ARTICLE_ENDPOINT= process.env.VUE_APP_ARTICLE_ENDPOINT -const API_STAGE = process.env.VUE_APP_API_STAGE -const dicts = {'nob': 'Nynorskorboka', - 'bob': 'Bokmålsordboka', - 'bob,nob': 'ordbøkene'} +const dicts = {'nn': 'Nynorskorboka', + 'bm': 'Bokmålsordboka', + 'bm,nn': 'ordbøkene'} const api = setup({ baseURL: SEARCH_ENDPOINT, @@ -106,9 +105,12 @@ function navigate_to_article(self, source) { if ((self.$route.query.nocache || '').toLowerCase() == 'true') { config.headers.cachebuster = Date.now() }*/ - axios.get(ARTICLE_ENDPOINT + self.$route.params.lang + '/article/' + self.$route.params.id + ".json") + + const lang = self.$route.params.lang + + axios.get(ARTICLE_ENDPOINT + lang + '/article/' + self.$route.params.id + ".json") .then(function(response){ - self.article = Object.assign(response.data, {'dictionary': self.$route.params.lang, results: self.search_results}) + self.article = Object.assign(response.data, {'dictionary': lang, results: self.search_results}) self.search_results = [] self.error = null }) @@ -117,8 +119,8 @@ function navigate_to_article(self, source) { self.error = ["Vi har ingen artikkel med id " + self.$route.params.id] } else { self.error = [] - if (self.lang !== 'bob') self.error.push(`Noko gjekk gale...`) - if (self.lang !== 'nob') self.error.push(`Noe gikk galt...`) + if (self.lang !== 'bm') self.error.push(`Noko gjekk gale...`) + if (self.lang !== 'nn') self.error.push(`Noe gikk galt...`) } }) .then(function(response){ @@ -163,7 +165,7 @@ function navigate_to_query(self, word) { let query = self.event ? self.event : {q: word} // Get article IDs - api.get('articles?', {params: {w: query.match || query.q, dict: self.lang, scope: "w", stage: self.stage}}).then((response) => { + api.get('articles?', {params: {w: query.match || query.q, dict: self.lang, scope: "w"}}).then((response) => { let article_ids = response.data let unwrapped = [] for (const d in article_ids) { @@ -188,18 +190,18 @@ function navigate_to_query(self, word) { if (! self.search_results.length) { if (query.match) { self.error = [] - if (self.lang !== 'bob') { + if (self.lang !== 'bm') { self.error.push(`Ordet «${query.match}» finst ikkje i Nynorskordboka. Bruk knappen «bokmål (bm)» om du har søkt i feil ordbok.`) } - if (self.lang !== 'nob') self.error.push(`Ordet «${query.match}» finnes ikke i Bokmålsordboka. Bruk knappen «nynorsk (nn)» om du har søkt i feil ordbok.`) + if (self.lang !== 'nn') self.error.push(`Ordet «${query.match}» finnes ikke i Bokmålsordboka. Bruk knappen «nynorsk (nn)» om du har søkt i feil ordbok.`) } else { self.error = [`Søk på «${query.q}» gir ingen treff i ${dicts[self.lang]}.`] // If not advanced search if (query.search != 2) self.error[0] += " Søk med * eller % dersom du er usikker på skrivemåten. Søketips kan du finne i «OM ORDBØKENE»." - if (self.lang == "bob") self.error[0] += ` Bruk knappen «nynorsk (nn)» om du har søkt i feil ordbok.` - if (self.lang == "nob") self.error[0] += ` Bruk knappen «bokmål (bm)» om du har søkt i feil ordbok.` + if (self.lang == "bm") self.error[0] += ` Bruk knappen «nynorsk (nn)» om du har søkt i feil ordbok.` + if (self.lang == "nn") self.error[0] += ` Bruk knappen «bokmål (bm)» om du har søkt i feil ordbok.` } } @@ -231,7 +233,7 @@ export default { return { article_key: 0, search_results: [], - lang: 'bob,nob', + lang: 'bm,nn', waiting_for_articles: true, waiting_for_metadata: true, article: null, @@ -239,7 +241,6 @@ export default { monthly_bm: null, monthly_nn: null, event: null, - stage: API_STAGE } }, computed: { @@ -260,12 +261,12 @@ export default { this.search_results = [] if (error.response) { this.error = [] - if (this.lang !== 'bob') this.error.push(`Noko gjekk gale på serversida`) - if (this.lang !== 'nob') this.error.push(`Noe gikk galt på serversiden"`) + if (this.lang !== 'bm') this.error.push(`Noko gjekk gale på serversida`) + if (this.lang !== 'nn') this.error.push(`Noe gikk galt på serversiden"`) } else { this.error = [] - if (this.lang !== 'bob') this.error.push(`Nettverksproblem, prøv igjen`) - if (this.lang !== 'nob') this.error.push(`Nettverksproblemer, prøv igjen`) + if (this.lang !== 'bm') this.error.push(`Nettverksproblem, prøv igjen`) + if (this.lang !== 'nn') this.error.push(`Nettverksproblemer, prøv igjen`) } }, select_result: function (event) { @@ -318,16 +319,15 @@ export default { }, mounted: function(){ let self = this - this.lang = 'bob,nob' - + this.lang = 'bm,nn' Promise.all([ - axios.get(ARTICLE_ENDPOINT + 'bob/concepts.json').then(function(response){ + axios.get(ARTICLE_ENDPOINT + 'bm/concepts.json').then(function(response){ let concepts = response.data.concepts - entities.bob = concepts + entities.bm = concepts }), - axios.get(ARTICLE_ENDPOINT + 'nob/concepts.json').then(function(response){ + axios.get(ARTICLE_ENDPOINT + 'nn/concepts.json').then(function(response){ let concepts = response.data.concepts - entities.nob = concepts + entities.nn = concepts }) ]).then(function(_) { self.waiting_for_metadata = false @@ -343,23 +343,23 @@ export default { navigate_to_article(self, self.$route.path) } else { - self.lang = self.$route.params.lang || 'bob,nob' + self.lang = self.$route.params.lang || self.lang self.waiting_for_articles = false history.replaceState({article: self.article, search_results: self.search_results, lang: self.lang, error: self.error}, '') } // words of the month - axios.get(ARTICLE_ENDPOINT + 'bob/article/5607.json').then(function(response){ - self.monthly_bm = Object.assign(response.data, {dictionary: 'bob'}) + axios.get(ARTICLE_ENDPOINT + 'bm/article/5607.json').then(function(response){ + self.monthly_bm = Object.assign(response.data, {dictionary: 'bm'}) }) - axios.get(ARTICLE_ENDPOINT + 'nob/article/78569.json').then(function(response){ - self.monthly_nn = Object.assign(response.data, {dictionary: 'nob'}) + axios.get(ARTICLE_ENDPOINT + 'nn/article/78569.json').then(function(response){ + self.monthly_nn = Object.assign(response.data, {dictionary: 'nn'}) }) }).catch(function(_){ self.error = [] - if (self.lang !== 'bob') self.error.push(`Eit nettverksproblem hindra lasting av sida. Prøv å laste sida på nytt`) - if (self.lang !== 'nob') self.error.push(`Et nettverksproblem hindret lasting av siden. Prøv å laste siden på nytt`) + if (self.lang !== 'bm') self.error.push(`Eit nettverksproblem hindra lasting av sida. Prøv å laste sida på nytt`) + if (self.lang !== 'nn') self.error.push(`Et nettverksproblem hindret lasting av siden. Prøv å laste siden på nytt`) self.waiting_for_metadata = false self.waiting_for_articles = false }) @@ -433,11 +433,11 @@ div.monthly.sm, div.monthly.xs { flex-direction: column; } -div.monthly article.bob .dict-label::before { +div.monthly article.bm .dict-label::before { content: "fra "; } -div.monthly article.nob .dict-label::before { +div.monthly article.nn .dict-label::before { content: "frå "; } diff --git a/src/components/SearchResults.vue b/src/components/SearchResults.vue index 7bc3d9b079d32a349e8b429b79c5865faeacd2df..18b15f64fa832756942ef2ddaef79347509a55f1 100644 --- a/src/components/SearchResults.vue +++ b/src/components/SearchResults.vue @@ -1,8 +1,8 @@ <template> <section id="search_results"> <div class="flex-container" :class="$vuetify.breakpoint.name"> - <ul class="hits" v-if="results_bob.length"> - <li class="article_container" v-for="(result, index) in results_bob" :key="index + results_hash" tabindex="-1"> + <ul class="hits" v-if="results_bm.length"> + <li class="article_container" v-for="(result, index) in results_bm" :key="index + results_hash" tabindex="-1"> <Article :article="result" @article-click="article_link_click" @@ -10,8 +10,8 @@ </Article> </li> </ul> - <ul class="hits" v-if="results_nob.length"> - <li class="article_container" v-for="(result, index) in results_nob" :key="index + results_hash" tabindex="-1"> + <ul class="hits" v-if="results_nn.length"> + <li class="article_container" v-for="(result, index) in results_nn" :key="index + results_hash" tabindex="-1"> <Article :article="result" @article-click="article_link_click" @@ -36,17 +36,17 @@ export default { computed: { right_col_class_name: function() { if (this.$vuetify.breakpoint.mdAndUp) { - if (this.results_bob.length) { + if (this.results_bm.length) { return 'righ_hand_column' } } return '' }, - results_bob: function(){ - return this.hits.filter(hit => hit.dictionary == 'bob') + results_bm: function(){ + return this.hits.filter(hit => hit.dictionary == 'bm') }, - results_nob: function(){ - return this.hits.filter(hit => hit.dictionary == 'nob') + results_nn: function(){ + return this.hits.filter(hit => hit.dictionary == 'nn') }, results_hash: function(){ return this.hits.reduce((hash, hit) => (hash + hit.article_id) % 10000, 0) diff --git a/src/main.js b/src/main.js index 3c9f9b19834176e2fb9860941670f881242fb4ab..19599845881898bfc6979e6cd0b212a2b6fa91e8 100644 --- a/src/main.js +++ b/src/main.js @@ -37,7 +37,7 @@ const router = new VueRouter({ component: DictionaryView, children: [ { - path: ':lang', + path: ':lang(bm|nn|bm,nn)', children: [ { name: 'word', @@ -52,6 +52,25 @@ const router = new VueRouter({ path: 'search/:query' } ] + }, + { + path: 'bob/*', + redirect: to => { + return "bm/" + to.params.pathMatch + } + }, + { + path: 'nob/*', + redirect: to => { + console.log(to) + return "nn/" + to.params.pathMatch + } + }, + { + path: 'bob,nob/*', + redirect: to => { + return "bm,nn/" + to.params.pathMatch + } } ] } diff --git a/src/utils/entities.js b/src/utils/entities.js index 49f37797a00e2e2142efa136c6168cda23d06469..b48438d98f430a4e1576a12eded0dcd75b9d004d 100644 --- a/src/utils/entities.js +++ b/src/utils/entities.js @@ -1,7 +1,7 @@ var entities = { - 'bob': { + 'bm': { }, - 'nob': { + 'nn': { } } diff --git a/src/utils/helpers.js b/src/utils/helpers.js index ba5ce7a6e740b940ccf903ad9258544dbb76d862..61ef577cb9fde56aba29f108cd2376bcb8887dcb 100644 --- a/src/utils/helpers.js +++ b/src/utils/helpers.js @@ -1,5 +1,5 @@ var mapping = { - "bob": { + "bm": { "NOUN": "substantiv", "VERB": "verb", "ADJ": "adjektiv", @@ -21,7 +21,7 @@ var mapping = { "Neuter": "intetkjønn", "Uninfl": "ubøyelig" }, - "nob": { + "nn": { "NOUN": "substantiv", "VERB": "verb", "ADJ": "adjektiv",