From e5a236048d081ae5330108e44f1a08097f5a3f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Volds=C3=A6ter?= <ole.voldsater@uib.no> Date: Tue, 11 Feb 2020 10:48:01 +0100 Subject: [PATCH] =?UTF-8?q?refs=20meta#30=20St=C3=B8tter=20API-en=20og=20a?= =?UTF-8?q?rtikkelformatet=20utenom=20b=C3=B8yninger.=20Mangler=20s=C3=B8k?= =?UTF-8?q?eknapp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 31 ++++++++++++------------------- src/components/Article.vue | 22 +++++++++++++++++----- src/components/CompoundList.vue | 29 +++++++++++++++++++++++++++++ src/components/DefElement.vue | 16 ++++++++-------- src/components/Definition.vue | 9 ++++++--- src/components/Header.vue | 2 +- src/components/SearchResults.vue | 7 +++---- src/components/SubArticle.vue | 22 ++++------------------ src/utils/helpers.js | 6 +++--- 9 files changed, 83 insertions(+), 61 deletions(-) create mode 100644 src/components/CompoundList.vue diff --git a/src/App.vue b/src/App.vue index 18cd4fc7..5236e6c6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,7 +2,9 @@ <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <div class=""> - <autocomplete auto-select="true" :search="search" :get-result-value="result_view" @submit="select_result" placeholder="søk..."></autocomplete> + <form class="" action="search" method="get"> + <input placeholder="Søk..." name="q" /> + </form> </div> <SearchResults :hits="search_results" /> <Article :article="article" /> @@ -13,17 +15,10 @@ import axios from "axios" import Article from './components/Article.vue' import SearchResults from './components/SearchResults.vue' -import Autocomplete from '@trevoreyre/autocomplete-vue' +//import Autocomplete from '@trevoreyre/autocomplete-vue' import '@trevoreyre/autocomplete-vue/dist/style.css' -window.onpopstate = function (event) { - if (event.state) { - console.log(event) - app.__vue__._data.article = event.state - } else { - console.log(event) - } -} +var api_endpoint = 'https://ordbok-dev.aws.uib.no/api/dict/nob/article' export default { name: 'app', @@ -32,10 +27,10 @@ export default { article_id: parseInt(window.location.href.split("/").pop()), search_query: window.location.href.split("?q=")[1], search_results: [], - article: {lemmas: []}, + article: {lemmas: [], body:{pronunciation: [], definitions: [], etymology: []}}, search: function(q) { return new Promise(resolve => { - return axios.post('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_search/', + return axios.post(api_endpoint + '_search/', { "suggest": { "suggest" : { @@ -62,7 +57,7 @@ export default { }, components: { Article, - Autocomplete, + //Autocomplete, SearchResults }, methods: { @@ -70,7 +65,6 @@ export default { if(event._source){ this.search_results = [] this.article = event._source - history.pushState(this.article, this.article.lemmas.map(x => x.word).join(', '), event._id) }else{ window.location.href="search?q=" + event.q } @@ -79,17 +73,16 @@ export default { mounted: function(){ var self = this; if(this.search_query) { - axios.get('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_search?q=' + self.search_query) + axios.get(api_endpoint + '?expand_lemmas=true&lemma_text=' + self.search_query) .then(function(response){ - self.search_results = response.data.hits.hits + self.search_results = response.data }) } else { - axios.get('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_doc/' + self.article_id) + axios.get(api_endpoint + '/' + self.article_id + '?expand_lemmas=true&expand_refs=true') .then(function(response){ - self.article = response.data._source - history.replaceState(self.article, self.article.lemmas.map(x => x.word).join(', ')) + self.article = response.data }) } } diff --git a/src/components/Article.vue b/src/components/Article.vue index a9b1aca5..188655b8 100644 --- a/src/components/Article.vue +++ b/src/components/Article.vue @@ -1,22 +1,22 @@ <template> <div class="article" v-show="article.lemmas.length"> <Header :lemmas="article.lemmas" /> - <div class="" v-if="article.pronounciation.length"> + <div class="" v-if="article.body.pronunciation.length"> <h3>Uttale</h3> <ul> - <DefElement v-for="(element, index) in article.pronounciation" :key="index" :body='element' v-if="element.content" /> + <DefElement v-for="(element, index) in article.body.pronunciation" :key="index" :body='element' v-if="element.content" /> </ul> </div> - <div class="" v-if="article.etymology"> + <div class="" v-if="article.body.etymology"> <h3>Etymologi</h3> <ul> - <DefElement v-for="(element, index) in article.etymology" :key="index" :body='element' v-if="element.content" /> + <DefElement v-for="(element, index) in article.body.etymology" :key="index" :body='element' v-if="element.content" /> </ul> </div> <div class=""> <h3>Definisjoner</h3> <ol> - <Definition v-for="(definition, index) in article.definitions" :key="index" :body='definition' /> + <Definition v-for="(definition, index) in definitions" :key="index" :body='definition' /> </ol> </div> </div> @@ -37,6 +37,18 @@ export default { DefElement, Definition, Header + }, + computed: { + definitions: function() { + let defs = this.article.body.definitions + if (defs.length == 1) { + let types = defs[0].elements.reduce((acc, toAdd)=>acc.add(toAdd.type_), new Set()) + if (types.size == 1 && types.has('definition')) { + return defs[0].elements + } + } + return defs + } } } </script> diff --git a/src/components/CompoundList.vue b/src/components/CompoundList.vue new file mode 100644 index 00000000..3bb9c75a --- /dev/null +++ b/src/components/CompoundList.vue @@ -0,0 +1,29 @@ +<template> + <li class="compound_list"> + <ul> + <DefElement :body="body.intro" v-if="body.intro" /> + <li :key="index" v-for="(item, index) in body.elements"> + <a :href="item.article_id + (item.definition_id ? '#def'+item.definition_id : '')"> {{item.lemmas.join(',')}};</a> + </li> + </ul> + </li> +</template> + +<script> +import DefElement from './DefElement.vue' + +export default { + name: 'CompoundList', + props: { + body: Object + }, + components: { + DefElement + } +} +</script> +<style scoped> + li.compound_list ul li { + display: inline; + } +</style> diff --git a/src/components/DefElement.vue b/src/components/DefElement.vue index 8a2d3c7b..d4f0fa30 100644 --- a/src/components/DefElement.vue +++ b/src/components/DefElement.vue @@ -1,6 +1,6 @@ <template> - <li :class="body.type"> - <span v-for="item in assemble_text" :class="item.type" v-html="item.html"></span> + <li :class="body.type_"> + <span v-for="(item, index) in assemble_text" :class="item.type_" :key="index" v-html="item.html"></span> </li> </template> @@ -17,11 +17,11 @@ export default { unparsed: function(){ return this.body.items.map( function(item){ - if (item.type == 'usage') return {type: item.type, html: item.text} - else if (item.type == 'article_ref') return {type: item.type, html: `<a href="${item.article_id}${item.definition_id ? '#def'+item.definition_id : ''}">${item.lemmas.join(',')}</a>`} - else if (item.type == 'pronounciation') return {type: item.type, html: item.string} - else if (item.id) return {type: item.type, html: entities[item.id] || languages[item.id] || item.id} - else return {type: item.type || 'plain', html: item} + if (item.type_ == 'usage') return {type: item.type_, html: item.text} + else if (item.type_ == 'article_ref') return {type: item.type_, html: `<a href="${item.article_id}${item.definition_id ? '#def'+item.definition_id : ''}">${item.lemmas.join(',')}</a>`} + else if (item.type_ == 'pronunciation') return {type: item.type_, html: item.string} + else if (item.id) return {type: item.type_, html: entities[item.id] || languages[item.id] || item.id} + else return {type: item.type_ || 'plain', html: item} } ) }, @@ -44,7 +44,7 @@ export default { <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> -span.usage, span.pronounciation { +span.usage, span.pronunciation { font-style: italic; } diff --git a/src/components/Definition.vue b/src/components/Definition.vue index 73d9e155..1f4cf320 100644 --- a/src/components/Definition.vue +++ b/src/components/Definition.vue @@ -10,6 +10,7 @@ import DefElement from './DefElement.vue' import Example from './Example.vue' import SubArticle from './SubArticle.vue' +import CompoundList from './CompoundList.vue' var Definition = { name: 'Definition', @@ -20,7 +21,8 @@ var Definition = { DefElement, Definition, Example, - SubArticle + SubArticle, + CompoundList }, computed: { template_name_added: function(){ @@ -31,8 +33,9 @@ var Definition = { 'explanation': 'DefElement', 'definition': 'Definition', 'example': 'Example', - 'sub_article': 'SubArticle' - }[element.type] || 'li', + 'sub_article': 'SubArticle', + 'compound_list': 'CompoundList' + }[element.type_] || 'li', 'element': element } }) diff --git a/src/components/Header.vue b/src/components/Header.vue index f31b9e63..bbb73181 100644 --- a/src/components/Header.vue +++ b/src/components/Header.vue @@ -33,7 +33,7 @@ export default { header_text: function() { return this.lemmas.map( function(item){ - return item.word + return item.lemma } ).join(', ') }, diff --git a/src/components/SearchResults.vue b/src/components/SearchResults.vue index fe2b4356..637115b0 100644 --- a/src/components/SearchResults.vue +++ b/src/components/SearchResults.vue @@ -21,10 +21,9 @@ export default { return this.hits.map( function(hit){ return { - id: hit._id, - label: hit._source.lemmas.map(x => x.word).join(', '), - article: hit._source, - classification: helpers.group_list(hit._source.lemmas) + id: hit.article_id, + label: hit.lemmas.map(x => x.lemma).join(', '), + classification: helpers.group_list(hit.lemmas) } }) } diff --git a/src/components/SubArticle.vue b/src/components/SubArticle.vue index c2a1a162..642d7e2d 100644 --- a/src/components/SubArticle.vue +++ b/src/components/SubArticle.vue @@ -1,15 +1,14 @@ <template> <li class="sub_article"> - <span class="sub_article_header"><a :href="body.article_id">{{article.lemmas[0]['word']}}</a></span> + <span class="sub_article_header"><a :href="body.article_id">{{body.lemmas[0]}}</a></span> <ul> <DefElement :body="body.intro" v-if="body.intro" /> - <Definition :body="article.definitions[0]" /> + <Definition :body="body.article.body.definitions[0]" /> </ul> </li> </template> <script> -import axios from "axios"; import DefElement from './DefElement.vue' export default { @@ -17,21 +16,8 @@ export default { props: { body: Object }, - data: function(){ - return { - article: { - lemmas: [{word: ''}], - definitions: [{ - elements: [] - }] - } - } - }, - components: {DefElement}, - mounted: function(){ - var self = this; - axios.get('https://search-ordbok-prototype-6qpfmm6fz5jvy5ba3e6blryeqe.eu-west-1.es.amazonaws.com/ordbok/_doc/' + self.body.article_id) - .then(response => self.article = response.data._source) + components: { + DefElement }, beforeCreate: function () { this.$options.components.Definition = require('./Definition.vue').default diff --git a/src/utils/helpers.js b/src/utils/helpers.js index 460db5eb..f40ede55 100644 --- a/src/utils/helpers.js +++ b/src/utils/helpers.js @@ -1,11 +1,11 @@ var group_list = function(grps) { var grp_collection = new Set() grps.forEach(function(lemma){ - lemma.inflection_groups.forEach(function(grp){ - grp_collection.add(grp.group_designation) + lemma.standardisations.forEach(function(grp){ + grp_collection.add(grp.tags[0] == 'subst' ? grp.tags[0] + ',' + grp.tags[1] : grp.tags[0]) }) }) - return Array.from(grp_collection).join(';') + return Array.from(grp_collection).join('; ') } export default { group_list} -- GitLab