Skip to content
Snippets Groups Projects
DefElement.vue 2.69 KiB
Newer Older
Ole Voldsæter's avatar
Ole Voldsæter committed
<template>
  <li :class="body.type_"><!--
 --><span v-for="(item, index) in assemble_text"
          :class="item.type"
          :key="index"><!--
          -->{{item.html}}<!--
       --><router-link v-if="item.type == 'article_ref'" :to="item.ref" @click.native="article_link_click(item)"><!--
         --><span class="homograph" :key="index">{{item.lemmas[0].hgno ? String.fromCharCode(0x215f + item.lemmas[0].hgno) + ' ' : ''}}</span>{{item.lemmas[0].lemma}} {{item.definition_order ? ` (${item.definition_order})` : ''}}<!--
       --></router-link><!--
 --></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'
import languages from '../utils/languages.js'

Ole Voldsæter's avatar
Ole Voldsæter committed
export default {
  name: 'DefElement',
  props: {
    body: Object
Ole Voldsæter's avatar
Ole Voldsæter committed
  },
  computed: {
    unparsed: function(){
      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}
Ole Voldsæter's avatar
Ole Voldsæter committed
          else if (item.type_ == 'article_ref') return {
                                                          type: item.type_,
                                                          lemmas: item.lemmas,
Ole Voldsæter's avatar
Ole Voldsæter committed
                                                          ref: item.article_id + (item.definition_id ? '#def' + item.definition_id : ''),
                                                          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}
          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}
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: {
    article_link_click: function(item) {
      this.$emit('article-click', item)
    }
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;
}

span.language {
  font-weight: bold;
}
Ole Voldsæter's avatar
Ole Voldsæter committed

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

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