diff --git a/e107_plugins/linkwords/e_tohtml.php b/e107_plugins/linkwords/e_tohtml.php
new file mode 100755
index 000000000..f9d8691bc
--- /dev/null
+++ b/e107_plugins/linkwords/e_tohtml.php
@@ -0,0 +1,159 @@
+block_list = explode("|",substr($pref['lw_page_visibility'],2)); // Knock off the 'show/hide' flag
+ foreach ($this->block_list as $p)
+ {
+ if ($p=trim($p))
+ {
+ if(substr($p, -1) == '!')
+ {
+ $p = substr($p, 0, -1);
+ if(substr($check_url, strlen($p)*-1) == $p) return;
+ }
+ else
+ {
+ if(strpos($check_url, $p) !== FALSE) return;
+ }
+ }
+ }
+
+ // Will probably need linkwords on this page - so get the info
+ $this->lw_enabled = TRUE;
+ $link_sql = new db;
+ if($link_sql -> db_Select("linkwords", "*", "linkword_active=0"))
+ {
+ while ($row = $link_sql->db_Fetch())
+ {
+ $lw = trim(strtolower($row['linkword_word']));
+ if (strpos($lw,','))
+ { // Several words to same link
+ $lwlist = explode(',',$lw);
+ foreach ($lwlist as $lw)
+ {
+ $this->word_list[] = trim($lw);
+ $this->link_list[] = $row['linkword_link'];
+ }
+ }
+ else
+ {
+ $this->word_list[] = $lw;
+ $this->link_list[] = $row['linkword_link'];
+ }
+ }
+ }
+ if (is_array($pref['lw_context_visibility']))
+ {
+ $this->area_opts = $pref['lw_context_visibility'];
+ }
+ }
+
+
+ function linkwords($text,$area = 'olddefault')
+ {
+ if (!$this->lw_enabled || !array_key_exists($area,$this->area_opts) || !$this->area_opts[$area]) return $text; // No linkwords in disabled areas
+
+
+// Split up by HTML tags and process the odd bits here
+ $ptext = "";
+ $lflag = FALSE;
+
+ $content = preg_split('#(<.*?>)#mis', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
+ foreach($content as $cont)
+ {
+ if (strpos($cont, "<") !== FALSE)
+ { // Its some HTML
+ $ptext .= $cont;
+ if (strpos($cont,"linksproc($cont,0,count($this->word_list));
+ }
+ else
+ {
+ $ptext .= $cont;
+ }
+ }
+ }
+ }
+ return $ptext;
+ }
+
+ function linksproc($text,$first,$limit)
+ { // This function is called recursively - it splits the text up into blocks - some containing a particular linkword
+ while (($first < $limit) && (stripos($text,$this->word_list[$first]) === FALSE)) { $first++; };
+ if ($first == $limit) return $text; // Return if no linkword found
+
+ // There's at least one occurrence of the linkword in the text
+ $ret = '';
+ $lw = $this->word_list[$first];
+ // This splits the text into blocks, some of which will precisely contain a linkword
+ $split_line = preg_split('#\b('.$lw.')\b#i', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
+ foreach ($split_line AS $sl)
+ {
+ if (strcasecmp($sl,$lw) == 0)
+ { // Do linkword replace
+ $ret .= " {$sl}";
+ }
+ elseif (trim($sl))
+ { // Something worthwhile left - look for more linkwords in it
+ $ret .= $this->linksproc($sl,$first+1,$limit);
+ }
+ else
+ {
+ $ret .= $sl; // Probably just some white space
+ }
+ }
+ return $ret;
+ }
+}
+
+?>
\ No newline at end of file