Skip to content
Snippets Groups Projects
Article.vue 5.73 KiB
Newer Older
Ole Voldsæter's avatar
Ole Voldsæter committed
<template>
Ole Voldsæter's avatar
Ole Voldsæter committed
  <article v-if="article" :class="dictionary">
    <Header :lemmas="article.lemmas" :dictionary="dictionary" :article_id="article.article_id" />
    <div class="article_content" :class="$vuetify.breakpoint.name">
      <section v-if="article.body.pronunciation && article.body.pronunciation.length" class="pronunciation">
        <h3>Uttale</h3>
          <ul>
            <DefElement v-for="(element, index) in article.body.pronunciation" :dictionary="dictionary" :key="index" :body='element' @article-click="article_link_click" />
          </ul>
      </section>
Ole Voldsæter's avatar
Ole Voldsæter committed
      <section v-if="article.body.etymology && article.body.etymology.length" class="etymology">
Ole Voldsæter's avatar
Ole Voldsæter committed
        <h3>Opphav</h3>
Ole Voldsæter's avatar
Ole Voldsæter committed
          <ul>
            <DefElement v-for="(element, index) in article.body.etymology" :dictionary="dictionary" :key="index" :body='element' @article-click="article_link_click" />
          </ul>
      </section>
      <section class="definitions" v-if="has_content">
        <h3>{{def_label}}</h3>
        <ol>
          <Definition v-for="definition in article.body.definitions" :dictionary="dictionary" :level="1" :key="definition.id" :body='definition' @article-click="article_link_click" />
        </ol>
      </section>
      <section v-if="sub_articles.length" class="expressions">
        <h3>Faste uttrykk</h3>
Ole Voldsæter's avatar
Ole Voldsæter committed
        <ul>
          <SubArticle :body="subart" v-for="(subart, index) in sub_articles" :dictionary="dictionary" :key="index" @article-click="article_link_click" />
Ole Voldsæter's avatar
Ole Voldsæter committed
        </ul>
        <router-link :to="link_to_self.ref" @click.native="details_click(link_to_self)">
Ole Voldsæter's avatar
Ole Voldsæter committed
          Velg <img class="nav_arrow" src="../assets/arrow_right.svg">
Henrik Askjer's avatar
Henrik Askjer committed
    <ArticleFooter :article="article"/>
</article>
Ole Voldsæter's avatar
Ole Voldsæter committed
</template>

<script src="/dist/vue-social-sharing.js"></script>
Ole Voldsæter's avatar
Ole Voldsæter committed
<script>
Ole Voldsæter's avatar
Ole Voldsæter committed
import DefElement from './DefElement.vue'
import Definition from './Definition.vue'
Ole Voldsæter's avatar
Ole Voldsæter committed
import SubArticle from './SubArticle.vue'
import Header from './Header.vue'
Henrik Askjer's avatar
Henrik Askjer committed
import ArticleFooter from './ArticleFooter.vue'
Ole Voldsæter's avatar
Ole Voldsæter committed
function find_sub_articles(definition) {
  let sub_art_list = []
  let sub_definitions = definition.elements.filter(el => el.type_ == 'definition')

  sub_definitions.forEach((subdef, i) => {
    sub_art_list = sub_art_list.concat(find_sub_articles(subdef))
  })

  let sub_articles = definition.elements.filter(el => el.type_ == 'sub_article')
  sub_art_list = sub_art_list.concat(sub_articles)

  return sub_art_list
}

function find_content(definition) {
  let content_list = []
  let sub_definitions = definition.elements.filter(el => el.type_ == 'definition')

  sub_definitions.forEach((subdef, i) => {
    content_list = content_list.concat(find_content(subdef))
  })

  let content_nodes = definition.elements.filter(el => ['explanation', 'example', 'compound_list'].includes(el.type_))
  content_list = content_list.concat(content_nodes)

  return content_list
}

Ole Voldsæter's avatar
Ole Voldsæter committed
export default {
  name: 'Article',
  props: {
    article: Object
    computed: {
        ref: '/' + this.dictionary + '/' + this.article.article_id + '/' + encodeURIComponent(this.article.lemmas[0].lemma),
    dictionary: function() {
      return this.article.dictionary
Ole Voldsæter's avatar
Ole Voldsæter committed
      return this.dictionary == 'bob' ? 'Betydning og bruk' : 'Tyding og bruk'
    },
    example_label: function() {
      return this.dictionary == 'bob' ? 'Eksempel' : 'Døme'
Ole Voldsæter's avatar
Ole Voldsæter committed
    },
    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]))
    },
    has_content: function() {
      return this.article.body.definitions.reduce((acc, val) => acc.concat(find_content(val)), []).length > 0
Ole Voldsæter's avatar
Ole Voldsæter committed
  components: {
    Definition,
Ole Voldsæter's avatar
Ole Voldsæter committed
    SubArticle,
Henrik Askjer's avatar
Henrik Askjer committed
    Header,
    ArticleFooter
Ole Voldsæter's avatar
Ole Voldsæter committed
  methods: {
    article_link_click: function(item) {
      this.$emit('article-click', item)
    },
    details_click: function(item) {
      this.$emit('details-click', item)
Ole Voldsæter's avatar
Ole Voldsæter committed
  position: relative;
  margin: 10px;
  border-radius: 30px;
  border: solid 1px var(--v-primary-base);
  background-color: var(--v-tertiary-base);
#single_article_container article {
  border-style: none;
}

Ole Voldsæter's avatar
Ole Voldsæter committed
section {
  padding-top: 1em;
}

Ole Voldsæter's avatar
Ole Voldsæter committed
h3 {
Ole Voldsæter's avatar
Ole Voldsæter committed
  color: #560027;
Ole Voldsæter's avatar
Ole Voldsæter committed
  font-variant: small-caps;
section.etymology > h3, section.pronunciation > h3 {
  display: inline;
  font-size: 14px;
Ole Voldsæter's avatar
Ole Voldsæter committed
  font-variant: revert;
}

section.etymology ul, section.pronunciation ul, section.etymology li, section.pronunciation li {
  display: inline;
}

section.etymology li:not(:first-child):not(:last-child):before, section.pronunciation li:not(:first-child):not(:last-child):before {
  content: ", ";
section.etymology li:not(:first-child):last-child:before, section.pronunciation li:not(:first-child):last-child:before {
  content: " eller ";
  font-style: italic;
  font-size: smaller;
}

li {
  padding-bottom: 4px;
}

li.level1.definition {
  list-style: upper-alpha;
}

li.level2.definition {
  list-style: decimal;
}

Ole Voldsæter's avatar
Ole Voldsæter committed
  /* Norsk ordbok skal ha "lower.alpha" her */
  list-style: disc;
}

li.sub_article > ul {
  padding-left: 0px;
}

::marker {
  font-weight: bold;
Ole Voldsæter's avatar
Ole Voldsæter committed
  color: var(--v-primary-base);
Ole Voldsæter's avatar
Ole Voldsæter committed
ol > li:only-child.level1, li:only-child.level2 {
  /* level3 a.k.a. underdefinisjoner skal vises med bullet selv om de står alene */
ul, ol {
Ole Voldsæter's avatar
Ole Voldsæter committed
  padding-left: 12px !important;
  list-style:none;
}

ul li.definition {
  list-style: disc;
Ole Voldsæter's avatar
Ole Voldsæter committed
.fade .nav_arrow {
  vertical-align: sub;
}

</style>