<?php

/* functions.vcab.php
 *
 * vcab v0.6
 * Copyleft (c) 2022 Bailey Moore <bunz@sdf.org>
 * gopher://sdf.org/1/users/bunz/code/vcab.zip
 *
 * Free for all. There's not much to steal.
 *
 */

global $file, $website;
$tags = array('<i>', '</i>', '<b>', '</b> ', '<div class="ds-single">', '<div class="ds-list">', '</div>', '<span class="illustration">', '</span>');
$n1 = array('1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.');
$n2 = array(' (1)', '(2)', '(3)', '(4)', '(5)', '(6)', '(7)', '(8)', '(9)');

function add_entry($word, $full) {
	global $main, $file;
	$open = fopen($file, "a+");
	$node = $full == TRUE ? get_entry($word) : 0;
	$true = 0;

	if ($node != 0) {
		foreach ($node as $n) {
			if (fwrite($open, $n . "\n")) {
				$true++;
			}
		}
	}
	else {
		if (!strpos($word, "-")) {
			$word = $word . " -";
		}

		if (fwrite($open, $word . "\n")) {
			$true++;
		}
	}
	fclose($open);
	exec('sort ' . $file . ' > ' . $main . 'new.vocabulary.list');
	exec('rename -f ' . $main . 'new.vocabulary.list' . ' ' . $file);

	if ($true == 0) {
		return FALSE;
	}
	return TRUE;
}

function get_entry($word) {
	global $website, $tags, $n1, $n2;
	$definition = array();
	$lines = file($website . $word);
	$html = "";
	$z = 0;

	if ($website == "http://www.thefreedictionary.com/") {
		foreach ($lines as $line) {
			if (search_string("pseg", $line)) {
				$html = $line;
				break;
			}
		}

		if (!empty($html)) {
			$html = get_string_between($html, '</span><div class="pseg">', '<hr align="left" class="hmshort">');
			$pseg = substr_count($html, "pseg") + 1;
			$node = $html;

			if ($pseg > 1) {
				while ($pseg != 0) {
					if (search_string("pseg", $html)) {
						$explode = explode('<div class="pseg">', $html, 2);
						$node = $explode[0];
					}

					if (search_string('<div class="ds-single">', $node)) {
						$definition[$z] = $word . " - " . trim(get_string_between($node, '<i>', '</i>')) . " " . 
trim(get_string_between($node, '<div class="ds-single">', '</div></div>'));
						$definition[$z] = string_ends_with($definition[$z], ".") ? strtolower(rtrim($definition[$z], ".")) : 
strtolower($definition[$z]);
					}
					elseif (search_string('<div class="ds-list">', $node)) {
						$format = str_replace($tags, "", $node);
						$format = str_replace($n1, $n2, $format);
						$format = strpos($format, ".(") ? str_replace(".(", " (", $format) : $format;
						$definition[$z] = string_ends_with($format, ".") ? $word . " - " . strtolower(rtrim($format, ".")) : $word . " - " 
. strtolower($format);
					}
					$node = $explode[1];

					if (strpos($definition[$z], ":")) {
						$format = explode(":", $definition[$z], 2);
						$definition[$z] = trim($format[0]);
					}
					$html = $node;
					$pseg--;
					$z++;
				}
			}
			else {
				if (search_string('<div class="ds-single">', $html)) {
					$definition[$z] = $word . " - " . trim(get_string_between($html, '<i>', '</i>')) . " " . trim(get_string_between($html, 
'<div class="ds-single">', '</div></div>'));
					$definition[$z] = string_ends_with($definition[$z], ".") ? strtolower(rtrim($definition[$z], ".")) : 
strtolower($definition[$z]);
				}
				elseif (search_string('<div class="ds-list">', $html)) {
					$format = str_replace($tags, "", $html);
					$format = str_replace($n1, $n2, $format);
					$format = strpos($format, ".(") ? str_replace(".(", " (", $format) : $format;
					$definition[$z] = string_ends_with($format, ".") ? $word . " - " . strtolower(rtrim($format, ".")) : $word . " - " . 
strtolower($format);
				}

				if (strpos($definition[$z], ":")) {
					$format = explode(":", $definition[$z], 2);
					$definition[$z] = trim($format[0]);
				}
			}
		}
		else {
			echo "\n[ ERROR ] Unable to retrieve word.\n";
			return FALSE;
		}
	}
	return $definition;
}

function itemize($string, $full = TRUE) {
	if ($full == TRUE) {
		if (strpos($string, ".")) {
			$exp1 = explode("-", $string, 2);
			$exp2 = explode(".", $exp1[1], 2);
			$word = trim($exp1[0]);
			$type = trim($exp2[0]);
			$definition = trim($exp2[1]);

			return array($word, $type, $definition);
		}
	}
	else {
		if (strpos($string, "-")) {
			$exp1 = explode("-", $string, 2);
			$word = trim($exp1[0]);
		}
		else {
			$word = trim($string);
		}
		return $word;
	}
	return FALSE;
}

function search_file($needle, $haystack, $return = FALSE) {
	$contents = file_get_contents($haystack);
	$pattern = preg_quote($needle, '/');
	$pattern = "/^.*$pattern.*\$/m";

	if (preg_match_all($pattern, $contents, $matches)) {
		if ($return == TRUE) {
			return $matches;
		}
		return TRUE;
	}
	return FALSE;
}

function search_string($needle, $haystack) {
	if (preg_match_all("/$needle/im", $haystack) || strpos($haystack, $needle)) {
		return TRUE;
	}
	return FALSE;
}

function get_string_between($string, $start, $end) {
	$string = ' ' . $string;
	$ini = strpos($string, $start);

	if ($ini == 0) {
		return '';
	}
	$ini += strlen($start);
	$len = strpos($string, $end, $ini) - $ini;

	return substr($string, $ini, $len);
}

function string_ends_with($haystack, $needle, $case = TRUE) {
    $expected_position = strlen($haystack) - strlen($needle);

	if ($case) {
		return strrpos($haystack, $needle, 0) === $expected_position;
	}
	return strripos($haystack, $needle, 0) === $expected_position;
}

function vcab_configure() {
	global $main, $file;

	if (file_exists($main . ".vcabrc")) {
		$config = fopen($main . ".vcabrc", "w");
	}
	echo "\n\n\t[ vcab Configuration Module ]\n";
	echo "\n\t\t \n";
	echo "\n\t\t1) Vocabulary file: $file\n";
	echo "\n\t\t2) Load config file automatically: no\n";
	echo "\n\t\t3) \n";
	echo "\n\t\t4) \n";
	echo "\n\t\t5) \n";
	echo "\n\t\t6) \n";
	echo "\n\t\t7) \n";
	echo "\n\t\t8) \n";
	echo "\n\t\t9) \n";
}

?>