diff --git a/tw/error/FOO_error.php b/tw/error/FOO_error.php new file mode 100644 index 000000000..3924768ee --- /dev/null +++ b/tw/error/FOO_error.php @@ -0,0 +1,43 @@ + +/* + * tag|wall | PHP Tag Filter| + * --------------------------------------------------------------------- + + Copyright (C) 2002 Juraj 'HVGE' Durech + Copyright (C) 2002 www.designia.sk + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + * --------------------------------------------------------------------- + * tag|wall error module + * + * description: + * - this is default error module. + */ +class FOO_error extends TW_errors +{ + function FOO_error($options = 0) + { + $this->TW_errors($options); + } + + function add($errval, $position, $show_code, $param1=null, $param2=null ) + { + $this->ErrorArray["TW_err_".$this->identifier++] = array($errval, $param1, $param2, $position, $show_code); + if($errval & 0xff00) $this->IsError = 1; + return null; + } +} +?> \ No newline at end of file diff --git a/tw/error/LINK_error.php b/tw/error/LINK_error.php new file mode 100644 index 000000000..580e15fbc --- /dev/null +++ b/tw/error/LINK_error.php @@ -0,0 +1,94 @@ + +/* + * tag|wall | PHP Tag Filter| + * --------------------------------------------------------------------- + + Copyright (C) 2002 Juraj 'HVGE' Durech + Copyright (C) 2002 www.designia.sk + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + * --------------------------------------------------------------------- + * tag|wall error module + * + * description: + * - this module appending automatic links and colored piece of bad code. + * + * - Module using following CSS classes (you must define it in your CSS stylesheet) + * + * .tw-err-int - internal error (in output string) + * .tw-err-err - standard error + * .tw-err-war - warning + * .tw-err-com - comment + * + * .tw-err-int-l - internal error (in error list) + * .tw-err-err-l - standard error + * .tw-err-war-l - warning + * .tw-err-com-l - comment + + */ +class LINK_error extends TW_errors +{ + function LINK_error($options = 0) + { + $this->TW_errors($options); + } + + function add($errval, $position, $show_code, $param1=null, $param2=null ) + { + $err_id = "TW_err_".$this->identifier++; + $this->ErrorArray[$err_id] = array($errval, $param1, $param2, $position, $show_code); + if($errval & 0xff00) $this->IsError = 1; + + // append errors and warnings + if(($errval & 0x0ff0) && $show_code != null ) + return ''.$show_code.''; + + return null; + } + + // You can call this method from your project and create nice list of errors. + // + // $lang - error string pack + // $mask - any combination of following masks: + // 0xf000 - internal, + // 0x0f00 - errors, + // 0x00f0 - warnings, + // 0x000f - comments + // + function create_list (&$lang, $mask = 0x0ff0) + { + $errors = $this->get_by_mask($mask); + + $out = "
' => '
'
+ $this->out .= $this->output->close( $tag );
+ $this->out .= $this->output->pair( $tag, $this->ATTRIBUTES );
+ return;
+ }
+ $this->out .= $this->output->pair( $tag, $this->ATTRIBUTES );
+ $this->stack_push( $tag );
+ }
+ return;
+ }
+ else
+ {
+ //disabled tag (or not supported) ######
+ return;
+ }
+ }
+
+/********************************************************************************************
+ * E N D _ T A G _ f i l t e r
+ *
+ */
+ function END_TAG_filter()
+ {
+ $tag = $this->TAG;
+ if( $tag == null )
+ {
+ // >
+ if ($tag = $this->stack_pop() )
+ {
+ $this->out .= $this->output->close($tag);
+ return;
+ }
+ else
+ {
+ // kunda underflow :)
+ return;
+ }
+ }
+ if(in_array($tag,$this->config_tags))
+ {
+ // enabled tag
+ if(is_string($this->config_attr[$tag]))
+ {
+ $this->TAG = $tag = $this->config_attr[$tag];
+ //tag substitution warning
+ }
+
+ $top = $this->stack_top( $tag );
+ if( $top )
+ {
+ $this->out .= $this->output->close( $tag );
+ $this->stack_pop();
+ return;
+ }
+
+ if( $this->stack_search($tag) )
+ {
+ // closing cross tags
+ while( ($top = $this->stack_pop()) != $tag )
+ {
+ /*if( !($this->tags[$top][0] & TW_OPT ) )
+ {
+ // auto close warning
+ }*/
+ $this->out .= $this->output->close( $top );
+ }
+ $this->out .= $this->output->close( $tag );
+ }
+ else
+ {
+ // ###### cross tag error
+ return;
+ }
+ }
+ // drop out warning
+ }
+
+
+/*
+ * THERE ARE STATE IN, OUT & NEW FUNCTIONS
+ *
+ */
+
+/********************************************************************************************
+ * STATE T_begin '<'
+ */
+ function T_begin_in()
+ {
+ $this->tag_position = $this->pti;
+ $this->TAG = null;
+ }
+
+ // --- MAIN TAG-FILTER FUNCTION ---
+
+ function T_begin_out($word)
+ {
+ $this->START_TAG_filter();
+ }
+
+/********************************************************************************************
+ * STATE TC_begin ''
+ */
+ function T_Cbegin_in()
+ {
+ $this->tag_position = $this->pti;
+ $this->TAG = null;
+ }
+
+ // TAG CLOSE function
+ //
+ function T_Cbegin_out($word)
+ {
+ $this->END_TAG_filter();
+ }
+
+/********************************************************************************************
+ * STATE T_gettag 'tagname'
+ */
+ function T_gettag_in()
+ {
+ $this->is_attributes = 0;
+ $this->ATTRIBUTES = null;
+ return;
+ }
+
+ function T_gettag_new($word) { $this->TAG = strtolower($word); }
+ function T_gettag_out($word) { return; }
+
+/********************************************************************************************
+ * STATE A_begin '__atr...'
+ */
+ function A_begin_in() { $this->ATTR = null; }
+ function A_begin_new($word) { $this->ATTR[0] = strtolower($word); }
+ function A_begin_out($word)
+ {
+ if( $this->is_attributes )
+ {
+ foreach( $this->ATTRIBUTES as $akey => $aval )
+ {
+ if($this->ATTR[0] == $aval[0])
+ {
+ // duplicate warning
+ $this->ATTRIBUTES[$akey] = $aval;
+ return;
+ }
+ }
+ }
+ else
+ {
+ $this->is_attributes = 1;
+ }
+ $this->ATTRIBUTES[] = $this->ATTR;
+ }
+
+/********************************************************************************************
+ * STATE V_begin 'atr...'
+ */
+ function V_begin_in() { $this->VALUE = null; }
+ function V_begin_out($word) { $this->ATTR[1] = $this->VALUE; }
+
+/********************************************************************************************
+ * STATE VALUE1
+ */
+ function VALUE1_in() { return; }
+ function VALUE1_out($word) { $this->VALUE = substr($word,0,strlen($word)-1); }
+
+/********************************************************************************************
+ * STATE VALUE2
+ */
+ function VALUE2_in() { return; }
+ function VALUE2_out($word)
+ {
+ $this->VALUE = str_replace("\"", """, substr($word, 0, strlen($word)-1) );
+ }
+/********************************************************************************************
+ * STATE VALUE3
+ */
+ function VALUE3_in() { return; }
+ function VALUE3_out($word) { $this->VALUE = $word; }
+
+
+} // END class TW_base
+?>
\ No newline at end of file
diff --git a/tw/lang/TW_lang.php b/tw/lang/TW_lang.php
new file mode 100644
index 000000000..2c962213a
--- /dev/null
+++ b/tw/lang/TW_lang.php
@@ -0,0 +1,183 @@
+
+/*
+ * tag|wall | PHP Tag Filter |
+ * ---------------------------------------------------------------------
+
+ Copyright (C) 2002 Juraj 'HVGE' Durech
+ Copyright (C) 2002 www.designia.sk
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * ---------------------------------------------------------------------
+ * TW - based on SHL Language File
+ *
+ * Spolocne so SHL
+ * - kompatibilita s FSHL generatorom 0.4.x
+ * - zakladna kostra stavoveho diagramu je spolocna
+ *
+ * Rozdiely voci SHL
+ * - polia maju iny vyznam pretoze spracuva iny stavovy automat
+ * - vsetky stavy sa volaju rekurentne
+ *
+ * function STATE_in() - vola sa pri vstupe do stavu (Ovplyvnuje flag PF_XIO)
+ * function STATE_out() - vola sa pri opusteni stavu (_RET) (Ovplyvnuje flag PF_XIO)
+ * tiez hned po navrate z rekurzie flag PF_XDONE sposobi zavolanie
+ * STATE_out() a opustenie aktualneho stavu (simulovany _RET)
+ * function STATE_new() - vola sa pri zmene stavu (Ovplyvnuje flag PF_XNEW)
+ */
+class TW_lang
+{
+ var $states;
+ var $initial_state;
+ var $keywords;
+ var $version;
+ var $signature;
+
+ function TW_lang()
+ {
+ $this->signature = "TW";
+ $this->version = "1.0";
+ $this->initial_state="OUT";
+ $this->states =
+ array
+ (
+ "OUT" => array (
+ array(
+ "<" => array("T_tagWall",0),
+
+ //"&" => array("VChar",0), // validate char (currently not implemented in base)
+ ),
+
+ PF_CLEAN, // PF_CLEAN - znaky sa forwarduju na vystup
+ 0,0
+ ),
+
+ "T_tagWall" => array (
+ array(
+ "ALPHA" => array("T_begin",1), // normal tag
+ "/" => array("T_Cbegin",0), // close tag
+ "<" => array("T_tagWall",1), // '<<<<<<<<' fix (faster than _RET)
+ "!--" => array("HTML_comment",0),
+ "_ALL" => array("_RET",0), // '' other fixes
+ ),
+
+ PF_XDONE,
+ 0,0
+ ),
+
+
+ "T_Cbegin" => array (
+ array(
+ "ALPHA" => array("T_gettag",1),
+ "_ALL" => array("_RET",0),
+ ),
+ PF_XIO | PF_XDONE, 0,0
+ ),
+
+
+ "T_begin" => array (
+ array(
+ "ALPHA" => array("T_gettag",1),
+ "_ALL" => array("_RET",0),
+ ),
+
+ PF_XIO | PF_XDONE, 0,0
+ ),
+
+
+ "T_gettag" => array (
+ array(
+ "!ALNUM"=> array("T_in",1),
+ ),
+
+ PF_XIO | PF_XDONE | PF_XNEW, 0,0
+ ),
+
+
+ "T_in" => array(
+ array(
+ "ALPHA" => array("A_begin",1), // char back to stream
+ ">" => array("_RET",0),
+ "/>" => array("_RET",0), // pozor na spracovanie v T_begin
+ ),
+
+ 0,0,0
+ ),
+
+ "A_begin" => array (
+ array(
+ "!ALPHA"=> array("V_begin",1),
+ ">" => array("_RET",1), // vracia string do streamu
+ "/>" => array("_RET",1), // pozor na spracovanie v TAGbegin
+ ),
+
+ PF_XIO | PF_XDONE | PF_XNEW , 0,0
+ ),
+
+ // this is wide attribute=value implementation
+ "V_begin" => array (
+ array(
+ '"' => array("VALUE1",0),
+ "'" => array("VALUE2",0),
+ "ALNUM" => array("VALUE3",1),
+
+ ">" => array("_RET",1),
+ "/>" => array("_RET",1),
+ ),
+
+ PF_XIO | PF_XDONE, 0,0
+ ),
+
+ // "DOUBLEQUOTED VALUE"
+ "VALUE1" => array(
+ array(
+ '"' => array("_RET",0),
+ ),
+ PF_XIO, 0,0
+ ),
+
+ // 'SINGLEQUOTED VALUE'
+ "VALUE2" => array(
+ array(
+ "'" => array("_RET",0),
+ ),
+ PF_XIO, 0,0
+ ),
+
+ // UNQUOTEDVALUE99
+ "VALUE3" => array(
+ array(
+/* "_" => array ("VALUE3",0), //Uncomment for better HTML4 compatibility (not recommended)
+ "." => array ("VALUE3",0),
+*/
+ "-" => array ("VALUE3",0),
+ "!ALNUM"=> array("_RET",1),
+ ),
+ PF_XIO, 0,0
+ ),
+
+ // all comment content will be removed
+ "HTML_comment" => array(
+ array(
+ "-->" => array("_RET",0),
+ ),
+ 0,0,0
+ ),
+ );
+
+ $this->keywords=null;
+ }
+}
+?>
\ No newline at end of file
diff --git a/tw/localization/EN_errors.php b/tw/localization/EN_errors.php
new file mode 100644
index 000000000..7e7a0a81b
--- /dev/null
+++ b/tw/localization/EN_errors.php
@@ -0,0 +1,57 @@
+
+/*
+ * tag|wall | PHP Tag Filter|
+ * ---------------------------------------------------------------------
+
+ Copyright (C) 2002 Juraj 'HVGE' Durech
+ Copyright (C) 2002 www.designia.sk
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * ---------------------------------------------------------------------
+ * tag|wall error strings
+ *
+ * NOTE:
+ * TW not using this file directly. You can include it to your project
+ * at your opinion. Then you can use method TW_errors::get_error_text()
+ * for getting error texts.
+ *
+ * Please correct my stupid english :)
+ */
+$tw_error_strings = array(
+
+ // comments & tips
+ TWE_OK => null,
+ TWE_VERSION => "Versions: parser V %s, language V%s",
+ TWE_CREDITS => "tag|wall: code Juraj Durech (hvge@cauldron.sk).",
+ TWE_NOTE => "%s",
+
+ // warnings
+ TWE_STACK_UNDERFLOW => "Stack underflow, tag '%s' was dropped out.",
+ TWE_STACK_NOT_EMPTY => "There are some unclosed tags on stack.",
+ TWE_UNEXPECTED_EOST => "Unexpected end of stream.",
+ TWE_UNEXPECTED_QUOTE => "Unexpected quote.",
+
+ // errors
+ TWE_SYNTAX => "HTML syntax error.",
+ TWE_TOO_MANY_ATTRS => "Too many attributes in tag '%s'.",
+
+ // internal errors
+ TWE_FILE_NOT_FOUND => "File '%s' not found.",
+ TWE_BAD_SIGNATURE => "Language '%s' have bad signature '%s'.",
+ TWE_LANG_NOT_FOUND => "Language '%s' not found.",
+
+ );
+?>
\ No newline at end of file
diff --git a/tw/output/HL_DEBUG_output.php b/tw/output/HL_DEBUG_output.php
new file mode 100644
index 000000000..4a2521bd4
--- /dev/null
+++ b/tw/output/HL_DEBUG_output.php
@@ -0,0 +1,74 @@
+highlight( "<$tag>" );
+ $attr = null;
+ foreach ($attributes as $value)
+ {
+ if($value[1]) $attr .= ' '.$value[0].'="'.$value[1].'"';
+ }
+ return $this->highlight( "<$tag$attr>" );
+ }
+
+ function single ($tag, &$attributes)
+ {
+ if($attributes == null)
+ return $this->highlight( "<$tag />" );
+ $attr = null;
+ foreach ($attributes as $value)
+ {
+ if($value[1]) $attr .= $value[0].'="'.$value[1].'" ';
+ }
+ return $this->highlight( "<$tag $attr/>" );
+ }
+
+ // template for end tags
+ function close ($tag)
+ {
+ return $this->highlight( "$tag>" );
+ }
+
+ function template_end() { return null; }
+
+
+ function highlight($string)
+ {
+ $string = str_replace("&","&",$string);
+ return ''.str_replace("<","<",$string).'';
+ }
+
+} //END class HTML_output
+
+?>
\ No newline at end of file
diff --git a/tw/output/HTML_output.php b/tw/output/HTML_output.php
new file mode 100644
index 000000000..3df2fef9d
--- /dev/null
+++ b/tw/output/HTML_output.php
@@ -0,0 +1,67 @@
+";
+ $attr = null;
+ foreach ($attributes as $value)
+ {
+ if($value[1]) $attr .= ' '.$value[0].'="'.$value[1].'"';
+ }
+ return "<$tag$attr>";
+ }
+
+ function single ($tag, &$attributes)
+ {
+ if($attributes == null)
+ return "<$tag>";
+ $attr = null;
+ foreach ($attributes as $value)
+ {
+ if($value[1]) $attr .= ' '.$value[0].'="'.$value[1].'"';
+ }
+ return "<$tag$attr>";
+ }
+
+ // template for end tags
+ function close ($tag)
+ {
+ return "$tag>";
+ }
+
+ function template_end() { return null; }
+
+} //END class HTML_output
+
+?>
\ No newline at end of file
diff --git a/tw/output/XHTML_output.php b/tw/output/XHTML_output.php
new file mode 100644
index 000000000..89207b611
--- /dev/null
+++ b/tw/output/XHTML_output.php
@@ -0,0 +1,67 @@
+";
+ $attr = null;
+ foreach ($attributes as $value)
+ {
+ if($value[1]) $attr .= ' '.$value[0].'="'.$value[1].'"';
+ }
+ return "<$tag$attr>";
+ }
+
+ function single ($tag, &$attributes)
+ {
+ if($attributes == null)
+ return "<$tag />";
+ $attr = null;
+ foreach ($attributes as $value)
+ {
+ if($value[1]) $attr .= $value[0].'="'.$value[1].'" ';
+ }
+ return "<$tag $attr/>";
+ }
+
+ // template for end tags
+ function close ($tag)
+ {
+ return "$tag>";
+ }
+
+ function template_end() { return null; }
+
+} //END class XHTML_output
+
+?>
\ No newline at end of file
diff --git a/tw/tw-config.php b/tw/tw-config.php
new file mode 100644
index 000000000..63b4fb40e
--- /dev/null
+++ b/tw/tw-config.php
@@ -0,0 +1,117 @@
+
+/*
+ * tag|wall | PHP Tag Filter|
+ * ---------------------------------------------------------------------
+
+ Copyright (C) 2002 designia.sk
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * ---------------------------------------------------------------------
+ * tw-config.php
+ *
+ */
+
+// paths
+define ('TW_PATH', 'tw/');
+define ('TW_LANG', TW_PATH.'lang/');
+define ('TW_CACHE', TW_PATH.'tw_cache/');
+define ('TW_SETUP', TW_PATH.'filter-setup/');
+define ('TW_ERRMODULE', TW_PATH.'error/');
+define ('TW_OUTMODULE', TW_PATH.'output/');
+
+// tag flags
+define ('TW_NOP', 0x0001);
+define ('TW_OPT', 0x0002);
+define ('TW_OVR', 0x0004);
+define ('TW_DUP', 0x0008);
+
+// attr filter commands
+define ('TW_ALL', 0);
+define ('TW_URL', 1); // value is url
+define ('TW_LINK', 2); // value is link
+define ('TW_NUM', 3); // value must be between
+define ('TW_CASE', 4); // value must be in case of..
+define ('TW_REQ', 8); // required attribute
+
+define ('TW_RQ_ALL', TW_REQ);
+define ('TW_RQ_URL', 1 | TW_REQ);
+define ('TW_RQ_LINK', 2 | TW_REQ);
+define ('TW_RQ_NUM', 3 | TW_REQ);
+define ('TW_RQ_CASE', 4 | TW_REQ);
+
+if(!defined('FSHL_WITH_TW_DEFINED'))
+{
+ define ('FSHL_WITH_TW_DEFINED', 1);
+
+ // debug modes (on - 1, off - 0)
+ // only shlParser supports DEBUG modes
+ define ('DEBUG_STATE', 0); // enable debug states
+ define ('DEBUG_REPORT', 0); // enable parser error reports and infos
+
+ // fshlParser() 'option' flags (not used at this time)
+ define ('P_DISABLE_RECURSION', 0x0001);
+ define ('P_DISABLE_NEWLANG', 0x0002);
+ define ('P_DISABLE_EXECUTE', 0x0004);
+ define ('P_DISABLE_EXIT', 0x0008);
+ define ('P_DEFAULT', 0x0000);
+
+ // F/SHL state flags
+ define ('PF_VOID', 0x0000);
+ define ('PF_KEYWORD', 0x0001);
+ define ('PF_RECURSION', 0x0004);
+ define ('PF_NEWLANG', 0x0008);
+ define ('PF_EXECUTE', 0x0010); // not used
+
+ // TW state flags
+ define ('PF_CLEAN', 0x0100);
+ define ('PF_XIO', 0x0200);
+ define ('PF_XDONE', 0x0400);
+ define ('PF_XNEW', 0x0800);
+
+ // state field indexes
+ define ('XL_DIAGR', 0);
+ define ('XL_FLAGS', 1);
+ define ('XL_CLASS', 2);
+ define ('XL_DATA', 3);
+
+ define ('XL_DSTATE', 0);
+ define ('XL_DTYPE', 1);
+
+ // internal and special states
+ define ('P_RET_STATE', '_RET');
+ define ('P_QUIT_STATE', '_QUIT');
+
+ // group delimiters
+ $group_delimiters=array(
+
+ "SPACE", "!SPACE",
+ "NUMBER", "!NUMBER",
+ "ALPHA", "!ALPHA",
+ "ALNUM", "!ALNUM",
+ "HEXNUM", "!HEXNUM",
+ "_ALL",
+
+ // TODO: Add special language depended groups here.
+ // See function shlParser::isdelimiter()
+ // and fshlGenerator::make_isdx(). You must
+ // implement your new delimiters...
+ "PHP_DELIM",
+ );
+
+ $fshl_signatures=array("SHL","TW");
+
+} //end if(!defined())
+?>
\ No newline at end of file
diff --git a/tw/tw-errors.php b/tw/tw-errors.php
new file mode 100644
index 000000000..59881a875
--- /dev/null
+++ b/tw/tw-errors.php
@@ -0,0 +1,118 @@
+
+/*
+ * tag|wall | PHP Tag Filter|
+ * ---------------------------------------------------------------------
+
+ Copyright (C) 2002 Juraj 'HVGE' Durech
+ Copyright (C) 2002 www.designia.sk
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * ---------------------------------------------------------------------
+ * tw-errors.php
+ *
+ * This file containing basic error definitions and basic error handling class.
+ *
+ */
+
+// comments
+define('TWE_OK', 0x0000); // null
+define('TWE_VERSION', 0x0001); // param1=parser_version, param2=lang_version
+define('TWE_NOTE', 0x0002); // param2=note / tips / etc...
+define('TWE_CREDITS', 0x0003); // null
+
+// warnings
+define('TWE_STACK_UNDERFLOW', 0x0010); // param1=tag_name
+define('TWE_STACK_NOT_EMPTY', 0x0020); // param1=tags, stack not empty
+define('TWE_UNEXPECTED_EOST', 0x0030); // unexpected end of stream (tag completed automatically)
+define('TWE_UNEXPECTED_QUOTE', 0x0040); // atr="value>...
+
+// errors
+define('TWE_SYNTAX', 0x0100); // null, HTML syntax error (for future strict bases)
+define('TWE_TOO_MANY_ATTRS', 0x0200); // tag_name, too many attrs in tag ..
+
+// internal errors
+define('TWE_FILE_NOT_FOUND', 0x1000); // param1 = file
+define('TWE_BAD_SIGNATURE', 0x2000); // param1 = language, param2 = signature
+define('TWE_LANG_NOT_FOUND', 0x3000); // param1 = language
+
+// indexes to ErrorArray
+define('TWE_ERRNO', 0); // error value
+define('TWE_PARAM1', 1); // parameter 1
+define('TWE_PARAM2', 2); // parameter 2
+define('TWE_POSIT', 3); // position in source
+define('TWE_CODE', 4); // piece of bad code
+
+class TW_errors
+{
+ var $IsError;
+ var $ErrorArray;
+ var $identifier;
+
+ /* class constructor
+ */
+ function TW_errors($options = 0)
+ {
+ $this->IsError = 0;
+ $this->ErrorArray = null;
+ $this->identifier = 0;
+ }
+
+ function is_error() { return $this->IsError; }
+
+ function get_err_array() { return $this->ErrorArray; }
+
+ function get_comments() { return $this->get_by_mask(0x000f); }
+
+ function get_warnings() { return $this->get_by_mask(0x00f0); }
+
+ function get_errors() { return $this->get_by_mask(0x0f00); }
+
+ function get_internal() { return $this->get_by_mask(0xf000); }
+
+ function get_by_mask($mask)
+ {
+ $ErrTemp = null;
+ foreach($this->ErrorArray as $key => $value)
+ {
+ if($value[TWE_ERRNO] & $mask) $ErrTemp[$key] = $value;
+ }
+ return $ErrTemp;
+ }
+
+ /* Input:
+ * id: error id,
+ * lang: error_language_array
+ *
+ * Outupt:
+ * error text or null
+ */
+ function get_error_text ( $id, &$lang )
+ {
+ if( in_array($id, $this->ErrorArray) )
+ {
+ $errno = $this->ErrorArray[$id][TWE_ERRNO];
+ if( in_array($errno,$lang) )
+ return sprintf( $lang[$errno],
+ $this->ErrorArray[$id][TWE_PARAM1],
+ $this->ErrorArray[$id][TWE_PARAM2] );
+ else
+ return sprintf( "Please translate errno 0x%x.",$errno );
+ }
+ return null;
+ }
+
+} // END class TW_errors
+?>
\ No newline at end of file
diff --git a/tw/tw-tags.php b/tw/tw-tags.php
new file mode 100644
index 000000000..6a83be147
--- /dev/null
+++ b/tw/tw-tags.php
@@ -0,0 +1,97 @@
+
+/*
+ * tag|wall | PHP Tag Filter|
+ * ---------------------------------------------------------------------
+
+ Copyright (C) 2002 Juraj 'HVGE' Durech
+ Copyright (C) 2002 www.designia.sk
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ * ---------------------------------------------------------------------
+ * tw-tags.php - this file contains common tag definitions and
+ * relationships
+ *
+ * WARNING: This is not filter configuration. Relationships are used
+ * for correct cross tag fixing.
+ * ---------------------------------------------------------------------
+ * Tag flags:
+ *
+ * TW_DUP - remove duplicates ( not implemented )
+ * ...::: => ...:::
+ *
+ * TW_NOP - tag without end tag
+ *
... + */ +$tw_tag_relations = array( + +// TAG FLAG CONT.OFF REQ. TAG + + "a" => array(0, 0, null), + "b" => array(0, 0, null), + "blockquote"=> array(0, 0, null), + "big" => array(0, 0, null), + "br" => array(TW_NOP, 0, null), + "code" => array(0, 0, null), + "dl" => array(0, 0, null), + "dt" => array(TW_OPT, 0, array("dl")), + "dd" => array(TW_OPT, 0, array("dl")), + "div" => array(0, 0, null), + "em" => array(0, 0, null), + "h1" => array(0, 0, null), + "h2" => array(0, 0, null), + "h3" => array(0, 0, null), + "h4" => array(0, 0, null), + "h5" => array(0, 0, null), + "h6" => array(0, 0, null), + "hr" => array(TW_NOP, 0, null), + "i" => array(0, 0, null), + "img" => array(TW_NOP, 0, null), + "ul" => array(0, 1, null), + "ol" => array(0, 1, null), + "li" => array(TW_OPT, 0, array("ul","ol")), + "object" => array(0, 1, null), + "p" => array(TW_OPT, 0, null), + "pre" => array(0, 0, null), + "small" => array(0, 0, null), + "span" => array(0, 0, null), + "strong" => array(0, 0, null), + "style" => array(0, 1, null), + "sub" => array(0, 0, null), + "sup" => array(0, 0, null), + "table" => array(0, 1, null), + "caption" => array(0, 0, array("table")), + "tbody" => array(0, 0, array("table")), + "tfoot" => array(0, 0, array("table")), + "thead" => array(0, 0, array("table")), + "tr" => array(TW_OPT, 1, array("table","tbody")), + "td" => array(TW_OPT, 0, array("tr")), + "th" => array(TW_OPT, 0, array("tr")), + "u" => array(0, 0, null), + + // TODO: add your specific tags here... + + ); +?> \ No newline at end of file diff --git a/tw/tw.php b/tw/tw.php new file mode 100644 index 000000000..c4f813edd --- /dev/null +++ b/tw/tw.php @@ -0,0 +1,291 @@ + +/* + * tag|wall ver 0.1.4 | PHP Tag Filter | + * --------------------------------------------------------------------- + + Copyright (C) 2002 Juraj 'HVGE' Durech + Copyright (C) 2002 designia.sk + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + * --------------------------------------------------------------------- + * tw.php + * + * main tag|wall parser core + * --------------------------------------------------------------------- + * + */ +define ("TW_PARSER_VERSION", "0.1.4"); + +require_once(TW_PATH."tw-tags.php"); +require_once(TW_PATH."tw-errors.php"); + +class twParser +{ + // class variables + var $text, $textlen, $textpos; + var $lang, $options; + var $output, $err, $content_off; + + var $out; + var $_trans, $_flags, $_data, $_delim, $_class, $_keywords; + var $_ret,$_quit; + + var $base, $_names; + + + // ----------------------------------------------------------------------- + // USER LEVEL functions + // + + /* twParser CLASS CONSTRUCTOR + * + * input: + * string $language - TW language class name ( see directory tw/lang/ ) + * int $options - parser options (not used) + */ + function twParser( + $language = "TW", + $options = P_DEFAULT + ) + { + $_lang = $language."_lang"; + $_base = $language."_base"; + require_once (TW_LANG."$_base.php"); + require_once (TW_CACHE."$_lang.php"); + + $this->lang = new $_lang; + $this->base = $_base; + $this->options = $options; + $this->_trans = &$this->lang->trans; + $this->_flags = &$this->lang->flags; + $this->_delim = &$this->lang->delim; + $this->_ret = &$this->lang->ret; + $this->_quit = &$this->lang->quit; + $this->_names = &$this->lang->names; + + $this->content_off = &$this->lang->content_off; + } + + /* STRIP TAGS + * + * input: + * string $text - input string + * array $configuration - filter configuration array ( see files in directory tw/filter-setup/ ) + * string $output_module - output module name ( tw/output ) + * string $error_module - error module name ( tw/error ) + * int $offset - offset in $text + * + * output: + * parsed string + */ + function strip_tags ( + $text, + &$configuration, + $output_module = "XHTML", + $error_module = "FOO", + $offset = 0 + ) + { + // open modules + $_err = $error_module."_error"; + require_once (TW_ERRMODULE."$_err.php"); + $this->err = new $_err( $this->options ); + + $_out = $output_module."_output"; + require_once (TW_OUTMODULE."$_out.php"); + $this->output = new $_out; + + // parser init + $this->text = &$text; + $this->textlen = strlen($text); + $this->text .= "IMNOTREALLYOPTIMISTIC"; + $this->textpos = $offset; + $this->out = null; + + // FSHL pointers init + $this->lang->pt = &$this->text; + $this->lang->pti = &$this->textpos; + $this->lang->out = &$this->out; + $this->lang->err = &$this->err; + $this->lang->output = &$this->output; + + // base init + $base = &$this->base; + $this->lang->$base(); + $this->lang->config_tags = array_keys($configuration); + // load initial configuration + foreach($configuration as $tag => $attributes) + { + $this->lang->config_req_attr[$tag] = null; + if(is_array($attributes)) + { + $this->lang->config_attr[$tag] = array_keys($configuration[$tag]); + foreach($attributes as $attr => $command) + { + if( $command ) + if( $command[0] & TW_REQ ) $this->lang->config_req_attr[$tag][] = $attr; + } + } + else + { + $this->lang->config_attr[$tag] = $attributes; + } + } + $this->lang->config = &$configuration; + + // start parser + $this->parse_string ( $this->lang->initial_state ); + + $this->out .= $this->lang->base_end(); + $this->out .= $this->output->template_end(); + + return $this->out; + } + + function get_position() { return $this->textpos; } + + function get_out() { return $this->out; } + + // error wrapper + + function is_error() { return $this->err->is_error(); } + function get_err_array() { return $this->err->get_err_array(); } + function get_comments() { return $this->err->get_by_mask(0x000f); } + function get_warnings() { return $this->err->get_by_mask(0x00f0); } + function get_errors() { return $this->err->get_by_mask(0x0f00); } + function get_internal() { return $this->err->get_by_mask(0xf000); } + function get_by_mask($mask) { return $this->err->get_by_mask($mask); } + function get_error_text ( $id, &$lang ) { return $this->err->get_error_text ( $id, &$lang ); } + +// --------------------------------------------------------------------------------- +// LOW LEVEL functions +// + +// main parser function +// +function parse_string ($state) +{ + $flags = $this->_flags[$state]; + $statename_n = $this->_names[$state]."_new"; + // perform IN function if required + if( $flags & PF_XIO ) + { + $statename_i = $this->_names[$state]."_in"; + $statename_o = $this->_names[$state]."_out"; + $this->lang->$statename_i(); + } + $stateword = null; + + while( ($word = $this->getword("isd$state")) != null ) + { + if(is_array($word)) + { + // word is delimiter + $newstate = $this->_trans[$state][$word[0]][XL_DSTATE]; + + // char back to stream (CB2S) if required + if( $this->_trans[$state][$word[0]][XL_DTYPE] ) + { + if( $newstate == $state ) + { + // If it is the same state, CB2S flag have different significance + // re-initialize state (call IN function) + $stateword = null; + if( $flags & PF_XIO ) $this->lang->$statename_i(); + continue; + } + $this->textpos -= strlen($word[1]); + } + else + { + $stateword .= $word[1]; // add new parsed word to stateword + } + if( $newstate == $this->_ret ) // newstate is _RET from recursion + { + // perform NEW function if required + if( $flags & PF_XNEW ) $this->lang->$statename_n($stateword); + // perform OUT function if required + if( $flags & PF_XIO ) $this->lang->$statename_o($stateword); + // return from recursion + return; + } + + if( $state != $newstate ) // recursion - only if it is really new state + { + // perform NEW function if required + if( $flags & PF_XNEW ) $this->lang->$statename_n($stateword); + // recursion + $this->parse_string($newstate); + // perform OUT function if required and return. + if( $flags & PF_XDONE ) + { + if( $flags & PF_XIO ) $this->lang->$statename_o(null); + return; + } + continue; + } + } + else + { + // word is not delimiter + if( $flags & PF_CLEAN ) + { + if(!$this->content_off) + $this->out .= str_replace("<",">",$word); + } + else + { + $stateword .= $word; + } + } + } //END while() + + // TODO: check this OUT + + // perform NEW function if required + if( $flags & PF_XNEW ) $this->lang->$statename_n($stateword); + // perform OUT function if required and return. + if( $flags & PF_XIO ) $this->lang->$statename_o($stateword); +} + +// get word from stream +// +function getword ($state) +{ + $result = null; + if($this->textpos < $this->textlen) + { + $del = $this->lang->$state(); // call "is delimiter" isdX function + if($del != false) + { + // actual char (or sub-string) is delimiter + $this->textpos += strlen($del[1]); + return $del; + } + else + { + // Actual char/string is not delimiter. + // Result word is between current position and first delimiter in stream + $result = $this->text[$this->textpos++]; + while(($this->textpos < $this->textlen) && !$this->lang->$state()) + $result .= $this->text[$this->textpos++]; + } + } + return $result; +} + +} // END class twParser +?> \ No newline at end of file diff --git a/tw/tw_cache/TW_lang.php b/tw/tw_cache/TW_lang.php new file mode 100644 index 000000000..c510a5a1e --- /dev/null +++ b/tw/tw_cache/TW_lang.php @@ -0,0 +1,177 @@ +version="1.0"; + $this->signature="TW"; + $this->generator_version="0.4.1"; + $this->initial_state=0; + $this->trans=array(0=>array("<"=>array(0=>1,1=>0,),),1=>array("ALPHA"=>array(0=>3,1=>1,),"/"=>array(0=>2,1=>0,),"<"=>array(0=>1,1=>1,),"!--"=>array(0=>11,1=>0,),"_ALL"=>array(0=>12,1=>0,),),2=>array("ALPHA"=>array(0=>4,1=>1,),"_ALL"=>array(0=>12,1=>0,),),3=>array("ALPHA"=>array(0=>4,1=>1,),"_ALL"=>array(0=>12,1=>0,),),4=>array("!ALNUM"=>array(0=>5,1=>1,),),5=>array("ALPHA"=>array(0=>6,1=>1,),">"=>array(0=>12,1=>0,),"/>"=>array(0=>12,1=>0,),),6=>array("!ALPHA"=>array(0=>7,1=>1,),">"=>array(0=>12,1=>1,),"/>"=>array(0=>12,1=>1,),),7=>array("\""=>array(0=>8,1=>0,),"'"=>array(0=>9,1=>0,),"ALNUM"=>array(0=>10,1=>1,),">"=>array(0=>12,1=>1,),"/>"=>array(0=>12,1=>1,),),8=>array("\""=>array(0=>12,1=>0,),),9=>array("'"=>array(0=>12,1=>0,),),10=>array("-"=>array(0=>10,1=>0,),"!ALNUM"=>array(0=>12,1=>1,),),11=>array("-->"=>array(0=>12,1=>0,),),); + $this->flags=array(0=>256,1=>1024,2=>1536,3=>1536,4=>3584,5=>0,6=>3584,7=>1536,8=>512,9=>512,10=>512,11=>0,); + $this->delim=array(0=>array(0=>"<",),1=>array(0=>"ALPHA",1=>"/",2=>"<",3=>"!--",4=>"_ALL",),2=>array(0=>"ALPHA",1=>"_ALL",),3=>array(0=>"ALPHA",1=>"_ALL",),4=>array(0=>"!ALNUM",),5=>array(0=>"ALPHA",1=>">",2=>"/>",),6=>array(0=>"!ALPHA",1=>">",2=>"/>",),7=>array(0=>"\"",1=>"'",2=>"ALNUM",3=>">",4=>"/>",),8=>array(0=>"\"",),9=>array(0=>"'",),10=>array(0=>"-",1=>"!ALNUM",),11=>array(0=>"-->",),); + $this->ret=12; + $this->quit=13; + $this->names=array(0=>"OUT",1=>"T_tagWall",2=>"T_Cbegin",3=>"T_begin",4=>"T_gettag",5=>"T_in",6=>"A_begin",7=>"V_begin",8=>"VALUE1",9=>"VALUE2",10=>"VALUE3",11=>"HTML_comment",12=>"_RET",13=>"_QUIT",); +} + +/* OUT */ +function isd0 () +{ +$c1=$this->pt[$this->pti]; +if($c1=="<") + return array("<","<"); +return false; +} + +/* T_tagWall */ +function isd1 () +{ +$p=$this->pti; +$c1=$this->pt[$p++]; +$c2=$c1.$this->pt[$p++]; +$c3=$c2.$this->pt[$p]; +if(stristr("eaoinltsrvdukzmcpyhjbfgxwq",$c1)) + return array("ALPHA",$c1); +if($c1=="/") + return array("/","/"); +if($c1=="<") + return array("<","<"); +if($c3=="!--") + return array("!--","!--"); +return array("_ALL",$c1); +} + +/* T_Cbegin */ +function isd2 () +{ +$c1=$this->pt[$this->pti]; +if(stristr("eaoinltsrvdukzmcpyhjbfgxwq",$c1)) + return array("ALPHA",$c1); +return array("_ALL",$c1); +} + +/* T_begin */ +function isd3 () +{ +$c1=$this->pt[$this->pti]; +if(stristr("eaoinltsrvdukzmcpyhjbfgxwq",$c1)) + return array("ALPHA",$c1); +return array("_ALL",$c1); +} + +/* T_gettag */ +function isd4 () +{ +$c1=$this->pt[$this->pti]; +if(!stristr("eaoinltsrvdukzmcpyhjbfgxwq0123456789",$c1)) + return array("!ALNUM",$c1); +return false; +} + +/* T_in */ +function isd5 () +{ +$p=$this->pti; +$c1=$this->pt[$p++]; +$c2=$c1.$this->pt[$p]; +if(stristr("eaoinltsrvdukzmcpyhjbfgxwq",$c1)) + return array("ALPHA",$c1); +if($c1==">") + return array(">",">"); +if($c2=="/>") + return array("/>","/>"); +return false; +} + +/* A_begin */ +function isd6 () +{ +$p=$this->pti; +$c1=$this->pt[$p++]; +$c2=$c1.$this->pt[$p]; +if(!stristr("eaoinltsrvdukzmcpyhjbfgxwq",$c1)) + return array("!ALPHA",$c1); +if($c1==">") + return array(">",">"); +if($c2=="/>") + return array("/>","/>"); +return false; +} + +/* V_begin */ +function isd7 () +{ +$p=$this->pti; +$c1=$this->pt[$p++]; +$c2=$c1.$this->pt[$p]; +if($c1=="\"") + return array("\"","\""); +if($c1=="'") + return array("'","'"); +if(stristr("eaoinltsrvdukzmcpyhjbfgxwq0123456789",$c1)) + return array("ALNUM",$c1); +if($c1==">") + return array(">",">"); +if($c2=="/>") + return array("/>","/>"); +return false; +} + +/* VALUE1 */ +function isd8 () +{ +$c1=$this->pt[$this->pti]; +if($c1=="\"") + return array("\"","\""); +return false; +} + +/* VALUE2 */ +function isd9 () +{ +$c1=$this->pt[$this->pti]; +if($c1=="'") + return array("'","'"); +return false; +} + +/* VALUE3 */ +function isd10 () +{ +$c1=$this->pt[$this->pti]; +if($c1=="-") + return array("-","-"); +if(!stristr("eaoinltsrvdukzmcpyhjbfgxwq0123456789",$c1)) + return array("!ALNUM",$c1); +return false; +} + +/* HTML_comment */ +function isd11 () +{ +$p=$this->pti; +$c3=$this->pt[$p++].$this->pt[$p++].$this->pt[$p]; +if($c3=="-->") + return array("-->","-->"); +return false; +} + +} +?> \ No newline at end of file