Skip to content
Snippets Groups Projects
DefElement.vue 6.73 KiB
Newer Older
Ole Voldsæter's avatar
Ole Voldsæter committed
<template>
  <li :is="tag" :class="body.type_"><!--
Ole Voldsæter's avatar
Ole Voldsæter committed
 --><span :is="item.tag || 'span'" v-for="(item, index) in assemble_text"
          :class="item.type"
          :key="index"
           v-bind="item.props"><!--
Henrik Askjer's avatar
Henrik Askjer committed
          --><span v-for="(subitem, index) in highlight_hits(item.html)" :key="'a'+index" :class="subitem.type">{{subitem.text}}</span><!--
          
       --><router-link class="article_ref" v-if="item.type == 'article_ref'" :to="item.ref" @click.native="article_link_click(item)" :key="index">
Henrik Askjer's avatar
Henrik Askjer committed
         <span v-for="(subitem, index) in highlight_hits(item.link_text, item.link_text)" :key="'a'+index" :class="subitem.type">{{subitem.text}}</span><!--
Henrik Askjer's avatar
Henrik Askjer committed
       <span class="homograph" v-if="item.lemmas[0].hgno" :aria-label="`${dictionary=='bm'? 'Betydning': 'Tyding'} ${item.lemmas[0].hgno}`" :title="`${dictionary=='bm'? 'Betydning': 'Tyding'} ${item.lemmas[0].hgno}`" :key="index"><!--
        --> ({{roman_hgno(item.lemmas[0])}}{{item.definition_order ? '': ')'}}</span>
        <span class="def_order" v-if="item.definition_order" :aria-label="'definisjon '+item.definition_order">{{item.lemmas[0].hgno ? ', ': ' ('}}{{item.definition_order}})</span>
       </router-link>

       <!--
       --><span class="numerator" v-if="item.type == 'fraction'">{{item.num}}</span><!--
       -->{{item.type == 'fraction' ? '' : ''}}<!--
       --><span class="denominator" v-if="item.type == 'fraction'">{{item.denom}}</span><!--
 --></span></li>
Ole Voldsæter's avatar
Ole Voldsæter committed
</template>

<script>
Ole Voldsæter's avatar
Ole Voldsæter committed
import entities from '../utils/entities.js'
Ole Voldsæter's avatar
Ole Voldsæter committed
import helpers from '../utils/helpers.js'
Ole Voldsæter's avatar
Ole Voldsæter committed

function replace_grammar_id(item, lang) {
  let content = item.content
  if (content.includes('$') && (item.items[0].id)){
    let replacement_item = entities[lang][item.items[0].id]['expansion']
    content = content.replace('$', replacement_item)}

  return content
}

