From 4d3132e151c5135e2e013bc88f20895fe0ceea00 Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Sun, 3 May 2020 23:02:33 -0600 Subject: [PATCH] Render etymology in public view --- src/js/view/render.js | 7 +++ src/php/api/PublicDictionary.php | 93 ++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 39 deletions(-) diff --git a/src/js/view/render.js b/src/js/view/render.js index 2955fbb..9c59beb 100644 --- a/src/js/view/render.js +++ b/src/js/view/render.js @@ -182,6 +182,8 @@ export function renderWords() { partOfSpeech: removeTags(originalWord.partOfSpeech), definition: removeTags(originalWord.definition), details: originalWord.details, + etymology: typeof originalWord.etymology === 'undefined' || originalWord.etymology.length < 1 ? null + : originalWord.etymology.join(', '), wordId: originalWord.wordId, }); @@ -202,6 +204,11 @@ export function renderWords() {
${md(word.details)}
+ ${word.etymology === null ? '' : `
+
Etymology (Root Word${originalWord.etymology.length !== 1 ? 's' : ''})
+
+ ${md(word.etymology).replace(/<\/?p>/g, '')} +
`} `; }); diff --git a/src/php/api/PublicDictionary.php b/src/php/api/PublicDictionary.php index 003bfc4..8d218dc 100644 --- a/src/php/api/PublicDictionary.php +++ b/src/php/api/PublicDictionary.php @@ -93,7 +93,11 @@ class PublicDictionary { ); if (!is_null($row['etymology'])) { - $word['etymology'] = $row['etymology']; + if (strlen($row['etymology']) > 0) { + $word['etymology'] = array_map(function ($root) use($dictionary) { + return $this->getWordReferenceHTML(strip_tags($root), $dictionary); + }, explode(',', $row['etymology'])); + } } return $word; @@ -125,7 +129,10 @@ class PublicDictionary { private function getWordsAsEntered() { if (!isset($this->original_words)) { - $query = "SELECT words.* FROM words JOIN dictionaries ON id = dictionary WHERE dictionary=? AND is_public=1"; + $query = "SELECT words.*, words_advanced.etymology FROM words +LEFT JOIN words_advanced ON words_advanced.dictionary = words.dictionary AND words_advanced.word_id = words.word_id +JOIN dictionaries ON dictionaries.id = words.dictionary +WHERE words.dictionary=? AND is_public=1"; $this->original_words = $this->db->query($query, array($this->details['externalID']))->fetchAll(); } return $this->original_words; @@ -189,43 +196,9 @@ class PublicDictionary { if (preg_match_all('/\{\{.+?\}\}/', $details, $references) !== false) { $references = array_unique($references[0]); foreach($references as $reference) { - $word_to_find = preg_replace('/\{\{|\}\}/', '', $reference); - $homonymn = 0; - - if (strpos($word_to_find, ':') !== false) { - $separator = strpos($word_to_find, ':'); - $homonymn = substr($word_to_find, $separator + 1); - $word_to_find = substr($word_to_find, 0, $separator); - if ($homonymn && trim($homonymn) && intval(trim($homonymn)) > 0) { - $homonymn = intval(trim($homonymn)); - } else { - $homonymn = false; - } - } - - $target_id = false; - $reference_ids = $this->getWordIdsWithName($dictionary_id, $word_to_find); - - if (count($reference_ids) > 0) { - if ($homonymn !== false && $homonymn > 0) { - if (isset($reference_ids[$homonymn - 1])) { - $target_id = $reference_ids[$homonymn - 1]; - } - } else if ($homonymn !== false) { - $target_id = $reference_ids[0]; - } - - if ($target_id !== false) { - if ($homonymn < 1) { - $homonymn = 1; - } - $homonymn_sub_html = count($reference_ids) > 1 && $homonymn - 1 >= 0 ? '' . $homonymn . '' : ''; - $site_root = substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], $dictionary_id)); - $markdown_link = '' - . '' . $this->translateOrthography($word_to_find, $dictionary_id) . '' . $homonymn_sub_html - . ''; - $details = str_replace($reference, $markdown_link, $details); - } + $reference_link = $this->getWordReferenceHTML($reference, $dictionary_id); + if ($reference_link !== $reference) { + $details = str_replace($reference, $markdown_link, $details); } } } @@ -233,6 +206,48 @@ class PublicDictionary { return $details; } + private function getWordReferenceHTML($reference, $dictionary_id) { + $word_to_find = preg_replace('/\{\{|\}\}/', '', $reference); + $homonymn = 0; + + if (strpos($word_to_find, ':') !== false) { + $separator = strpos($word_to_find, ':'); + $homonymn = substr($word_to_find, $separator + 1); + $word_to_find = substr($word_to_find, 0, $separator); + if ($homonymn && trim($homonymn) && intval(trim($homonymn)) > 0) { + $homonymn = intval(trim($homonymn)); + } else { + $homonymn = false; + } + } + + $target_id = false; + $reference_ids = $this->getWordIdsWithName($dictionary_id, $word_to_find); + + if (count($reference_ids) > 0) { + if ($homonymn !== false && $homonymn > 0) { + if (isset($reference_ids[$homonymn - 1])) { + $target_id = $reference_ids[$homonymn - 1]; + } + } else if ($homonymn !== false) { + $target_id = $reference_ids[0]; + } + + if ($target_id !== false) { + if ($homonymn < 1) { + $homonymn = 1; + } + $homonymn_sub_html = count($reference_ids) > 1 && $homonymn - 1 >= 0 ? '' . $homonymn . '' : ''; + $site_root = substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], $dictionary_id)); + return '' + . '' . $this->translateOrthography($word_to_find, $dictionary_id) . '' . $homonymn_sub_html + . ''; + } + } + + return $reference; + } + private function getWordIdsWithName($dictionary, $word_name) { if (is_numeric($dictionary)) { $query = "SELECT word_id FROM words WHERE dictionary=? AND name=?";