mirror of
				https://github.com/Alamantus/Lexiconga.git
				synced 2025-11-04 02:07:05 +01:00 
			
		
		
		
	Correctly link public word references
This commit is contained in:
		
							parent
							
								
									b9cfce5a05
								
							
						
					
					
						commit
						601841c754
					
				
					 1 changed files with 61 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -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 ? '<sub>' . $homonymn . '</sub>' : '';
 | 
			
		||||
            $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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue