From 601841c75461f617d867db51baa784f58515e6d9 Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Thu, 30 May 2019 12:18:59 -0600 Subject: [PATCH] Correctly link public word references --- src/php/api/Dictionary.php | 62 +++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/php/api/Dictionary.php b/src/php/api/Dictionary.php index f3e3f66..924a550 100644 --- a/src/php/api/Dictionary.php +++ b/src/php/api/Dictionary.php @@ -165,12 +165,13 @@ VALUES ($new_id, ?, ?, ?, ?)"; $query = "SELECT words.* FROM words JOIN dictionaries ON id = dictionary WHERE dictionary=? AND word_id=? AND is_public=1"; $result = $this->db->query($query, array($dictionary, $word))->fetch(); if ($result) { + $details = $this->parseReferences($result['details'], $dictionary); return array( 'name' => $result['name'], 'pronunciation' => $result['pronunciation'], 'partOfSpeech' => $result['part_of_speech'], 'definition' => $result['definition'], - 'details' => $result['details'], + 'details' => $details, 'lastUpdated' => is_null($result['last_updated']) ? intval($result['created_on']) : intval($result['last_updated']), 'createdOn' => intval($result['created_on']), 'wordId' => intval($result['word_id']), @@ -180,6 +181,65 @@ VALUES ($new_id, ?, ?, ?, ?)"; return false; } + private function parseReferences($details, $dictionary_id) { + 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 = $homonymn > 0 ? '' . $homonymn . '' : ''; + $site_root = substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], $dictionary_id)); + $markdown_link = '[' . $word_to_find . $homonymn_sub_html . '](' . $site_root . $dictionary_id . '/' . $target_id . ')'; + $details = str_replace($reference, $markdown_link, $details); + } + } + } + } + + return $details; + } + + private function getWordIdsWithName($dictionary, $word_name) { + if (is_numeric($dictionary)) { + $query = "SELECT word_id FROM words WHERE dictionary=? AND name=?"; + $results = $this->db->query($query, array($dictionary, $word_name))->fetchAll(); + if ($results) { + return array_map(function ($row) { + return intval($row['word_id']); + }, $results); + } + } + return array(); + } + public function getDetails ($user, $dictionary) { $query = "SELECT * FROM dictionaries JOIN dictionary_linguistics ON dictionary = id WHERE user=$user AND id=$dictionary"; $result = $this->db->query($query)->fetch();