Ole Voldsæter's avatar
Ole Voldsæter committed
export default {
  name: 'DefElement',
  props: {
    body: Object,
    tag: {
      type: String,
      default: 'li'
    },
    dictionary: String
Ole Voldsæter's avatar
Ole Voldsæter committed
  },
  data: function() {
    return {
      path: this.$route.fullPath
    }
  },
Ole Voldsæter's avatar
Ole Voldsæter committed
  computed: {
Henrik Askjer's avatar
Henrik Askjer committed
    fulltext: function() {
      if (this.$route.query.scope && this.$route.query.scope.includes("f")) {
Henrik Askjer's avatar
Henrik Askjer committed
        let q = this.$route.query.q
        q = q.replace("*", "[^\\s]*")
        q = q.replace("_", "[^\\s]")
        console.log(q)
        return q
Henrik Askjer's avatar
Henrik Askjer committed
      }
      return false
    },
Ole Voldsæter's avatar
Ole Voldsæter committed
    unparsed: function(){
      let lang = this.dictionary
      return this.body.items.map(
Ole Voldsæter's avatar
Ole Voldsæter committed
        function(item){
          if      (item.type_ == 'usage') return {type: item.type_, html: item.text, tag: 'mark'}
Ole Voldsæter's avatar
Ole Voldsæter committed
          else if (item.type_ == 'article_ref') return {
                                                          type: item.type_,
                                                          lemmas: item.lemmas,
                                                          link_text: item.word_form ||  item.lemmas[0].lemma,
Ole Voldsæter's avatar
Ole Voldsæter committed
                                                          ref: '/' + lang + '/' + item.article_id + '/' + encodeURIComponent(item.word_form ||  item.lemmas[0].lemma) + (item.definition_id ? '#def' + item.definition_id : ''),
Ole Voldsæter's avatar
Ole Voldsæter committed
                                                          article_id: item.article_id,
                                                          definition_id: item.definition_id,
                                                          definition_order: item.definition_order,
          else if (item.type_ == 'pronunciation') return {type: item.type_, html: item.string}
Petr Kalashnikov's avatar
Petr Kalashnikov committed
          else if (item.type_ == 'pronunciation_guide') return {type: item.type_, body: item, html: '', tag: 'DefElement', props: {body: item, tag: 'i', dictionary: lang}}
Ole Voldsæter's avatar
Ole Voldsæter committed
          else if (item.type_ == 'superscript') return {type: item.type_, html: item.text, tag: 'sup'}
          else if (item.type_ == 'subscript') return {type: item.type_, html: item.text, 'tag': 'sub'}
Ole Voldsæter's avatar
Ole Voldsæter committed
          else if (item.type_ == 'quote_inset') return {type: item.type_, body: item, html: '', tag: 'DefElement', props: {body: item, tag: 'i', dictionary: lang}}
Ole Voldsæter's avatar
Ole Voldsæter committed
          else if (item.type_ == 'fraction') return helpers.fraction(item.numerator, item.denominator)
          else if (item.id) return {type: item.type_, html:  (entities[lang][item.id] || {})['expansion'] || item.id}
          else return {type: item.type_ || 'plain', html: item}
Ole Voldsæter's avatar
Ole Voldsæter committed
        }
      )
    },
    assemble_text: function(){
      var old_parts = this.body.content.split(/(\$)/)
Ole Voldsæter's avatar
Ole Voldsæter committed
      var text_items = this.unparsed.slice(0).reverse()
      var new_parts = []
      old_parts.forEach(function(item){
        if(item == '$') {
          new_parts.push(text_items.pop())
        } else if (item.length) {
          new_parts.push({type: 'plain', html: item})
        }
      })
      return new_parts
    }
Ole Voldsæter's avatar
Ole Voldsæter committed
  },
  methods: {
Henrik Askjer's avatar
Henrik Askjer committed
    highlight_hits: function(text, type) {
Henrik Askjer's avatar
Henrik Askjer committed
      if (text != "" && this.fulltext) {
        let regex = new RegExp("("+this.fulltext+")", "gi")
        if (regex.test(text)) {
          console.log("split", text.split(new RegExp("^\s("+this.fulltext+")", "gi")))
          console.log(this.fulltext)
          let components = text.split(regex)
Henrik Askjer's avatar
Henrik Askjer committed
        return components.map(item => {
Henrik Askjer's avatar
Henrik Askjer committed
          if (regex.test(item)) {
Henrik Askjer's avatar
Henrik Askjer committed
            return {text: item, type: "highlighted"}
          }
          else {
            return {text: item, type}
          }
        })
Henrik Askjer's avatar
Henrik Askjer committed
        }
Henrik Askjer's avatar
Henrik Askjer committed
      }
Henrik Askjer's avatar
Henrik Askjer committed
      return [{text, type}]
      
Henrik Askjer's avatar
Henrik Askjer committed
      
    },
    add_highlight: function(text) {
      
      if (!this.fulltext) {
        return text
      }
      else {
        let regex = new RegExp("(^| |-)("+this.fulltext+")(-| |$)", "gi")
      let old_parts = text.split(regex)
      console.log("OLD",old_parts)

      return old_parts.map(item => {
        
        return item == this.fulltext ? {text: item, type: 'strong'}: {text: item}
      })
      
      }

    },
Ole Voldsæter's avatar
Ole Voldsæter committed
    article_link_click: function(item) {
      this.$emit('article-click', item)
    },
    roman_hgno: helpers.roman_hgno
Ole Voldsæter's avatar
Ole Voldsæter committed
  }
}
</script>
Ole Voldsæter's avatar
Ole Voldsæter committed

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
Ole Voldsæter's avatar
Ole Voldsæter committed
  font-style: italic;
}

.pronunciation_guide {
  font-size: smaller;
}

.numerator{
  vertical-align: super;
  padding-right: 2px;
}

.denominator {
  vertical-align: sub;
  padding-left: 2px;
mark {
  background: rgba(255, 255, 255, 0);
Ole Voldsæter's avatar
Ole Voldsæter committed
  color: inherit;
.article_ref {
  text-decoration: none;

}

.link_text {
  text-decoration: underline;

}

.homograph, .def_order{
  text-decoration: none !important;
  color: black

Ole Voldsæter's avatar
Ole Voldsæter committed

Ole Voldsæter's avatar
Ole Voldsæter committed
</style>