Something went wrong on our end
-
Henrik Askjer authoredHenrik Askjer authored
Header.vue 8.25 KiB
<!-- eslint-disable -->
<template>
<div class="header">
<span class="dict-label">{{dict_label}}</span>
<div v-bind:class="{ 'lookup': $route.name=='lookup'}" v-for="(lemma_group, i) in lemma_groups" :key="i">
<h2><router-link v-if="$route.name!='lookup'" tabindex="0"
:id="title_id"
:to="$parent.link_to_self.ref"
@click.native="$parent.details_click($parent.link_to_self)"
v-bind:class="{'long_lemma': long_lemma}"
class="article_header">
<!--
--><span v-for="(lemma, index) in lemma_group.lemmas"
:key="index"><u>{{lemma.lemma}}</u><!--
--><span v-if="lemma.hgno"
:aria-label="'Betydning nummer ' + parseInt(lemma.hgno)"
:title="'Betydning nummer '+parseInt(lemma.hgno)"
class="hgno">{{" "+roman_hgno(lemma)}}</span><!--
--><span
class="title_comma"
v-if="lemma_group.lemmas[1] && index < lemma_group.lemmas.length-1">{{", "}}
</span>
</span>
</router-link>
<span v-else v-for="(lemma, index) in lemma_group.lemmas"
:key="index">{{lemma.lemma}}<!--
--><span v-if="lemma.hgno"
:aria-label="'Betydning nummer ' + parseInt(lemma.hgno)"
:title="'Betydning nummer '+parseInt(lemma.hgno)"
class="hgno">{{" "+roman_hgno(lemma)}}</span><!--
--><span
class="title_comma"
v-if="lemma_group.lemmas[1] && index < lemma_group.lemmas.length-1">{{", "}}
</span>
</span>
</h2>
<span class="header_group_list"
v-if="lemma_group.description">{{lemma_group.description}}</span>
<span v-if="$store.state.showInflectionNo">{{lemma_group.inflection_classes}}</span>
<SplitInf :lemmas="lemmas"/>
<span v-if="!lemma_groups[1] && $parent.collapsed && $parent.snippet && $parent.has_content" class="definition_snippet">
<span class="diamond" v-if="lemma_group.description"> ❖ </span>{{$parent.snippet}}
</span>
</div>
<span v-if="$parent.collapsable" >
<v-btn class="expand_icon" v-if="$parent.collapsed"
text
small
@click="$parent.collapsed=false">
Vis artikkel
<v-icon small right>expand_more</v-icon></v-btn>
<v-btn class="expand_icon" v-else
text
small
@click="$parent.collapsed=true">
<v-icon small>expand_less</v-icon></v-btn>
</span>
</div>
</template>
<script>
/* eslint-disable */
import helpers from '../utils/helpers.js'
import SplitInf from './SplitInf.vue'
export default {
name: 'Header',
props: {
lemmas: Array,
dictionary: String,
article_id: Number,
title_id: String
},
data: function() {
return {
long_lemma: false
}
},
components: {
SplitInf
},
mounted: function() {
//console.log(this.$refs[this.title_id])
//console.log(document.getElementById(this.title_id).offsetWidth, document.getElementById(this.title_id).scrollWidth)
if (this.$el.scrollWidth > this.$el.offsetWidth) {
this.long_lemma = true
}
},
methods: {
roman_hgno: helpers.roman_hgno,
inflection_classes: function(lemmas) {
let inf_classes = new Set()
let ureg = false
lemmas.forEach((lemma, i) => {
if (lemma.inflection_class) inf_classes.add(lemma.inflection_class)
else ureg = true
})
if (inf_classes.size){
let class_array = Array.from(inf_classes).sort()
if (ureg) class_array.push("ureg.")
let class_list
if (class_array.length < 3) {
class_list = class_array.join(" og ")
}
else {
class_list = class_array.slice(0, -1).join(", ") + " og " + class_array[class_array.length -1]
}
return " ("+ class_list +")"
}
}
},
computed: {
secondary_header_text: function() {
let a_forms = []
this.lemmas.forEach((lemma, i) => {
if (lemma.paradigm_info[0] && lemma.paradigm_info[0].inflection_group == 'VERB') {
let inf2 = lemma.paradigm_info[0].inflection[1] && lemma.paradigm_info[0].inflection[1].word_form
if (inf2 && inf2.length) {
a_forms.push(inf2)
}
}
});
return a_forms.join(', ')
},
dict_label: function() {
return {
'bm': 'bokmålsordboka',
'nn': 'nynorskordboka'
}[this.dictionary] || ''
},
hgno_arabic: function() {
let hgnos = []
this.lemmas.forEach(lemma => {
let hgint = parseInt(lemma.hgno)
if (hgint > 0) {
hgnos.push(hgint)
}
})
return hgnos
},
group_list: function() {
return helpers.group_list(this.lemmas, this.dictionary)
},
lemma_groups: function() {
let groups = [{lemmas: this.lemmas}]
if (this.lemmas[0].paradigm_info[0] && this.lemmas[0].paradigm_info[0].tags[0] != 'NOUN' && this.lemmas[0].paradigm_info[0].tags[0] != 'EXPR') {
groups = [{description: helpers.mapping[this.dictionary][this.lemmas[0].paradigm_info[0].tags[0]], lemmas: this.lemmas}]
}
else if (this.lemmas[0].paradigm_info[0].tags[0] == 'NOUN') {
let genus_map = {}
let self = this
this.lemmas.forEach(lemma =>{
let genera = new Set()
lemma.paradigm_info.forEach(paradigm => {
genera.add(paradigm.tags[1])
})
let genus_description = ""
if (genera.size == 3) {
genus_description += helpers.mapping[self.dictionary]['Masc'] + ', ' + helpers.mapping[self.dictionary]['Fem'] + ' eller ' + helpers.mapping[self.dictionary]['Neuter']
} else {
genus_description += Array.from(genera).map(code => helpers.mapping[self.dictionary][code]).sort().join(' eller ')
}
if (genus_map[genus_description]) {
genus_map[genus_description].push(lemma)
}
else {
genus_map[genus_description] = [lemma]
}
})
groups = Object.keys(genus_map).map(key => {
return {description: 'substantiv ' + key, lemmas: genus_map[key], }
})
groups.forEach((lemma_group, index) => {
groups[index]['inflection_classes'] = this.inflection_classes(lemma_group.lemmas)
})
}
return groups
},
inflection_groups_by_lemma: function() {
let components = Object.keys(this.$options.components)
return this.lemmas.map(
function(lemma_){
let inflection_groups = lemma_.paradigm_info.reduce((acc, std) => Object.assign(acc, {[std.inflection_group]: []}), {})
lemma_.paradigm_info.forEach(std => inflection_groups[std.inflection_group].push(std))
return {
lemma: lemma_.lemma,
inflection_groups: Object.fromEntries(Object.entries(inflection_groups).filter(e => components.includes(e[0].replace('/', '_'))))
}
}
)
},
}
}
</script>
<style>
article h2 {
padding-top: 4px;
padding-bottom: 0px;
font-family: Inria Serif;
font-size: 28;
}
.sm h2, .xs h2 {
font-size: 22px;
}
article h2.secondary_header {
padding-top: 0px;
padding-bottom: 4px;
}
.info-button {
margin-left: 6px;
margin-right: -2px;
height: 10px;
width: 10px;
}
.word-classification {
text-decoration: underline dashed;
}
.dict-label {
color: var(--v-primary-base) ;
font-weight: bold;
position: absolute;
top: 0px;
left: 24px;
font-variant-caps: all-small-caps;
}
div.lemma {
display: none;
}
.article_header {
overflow:auto;
word-wrap: normal;
}
h2 a {
text-decoration: none;
}
h2 a u {
text-decoration-thickness: 1px;
}
.long_lemma {
font-size: 18px !important;
}
.hgno {
color: var(--v-text-base) !important;
font-family: unset;
font-size: 16px;
font-weight: normal;
}
.expand_icon {
justify-content: center;
position: absolute;
bottom: 0px;
left: 0px;
padding-right: 24px !important;
width: 100%;
border-bottom-right-radius: 28px;
border-bottom-left-radius: 28px;
}
</style>