diff options
| author | Mark A. Hershberger <mah@debian.(none)> | 2009-03-25 00:34:21 -0400 |
|---|---|---|
| committer | Mark A. Hershberger <mah@debian.(none)> | 2009-03-25 00:34:21 -0400 |
| commit | 0e920280a2e04b110827bb766b9f29e3d581c4ee (patch) | |
| tree | 8f2125f3d00fe3089e3b94adb06f04479ee15f2a /ext/tidy | |
| download | php-0e920280a2e04b110827bb766b9f29e3d581c4ee.tar.gz | |
Imported Upstream version 5.0.4upstream/5.0.4
Diffstat (limited to 'ext/tidy')
40 files changed, 3653 insertions, 0 deletions
diff --git a/ext/tidy/CREDITS b/ext/tidy/CREDITS new file mode 100644 index 000000000..1c77b2ff3 --- /dev/null +++ b/ext/tidy/CREDITS @@ -0,0 +1,2 @@ +tidy +John Coggeshall, Ilia Alshanetsky diff --git a/ext/tidy/README b/ext/tidy/README new file mode 100644 index 000000000..19f6b9ff6 --- /dev/null +++ b/ext/tidy/README @@ -0,0 +1,16 @@ + +README FOR ext/tidy by John Coggeshall <john@php.net> + + +Tidy is an extension based on Libtidy (http://tidy.sf.net/) and allows a PHP developer +to clean, repair, and traverse HTML, XHTML, and XML documents -- including ones with +embedded scripting languages such as PHP or ASP within them using OO constructs. + +--------------------------------------------------------------------------------------- +!! Important Note !! +--------------------------------------------------------------------------------------- +Older versions of libtidy have a small memory leak inside the ParseConfigFileEnc() function +used to load configuration from a file. If you intend to use this functionality apply +the "libtidy.txt" patch (cd tidy/src/; patch -p0 < libtidy.txt) to libtidy sources and +then recompile libtidy. +--------------------------------------------------------------------------------------- diff --git a/ext/tidy/TODO b/ext/tidy/TODO new file mode 100644 index 000000000..8a13162cc --- /dev/null +++ b/ext/tidy/TODO @@ -0,0 +1,3 @@ +TODO + +Do the docs. diff --git a/ext/tidy/config.m4 b/ext/tidy/config.m4 new file mode 100644 index 000000000..961b54ab8 --- /dev/null +++ b/ext/tidy/config.m4 @@ -0,0 +1,38 @@ +dnl +dnl $Id: config.m4,v 1.3 2003/12/18 19:59:58 sniper Exp $ +dnl + +PHP_ARG_WITH(tidy,for TIDY support, +[ --with-tidy[=DIR] Include TIDY support]) + +if test "$PHP_TIDY" != "no"; then + + if test "$PHP_TIDY" != "yes"; then + TIDY_SEARCH_DIRS=$PHP_TIDY + else + TIDY_SEARCH_DIRS="/usr/local /usr" + fi + + for i in $TIDY_SEARCH_DIRS; do + if test -f $i/include/tidy/tidy.h; then + TIDY_DIR=$i + TIDY_INCDIR=$i/include/tidy + elif test -f $i/include/tidy.h; then + TIDY_DIR=$i + TIDY_INCDIR=$i/include + fi + done + + if test -z "$TIDY_DIR"; then + AC_MSG_ERROR(Cannot find libtidy) + fi + + TIDY_LIBDIR=$TIDY_DIR/lib + + PHP_ADD_LIBRARY_WITH_PATH(tidy, $TIDY_LIBDIR, TIDY_SHARED_LIBADD) + PHP_ADD_INCLUDE($TIDY_INCDIR) + + PHP_NEW_EXTENSION(tidy, tidy.c, $ext_shared) + PHP_SUBST(TIDY_SHARED_LIBADD) + AC_DEFINE(HAVE_TIDY,1,[ ]) +fi diff --git a/ext/tidy/config.w32 b/ext/tidy/config.w32 new file mode 100644 index 000000000..10acb5011 --- /dev/null +++ b/ext/tidy/config.w32 @@ -0,0 +1,22 @@ +// $Id: config.w32,v 1.2 2004/03/22 23:07:55 wez Exp $ +// vim:ft=javascript + +ARG_WITH("tidy", "TIDY support", "no"); + +if (PHP_TIDY != "no") { + if (CHECK_LIB("libtidy.lib", "tidy", PHP_TIDY) && + ( + CHECK_HEADER_ADD_INCLUDE("tidy.h", "CFLAGS_TIDY") || + CHECK_HEADER_ADD_INCLUDE("tidy/tidy.h", "CFLAGS_TIDY", null, null, true) || + CHECK_HEADER_ADD_INCLUDE("libtidy/tidy.h", "CFLAGS_TIDY", null, null, true) + )) { + EXTENSION("tidy", "tidy.c"); + AC_DEFINE('HAVE_TIDY', 1, 'Have TIDY library'); + if (!PHP_TIDY_SHARED) { + ADD_DEF_FILE("ext\\tidy\\php_tidy.def"); + } + } else { + WARNING("tidy not enabled; libraries and headers not found"); + } +} + diff --git a/ext/tidy/examples/cleanhtml.php b/ext/tidy/examples/cleanhtml.php new file mode 100644 index 000000000..9a6713dc5 --- /dev/null +++ b/ext/tidy/examples/cleanhtml.php @@ -0,0 +1,40 @@ +<?php + + /* + * cleanhtml.php + * + * A simple script to clean and repair HTML,XHTML,PHP,ASP,etc. documents + * if no file is provided, it reads from standard input. + * + * NOTE: Works only with tidy for PHP 4.3.x, for tidy in PHP 5 see cleanhtml5.php + * + * By: John Coggeshall <john@php.net> + * + * Usage: php cleanhtml.php [filename] + * + */ + + if(!isset($_SERVER['argv'][1])) { + $data = file_get_contents("php://stdin"); + tidy_parse_string($data); + } else { + tidy_parse_file($_SERVER['argv'][1]); + } + + tidy_clean_repair(); + + if(tidy_warning_count() || + tidy_error_count()) { + + echo "\n\nThe following errors or warnings occured:\n"; + echo tidy_get_error_buffer(); + echo "\n"; + } + + echo tidy_get_output(); + +?> + + + +
\ No newline at end of file diff --git a/ext/tidy/examples/cleanhtml5.php b/ext/tidy/examples/cleanhtml5.php new file mode 100644 index 000000000..c31e36f1f --- /dev/null +++ b/ext/tidy/examples/cleanhtml5.php @@ -0,0 +1,39 @@ +<?php + + /* + * cleanhtml5.php + * + * A simple script to clean and repair HTML,XHTML,PHP,ASP,etc. documents + * if no file is provided, it reads from standard input. + * + * NOTE: Works only with tidy for PHP 5, for tidy in PHP 4.3.x see cleanhtml.php + * + * By: John Coggeshall <john@php.net> + * + * Usage: php cleanhtml5.php [filename] + * + */ + + if(!isset($_SERVER['argv'][1])) { + $data = file_get_contents("php://stdin"); + $tidy = tidy_parse_string($data); + } else { + $tidy = tidy_parse_file($_SERVER['argv'][1]); + } + + $tidy->cleanRepair(); + + if(!empty($tidy->error_buf)) { + + echo "\n\nThe following errors or warnings occured:\n"; + echo "{$tidy->error_buf}\n"; + + } + + echo $tidy; + +?> + + + + diff --git a/ext/tidy/examples/dumpit.php b/ext/tidy/examples/dumpit.php new file mode 100644 index 000000000..e77b7b932 --- /dev/null +++ b/ext/tidy/examples/dumpit.php @@ -0,0 +1,93 @@ +<?php + /* + * dumpit.php + * + * a command-line script which dumps the given HTML, PHP, ASP, XHTML, etc. + * file as it is represented in the document model. + * + * By: John Coggeshall <john@php.net> + * + * Usage; php dumpit.php <filename> + */ + + tidy_parse_file($_SERVER['argv'][1]); + + /* Optionally you can do this here if you want to fix up the document */ + + /* tidy_clean_repair(); */ + + $tree = tidy_get_root(); + dump_tree($tree); + echo "\n"; + + function node_type($type) { + + switch($type) { + + case TIDY_NODETYPE_ROOT: return "Root Node"; + case TIDY_NODETYPE_DOCTYPE: return "DocType Node"; + case TIDY_NODETYPE_COMMENT: return "Comment Node"; + case TIDY_NODETYPE_PROCINS: return "ProcIns Node"; + case TIDY_NODETYPE_TEXT: return "Text Node"; + case TIDY_NODETYPE_START: return "Start Node"; + case TIDY_NODETYPE_END: return "End Node"; + case TIDY_NODETYPE_STARTEND: return "Start/End Node"; + case TIDY_NODETYPE_CDATA: return "CDATA Node"; + case TIDY_NODETYPE_SECTION: return "Section Node"; + case TIDY_NODETYPE_ASP: return "ASP Source Code Node"; + case TIDY_NODETYPE_PHP: return "PHP Source Code Node"; + case TIDY_NODETYPE_JSTE: return "JSTE Source Code"; + case TIDY_NODETYPE_XMLDECL: return "XML Declaration Node"; + default: return "Unknown Node"; + } + } + + function do_leaf($string, $indent) { + for($i = 0; $i < $indent; $i++) { + echo " "; + } + echo $string; + } + + function dump_tree($node, $indent = 0) { + if($node) { + /* Put something there if the node name is empty */ + $nodename = trim(strtoupper($node->name)); + $nodename = (empty($nodename)) ? "[EMPTY]" : $nodename; + + /* Generate the Node, and a pretty name for it */ + do_leaf(" + $nodename (".node_type($node->type).")\n", $indent); + + /* Check to see if this node is a text node. Text nodes are + generated by start/end tags and contain the text in between. + i.e. <B>foo</B> will create a text node with $node->value + equal to 'foo' */ + if($node->type == TIDY_NODETYPE_TEXT) { + do_leaf(" |\n", $indent); + do_leaf(" +---- Value: '{$node->value}'\n", $indent); + } + + /* Any attributes on this node? */ + if(count($node->attributes())) { + do_leaf(" |\n", $indent); + do_leaf(" +---- Attributes\n", $indent); + + /* Cycle through the attributes and display them and their values. */ + foreach($node->attributes() as $attrib) { + do_leaf(" +--{$attrib->name}\n", $indent); + do_leaf(" | +-- Value: {$attrib->value}\n", $indent); + } + } + + /* Recurse along the children to generate the remaining nodes */ + if($node->has_children()) { + foreach($node->children() as $child) { + dump_tree($child, $indent + 3); + } + } + } + } + + echo tidy_get_output(); + +?>
\ No newline at end of file diff --git a/ext/tidy/examples/dumpit5.php b/ext/tidy/examples/dumpit5.php new file mode 100644 index 000000000..ad9157f6a --- /dev/null +++ b/ext/tidy/examples/dumpit5.php @@ -0,0 +1,92 @@ +<?php + /* + * dumpit5.php + * + * a command-line script which dumps the given HTML, PHP, ASP, XHTML, etc. + * file as it is represented in the document model. + * + * NOTE: Only works with tidy for PHP 5+, for tidy in 4.3.x, see dumpit.php + * + * By: John Coggeshall <john@php.net> + * + * Usage; php dumpit5.php <filename> + */ + + $tidy = tidy_parse_file($_SERVER['argv'][1]); + + /* Optionally you can do this here if you want to fix up the document */ + + /* $tidy->clean_repair() */ + + $tree = $tidy->root(); + dump_tree($tree); + echo "\n"; + + function node_type($type) { + + switch($type) { + + case TIDY_NODETYPE_ROOT: return "Root Node"; + case TIDY_NODETYPE_DOCTYPE: return "DocType Node"; + case TIDY_NODETYPE_COMMENT: return "Comment Node"; + case TIDY_NODETYPE_PROCINS: return "ProcIns Node"; + case TIDY_NODETYPE_TEXT: return "Text Node"; + case TIDY_NODETYPE_START: return "Start Node"; + case TIDY_NODETYPE_END: return "End Node"; + case TIDY_NODETYPE_STARTEND: return "Start/End Node"; + case TIDY_NODETYPE_CDATA: return "CDATA Node"; + case TIDY_NODETYPE_SECTION: return "Section Node"; + case TIDY_NODETYPE_ASP: return "ASP Source Code Node"; + case TIDY_NODETYPE_PHP: return "PHP Source Code Node"; + case TIDY_NODETYPE_JSTE: return "JSTE Source Code"; + case TIDY_NODETYPE_XMLDECL: return "XML Declaration Node"; + default: return "Unknown Node"; + } + } + + function do_leaf($string, $indent) { + for($i = 0; $i < $indent; $i++) { + echo " "; + } + echo $string; + } + + function dump_tree(tidy_node $node, $indent = 0) { + + /* Put something there if the node name is empty */ + $nodename = trim(strtoupper($node->name)); + $nodename = (empty($nodename)) ? "[EMPTY]" : $nodename; + + /* Generate the Node, and a pretty name for it */ + do_leaf(" + $nodename (".node_type($node->type).")\n", $indent); + + /* Check to see if this node is a text node. Text nodes are + generated by start/end tags and contain the text in between. + i.e. <B>foo</B> will create a text node with $node->value + equal to 'foo' */ + if($node->type == TIDY_NODETYPE_TEXT) { + do_leaf(" |\n", $indent); + do_leaf(" +---- Value: '{$node->value}'\n", $indent); + } + + if(count($node->attribute)) { + do_leaf(" |\n", $indent); + do_leaf(" +---- Attributes\n", $indent); + + foreach($node->attribute as $name=>$value) { + @do_leaf(" +-- $name\n", $indent); + do_leaf(" | +-- Value: $value\n", $indent); + } + } + + /* Recurse along the children to generate the remaining nodes */ + if($node->has_children()) { + foreach($node->child as $child) { + dump_tree($child, $indent + 3); + } + } + + } + + +?>
\ No newline at end of file diff --git a/ext/tidy/examples/urlgrab.php b/ext/tidy/examples/urlgrab.php new file mode 100644 index 000000000..9ec4c42ba --- /dev/null +++ b/ext/tidy/examples/urlgrab.php @@ -0,0 +1,62 @@ +<?php + + /* + * urlgrab.php + * + * A simple command-line utility to extract all of the URLS contained + * within <A HREF> tags from a document. + * + * NOTE: Only works with tidy for PHP 4.3.x, please see urlgrab5.php for tidy for PHP 5 + * + * By: John Coggeshall <john@php.net> + * + * Usage: php urlgrab.php <file> + * + */ + + /* Parse the document */ + tidy_parse_file($_SERVER['argv'][1]); + + /* Fix up the document */ + tidy_clean_repair(); + + /* Get an object representing everything from the <HTML> tag in */ + $html = tidy_get_html(); + + /* Traverse the document tree */ + print_r(get_links($html)); + + function get_links($node) { + $urls = array(); + + /* Check to see if we are on an <A> tag or not */ + if($node->id == TIDY_TAG_A) { + /* If we are, find the HREF attribute */ + $attrib = $node->get_attr(TIDY_ATTR_HREF); + if($attrib) { + /* Add the value of the HREF attrib to $urls */ + $urls[] = $attrib->value; + } + + } + + /* Are there any children? */ + if($node->has_children()) { + + /* Traverse down each child recursively */ + foreach($node->children() as $child) { + + /* Append the results from recursion to $urls */ + foreach(get_links($child) as $url) { + + $urls[] = $url; + + } + + } + } + + return $urls; + } + +?>
\ No newline at end of file diff --git a/ext/tidy/examples/urlgrab5.php b/ext/tidy/examples/urlgrab5.php new file mode 100644 index 000000000..8e08322a1 --- /dev/null +++ b/ext/tidy/examples/urlgrab5.php @@ -0,0 +1,39 @@ +<?php + /* + * urlgrab5.php + * + * A simple command-line utility to extract all of the URLS contained + * within <A HREF> tags from a document. + * + * NOTE: Only works with tidy for PHP 5, please see urlgrab.php for tidy for PHP 4.3.x + * + * By: John Coggeshall <john@php.net> + * + * Usage: php urlgrab5.php <file> + * + */ + function dump_nodes(tidy_node $node, &$urls = NULL) { + + $urls = (is_array($urls)) ? $urls : array(); + + if(isset($node->id)) { + if($node->id == TIDY_TAG_A) { + $urls[] = $node->attribute['href']; + } + } + + if($node->hasChildren()) { + + foreach($node->child as $c) { + dump_nodes($c, $urls); + } + + } + + return $urls; + } + + $a = tidy_parse_file($_SERVER['argv'][1]); + $a->cleanRepair(); + print_r(dump_nodes($a->html())); +?> diff --git a/ext/tidy/libtidy.txt b/ext/tidy/libtidy.txt new file mode 100644 index 000000000..53185d9fc --- /dev/null +++ b/ext/tidy/libtidy.txt @@ -0,0 +1,12 @@ +--- config.c Mon Jun 9 04:07:55 2003 ++++ config.c Sun Sep 21 16:13:04 2003 +@@ -719,7 +719,8 @@ + } + + fclose( fin ); +- MemFree( cfg->cfgIn ); ++ MemFree( cfg->cfgIn->source.sourceData ); ++ MemFree( cfg->cfgIn ); + cfg->cfgIn = NULL; + } + diff --git a/ext/tidy/package.xml b/ext/tidy/package.xml new file mode 100644 index 000000000..a5b461ce4 --- /dev/null +++ b/ext/tidy/package.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="ISO-8859-1" ?> +<!DOCTYPE package SYSTEM "../pear/package.dtd"> +<package> + <name>tidy</name> + <summary>Tidy HTML Repairing and Parsing</summary> + <maintainers> + <maintainer> + <user>john</user> + <name>John Coggeshall</name> + <email>john@php.net</email> + <role>lead</role> + </maintainer> + <maintainer> + <user>iliaa</user> + <name>Ilia Alshanetsky</name> + <email>ilia@php.net</email> + <role>developer</role> + </maintainer> + </maintainers> + <description> +Tidy is a binding for the Tidy HTML clean and repair utility which +allows you to not only clean and otherwise manipluate HTML documents, +but also traverse the document tree using the Zend Engine 2 OO semantics. + </description> + <license>PHP</license> + <release> + <state>beta</state> + <version>2.0dev</version> + <date>2003-11-13</date> + <notes> + Major API changes for PHP 5.0, including the re-introduction of resources, output buffering support, + dual-nature syntax (tidy_clean_repair($tidy_res) or $tidy->clean_repair()) and more. + </notes> + <configureoptions> + <configureoption name="with-tidy" default="autodetect" prompt="Tidy library installation dir?"/> + </configureoptions> + <filelist> + <file role="src" name="config.m4"/> + <file role="src" name="tidy.c"/> + <file role="src" name="php_tidy.h"/> + + <file role="doc" name="CREDITS"/> + <file role="doc" name="TODO"/> + <file role="doc" name="examples/cleanhtml.php"/> + <file role="doc" name="examples/dumpit.php"/> + <file role="doc" name="examples/urlgrab.php"/> + <file role="doc" name="libtidy.txt"/> + + <file role="test" name="tests/001.phpt"/> + <file role="test" name="tests/002.phpt"/> + <file role="test" name="tests/003.phpt"/> + <file role="test" name="tests/004.phpt"/> + <file role="test" name="tests/005.phpt"/> + <file role="test" name="tests/005.html"/> + <file role="test" name="tests/006.phpt"/> + <file role="test" name="tests/007.phpt"/> + </filelist> + <deps> + <dep type="php" rel="ge" version="5" /> + </deps> + </release> +</package> +<!-- +vim:et:ts=1:sw=1 +--> diff --git a/ext/tidy/php_tidy.def b/ext/tidy/php_tidy.def new file mode 100644 index 000000000..1c17276de --- /dev/null +++ b/ext/tidy/php_tidy.def @@ -0,0 +1,292 @@ +EXPORTS +tidyBufInit +tidyBufAlloc +tidyBufCheckAlloc +tidyBufFree +tidyBufClear +tidyBufAttach +tidyBufDetach +tidyBufAppend +tidyBufPutByte +tidyBufPopByte +tidyBufGetByte +tidyBufEndOfInput +tidyBufUngetByte +initInputBuffer +initOutputBuffer +tidyCreate +tidyRelease +tidySetAppData +tidyGetAppData +tidyReleaseDate +tidyStatus +tidyDetectedHtmlVersion +tidyDetectedXhtml +tidyDetectedGenericXml +tidyErrorCount +tidyWarningCount +tidyAccessWarningCount +tidyConfigErrorCount +tidyLoadConfig +tidyLoadConfigEnc +tidyFileExists +tidySetCharEncoding +tidySetOptionCallback +tidyOptGetIdForName +tidyGetOptionList +tidyGetNextOption +tidyGetOption +tidyGetOptionByName +tidyOptGetId +tidyOptGetName +tidyOptGetType +tidyOptIsReadOnly +tidyOptGetCategory +tidyOptGetDefault +tidyOptGetDefaultInt +tidyOptGetDefaultBool +tidyOptGetPickList +tidyOptGetNextPick +tidyOptGetValue +tidyOptSetValue +tidyOptParseValue +tidyOptGetInt +tidyOptSetInt +tidyOptGetBool +tidyOptSetBool +tidyOptResetToDefault +tidyOptResetAllToDefault +tidyOptSnapshot +tidyOptResetToSnapshot +tidyOptDiffThanDefault +tidyOptDiffThanSnapshot +tidyOptCopyConfig +tidyOptGetEncName +tidyOptGetCurrPick +tidyOptGetDeclTagList +tidyOptGetNextDeclTag +tidyInitSource +tidyGetByte +tidyUngetByte +tidyIsEOF +tidyInitSink +tidyPutByte +tidySetReportFilter +tidySetErrorFile +tidySetErrorBuffer +tidySetErrorSink +tidySetMallocCall +tidySetReallocCall +tidySetFreeCall +tidySetPanicCall +tidyParseFile +tidyParseStdin +tidyParseString +tidyParseBuffer +tidyParseSource +tidyCleanAndRepair +tidyRunDiagnostics +tidySaveFile +tidySaveStdout +tidySaveBuffer +tidySaveString +tidySaveSink +tidyOptSaveFile +tidyOptSaveSink +tidyErrorSummary +tidyGeneralInfo +tidyGetRoot +tidyGetHtml +tidyGetHead +tidyGetBody +tidyGetParent +tidyGetChild +tidyGetNext +tidyGetPrev +tidyAttrFirst +tidyAttrNext +tidyAttrName +tidyAttrValue +tidyNodeGetType +tidyNodeGetName +tidyNodeIsText +tidyNodeIsProp +tidyNodeIsHeader +tidyNodeHasText +tidyNodeGetText +tidyNodeGetId +tidyNodeLine +tidyNodeColumn +tidyNodeIsHTML +tidyNodeIsHEAD +tidyNodeIsTITLE +tidyNodeIsBASE +tidyNodeIsMETA +tidyNodeIsBODY +tidyNodeIsFRAMESET +tidyNodeIsFRAME +tidyNodeIsIFRAME +tidyNodeIsNOFRAMES +tidyNodeIsHR +tidyNodeIsH1 +tidyNodeIsH2 +tidyNodeIsPRE +tidyNodeIsLISTING +tidyNodeIsP +tidyNodeIsUL +tidyNodeIsOL +tidyNodeIsDL +tidyNodeIsDIR +tidyNodeIsLI +tidyNodeIsDT +tidyNodeIsDD +tidyNodeIsTABLE +tidyNodeIsCAPTION +tidyNodeIsTD +tidyNodeIsTH +tidyNodeIsTR +tidyNodeIsCOL +tidyNodeIsCOLGROUP +tidyNodeIsBR +tidyNodeIsA +tidyNodeIsLINK +tidyNodeIsB +tidyNodeIsI +tidyNodeIsSTRONG +tidyNodeIsEM +tidyNodeIsBIG +tidyNodeIsSMALL +tidyNodeIsPARAM +tidyNodeIsOPTION +tidyNodeIsOPTGROUP +tidyNodeIsIMG +tidyNodeIsMAP +tidyNodeIsAREA +tidyNodeIsNOBR +tidyNodeIsWBR +tidyNodeIsFONT +tidyNodeIsLAYER +tidyNodeIsSPACER +tidyNodeIsCENTER +tidyNodeIsSTYLE +tidyNodeIsSCRIPT +tidyNodeIsNOSCRIPT +tidyNodeIsFORM +tidyNodeIsTEXTAREA +tidyNodeIsBLOCKQUOTE +tidyNodeIsAPPLET +tidyNodeIsOBJECT +tidyNodeIsDIV +tidyNodeIsSPAN +tidyNodeIsINPUT +tidyNodeIsQ +tidyNodeIsLABEL +tidyNodeIsH3 +tidyNodeIsH4 +tidyNodeIsH5 +tidyNodeIsH6 +tidyNodeIsADDRESS +tidyNodeIsXMP +tidyNodeIsSELECT +tidyNodeIsBLINK +tidyNodeIsMARQUEE +tidyNodeIsEMBED +tidyNodeIsBASEFONT +tidyNodeIsISINDEX +tidyNodeIsS +tidyNodeIsSTRIKE +tidyNodeIsU +tidyNodeIsMENU +tidyAttrGetId +tidyAttrIsEvent +tidyAttrIsProp +tidyAttrIsHREF +tidyAttrIsSRC +tidyAttrIsID +tidyAttrIsNAME +tidyAttrIsSUMMARY +tidyAttrIsALT +tidyAttrIsLONGDESC +tidyAttrIsUSEMAP +tidyAttrIsISMAP +tidyAttrIsLANGUAGE +tidyAttrIsTYPE +tidyAttrIsVALUE +tidyAttrIsCONTENT +tidyAttrIsTITLE +tidyAttrIsXMLNS +tidyAttrIsDATAFLD +tidyAttrIsWIDTH +tidyAttrIsHEIGHT +tidyAttrIsFOR +tidyAttrIsSELECTED +tidyAttrIsCHECKED +tidyAttrIsLANG +tidyAttrIsTARGET +tidyAttrIsHTTP_EQUIV +tidyAttrIsREL +tidyAttrIsOnMOUSEMOVE +tidyAttrIsOnMOUSEDOWN +tidyAttrIsOnMOUSEUP +tidyAttrIsOnCLICK +tidyAttrIsOnMOUSEOVER +tidyAttrIsOnMOUSEOUT +tidyAttrIsOnKEYDOWN +tidyAttrIsOnKEYUP +tidyAttrIsOnKEYPRESS +tidyAttrIsOnFOCUS +tidyAttrIsOnBLUR +tidyAttrIsBGCOLOR +tidyAttrIsLINK +tidyAttrIsALINK +tidyAttrIsVLINK +tidyAttrIsTEXT +tidyAttrIsSTYLE +tidyAttrIsABBR +tidyAttrIsCOLSPAN +tidyAttrIsROWSPAN +tidyAttrGetHREF +tidyAttrGetSRC +tidyAttrGetID +tidyAttrGetNAME +tidyAttrGetSUMMARY +tidyAttrGetALT +tidyAttrGetLONGDESC +tidyAttrGetUSEMAP +tidyAttrGetISMAP +tidyAttrGetLANGUAGE +tidyAttrGetTYPE +tidyAttrGetVALUE +tidyAttrGetCONTENT +tidyAttrGetTITLE +tidyAttrGetXMLNS +tidyAttrGetDATAFLD +tidyAttrGetWIDTH +tidyAttrGetHEIGHT +tidyAttrGetFOR +tidyAttrGetSELECTED +tidyAttrGetCHECKED +tidyAttrGetLANG +tidyAttrGetTARGET +tidyAttrGetHTTP_EQUIV +tidyAttrGetREL +tidyAttrGetOnMOUSEMOVE +tidyAttrGetOnMOUSEDOWN +tidyAttrGetOnMOUSEUP +tidyAttrGetOnCLICK +tidyAttrGetOnMOUSEOVER +tidyAttrGetOnMOUSEOUT +tidyAttrGetOnKEYDOWN +tidyAttrGetOnKEYUP +tidyAttrGetOnKEYPRESS +tidyAttrGetOnFOCUS +tidyAttrGetOnBLUR +tidyAttrGetBGCOLOR +tidyAttrGetLINK +tidyAttrGetALINK +tidyAttrGetVLINK +tidyAttrGetTEXT +tidyAttrGetSTYLE +tidyAttrGetABBR +tidyAttrGetCOLSPAN +tidyAttrGetROWSPAN diff --git a/ext/tidy/php_tidy.h b/ext/tidy/php_tidy.h new file mode 100644 index 000000000..6e4c4dba8 --- /dev/null +++ b/ext/tidy/php_tidy.h @@ -0,0 +1,111 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: John Coggeshall <john@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id: php_tidy.h,v 1.22.2.1 2005/02/08 05:29:48 rasmus Exp $ */ + +#ifndef PHP_TIDY_H +#define PHP_TIDY_H + +extern zend_module_entry tidy_module_entry; +#define phpext_tidy_ptr &tidy_module_entry + +#ifdef PHP_WIN32 +#define PHP_TIDY_API __declspec(dllexport) +#else +#define PHP_TIDY_API +#endif + +#define TIDY_METHOD_MAP(name, func_name, arg_types) \ + ZEND_NAMED_FE(name, ZEND_FN(func_name), arg_types) +#define TIDY_NODE_METHOD(name) PHP_FUNCTION(tnm_ ##name) +#define TIDY_NODE_ME(name, param) TIDY_METHOD_MAP(name, tnm_ ##name, param) +#define TIDY_DOC_METHOD(name) PHP_FUNCTION(tdm_ ##name) +#define TIDY_DOC_ME(name, param) TIDY_METHOD_MAP(name, tdm_ ##name, param) +#define TIDY_ATTR_METHOD(name) PHP_FUNCTION(tam_ ##name) +#define TIDY_ATTR_ME(name, param) TIDY_METHOD_MAP(name, tam_ ##name, param) + +PHP_MINIT_FUNCTION(tidy); +PHP_RINIT_FUNCTION(tidy); +PHP_MINFO_FUNCTION(tidy); + +PHP_FUNCTION(tidy_getopt); +PHP_FUNCTION(tidy_parse_string); +PHP_FUNCTION(tidy_parse_file); +PHP_FUNCTION(tidy_clean_repair); +PHP_FUNCTION(tidy_repair_string); +PHP_FUNCTION(tidy_repair_file); +PHP_FUNCTION(tidy_diagnose); +PHP_FUNCTION(tidy_get_output); +PHP_FUNCTION(tidy_get_error_buffer); +PHP_FUNCTION(tidy_get_release); +PHP_FUNCTION(tidy_reset_config); +PHP_FUNCTION(tidy_get_config); +PHP_FUNCTION(tidy_get_status); +PHP_FUNCTION(tidy_get_html_ver); +PHP_FUNCTION(tidy_is_xhtml); +PHP_FUNCTION(tidy_is_xml); +PHP_FUNCTION(tidy_error_count); +PHP_FUNCTION(tidy_warning_count); +PHP_FUNCTION(tidy_access_count); +PHP_FUNCTION(tidy_config_count); + +PHP_FUNCTION(ob_tidyhandler); + +PHP_FUNCTION(tidy_get_root); +PHP_FUNCTION(tidy_get_html); +PHP_FUNCTION(tidy_get_head); +PHP_FUNCTION(tidy_get_body); + +TIDY_DOC_METHOD(__construct); +TIDY_DOC_METHOD(parseFile); +TIDY_DOC_METHOD(parseString); + +TIDY_NODE_METHOD(__construct); +TIDY_NODE_METHOD(hasChildren); +TIDY_NODE_METHOD(hasSiblings); +TIDY_NODE_METHOD(isComment); +TIDY_NODE_METHOD(isHtml); +TIDY_NODE_METHOD(isXhtml); +TIDY_NODE_METHOD(isXml); +TIDY_NODE_METHOD(isText); +TIDY_NODE_METHOD(isJste); +TIDY_NODE_METHOD(isAsp); +TIDY_NODE_METHOD(isPhp); + +ZEND_BEGIN_MODULE_GLOBALS(tidy) + char *default_config; + zval *inst; +ZEND_END_MODULE_GLOBALS(tidy) + +#ifdef ZTS +#define TG(v) TSRMG(tidy_globals_id, zend_tidy_globals *, v) +#else +#define TG(v) (tidy_globals.v) +#endif + +#endif + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/tidy/tests/001.phpt b/ext/tidy/tests/001.phpt new file mode 100644 index 000000000..bfd378207 --- /dev/null +++ b/ext/tidy/tests/001.phpt @@ -0,0 +1,10 @@ +--TEST-- +Check for tidy presence +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php +echo "tidy extension is available"; +?> +--EXPECT-- +tidy extension is available diff --git a/ext/tidy/tests/002.phpt b/ext/tidy/tests/002.phpt new file mode 100644 index 000000000..89c3804b8 --- /dev/null +++ b/ext/tidy/tests/002.phpt @@ -0,0 +1,18 @@ +--TEST-- +tidy_parse_string() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_string("<HTML></HTML>"); + echo tidy_get_output($a); + +?> +--EXPECT-- +<html> +<head> +<title></title> +</head> +<body> +</body> +</html>
\ No newline at end of file diff --git a/ext/tidy/tests/003.phpt b/ext/tidy/tests/003.phpt new file mode 100644 index 000000000..7201d6a5a --- /dev/null +++ b/ext/tidy/tests/003.phpt @@ -0,0 +1,21 @@ +--TEST-- +tidy_clean_repair() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + + $a = tidy_parse_string("<HTML></HTML>"); + tidy_clean_repair($a); + echo tidy_get_output($a); + +?> +--EXPECT-- +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<html> +<head> +<title></title> +</head> +<body> +</body> +</html> diff --git a/ext/tidy/tests/004.phpt b/ext/tidy/tests/004.phpt new file mode 100644 index 000000000..e941de452 --- /dev/null +++ b/ext/tidy/tests/004.phpt @@ -0,0 +1,17 @@ +--TEST-- +tidy_diagnose() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_string("<HTML></HTML>"); + tidy_diagnose($a); + echo tidy_get_error_buffer($a); +?> +--EXPECT-- + +line 1 column 1 - Warning: missing <!DOCTYPE> declaration +line 1 column 7 - Warning: discarding unexpected </html> +line 1 column 14 - Warning: inserting missing 'title' element +Info: Document content looks like HTML 3.2 +3 warnings, 0 errors were found!
\ No newline at end of file diff --git a/ext/tidy/tests/005.html b/ext/tidy/tests/005.html new file mode 100644 index 000000000..8c17451f9 --- /dev/null +++ b/ext/tidy/tests/005.html @@ -0,0 +1 @@ +<HTML></HTML> diff --git a/ext/tidy/tests/005.phpt b/ext/tidy/tests/005.phpt new file mode 100644 index 000000000..1d3a10c2f --- /dev/null +++ b/ext/tidy/tests/005.phpt @@ -0,0 +1,18 @@ +--TEST-- +tidy_parse_file() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_file(dirname(__FILE__)."/005.html"); + echo tidy_get_output($a); + +?> +--EXPECT-- +<html> +<head> +<title></title> +</head> +<body> +</body> +</html>
\ No newline at end of file diff --git a/ext/tidy/tests/006.phpt b/ext/tidy/tests/006.phpt new file mode 100644 index 000000000..c82618131 --- /dev/null +++ b/ext/tidy/tests/006.phpt @@ -0,0 +1,16 @@ +--TEST-- +Verbose tidy_get_error_buffer() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_string("<HTML><asd asdf></HTML>"); + echo tidy_get_error_buffer($a); + +?> +--EXPECT-- +line 1 column 1 - Warning: missing <!DOCTYPE> declaration +line 1 column 7 - Error: <asd> is not recognized! +line 1 column 7 - Warning: discarding unexpected <asd> +line 1 column 17 - Warning: discarding unexpected </html> +line 1 column 7 - Warning: inserting missing 'title' element
\ No newline at end of file diff --git a/ext/tidy/tests/007.html b/ext/tidy/tests/007.html new file mode 100644 index 000000000..7dc035777 --- /dev/null +++ b/ext/tidy/tests/007.html @@ -0,0 +1 @@ +<B>testing</I> diff --git a/ext/tidy/tests/007.phpt b/ext/tidy/tests/007.phpt new file mode 100644 index 000000000..26867ff3f --- /dev/null +++ b/ext/tidy/tests/007.phpt @@ -0,0 +1,21 @@ +--TEST-- +Verbose tidy_getopt() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--INI-- +tidy.default_config= +--FILE-- +<?php + $a = new tidy(dirname(__FILE__)."/007.html"); + echo "Current Value of 'tidy-mark': "; + var_dump($a->getopt("tidy-mark")); + echo "Current Value of 'error-file': "; + var_dump($a->getopt("error-file")); + echo "Current Value of 'tab-size': "; + var_dump($a->getopt("tab-size")); + +?> +--EXPECT-- +Current Value of 'tidy-mark': bool(false) +Current Value of 'error-file': string(0) "" +Current Value of 'tab-size': int(8) diff --git a/ext/tidy/tests/008.phpt b/ext/tidy/tests/008.phpt new file mode 100644 index 000000000..150b98f56 --- /dev/null +++ b/ext/tidy/tests/008.phpt @@ -0,0 +1,15 @@ +--TEST-- +Accessing the error buffer via $obj->error_buf... +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_string("<HTML><asd asdf></HTML>"); + echo $a->errorBuffer; +?> +--EXPECT-- +line 1 column 1 - Warning: missing <!DOCTYPE> declaration +line 1 column 7 - Error: <asd> is not recognized! +line 1 column 7 - Warning: discarding unexpected <asd> +line 1 column 17 - Warning: discarding unexpected </html> +line 1 column 7 - Warning: inserting missing 'title' element
\ No newline at end of file diff --git a/ext/tidy/tests/009.phpt b/ext/tidy/tests/009.phpt new file mode 100644 index 000000000..02c65df7c --- /dev/null +++ b/ext/tidy/tests/009.phpt @@ -0,0 +1,19 @@ +--TEST-- +tidy_doc object overloading +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + + $a = tidy_parse_string("<HTML></HTML>"); + echo $a; + +?> +--EXPECT-- +<html> +<head> +<title></title> +</head> +<body> +</body> +</html>
\ No newline at end of file diff --git a/ext/tidy/tests/010.phpt b/ext/tidy/tests/010.phpt new file mode 100644 index 000000000..2bb66d49a --- /dev/null +++ b/ext/tidy/tests/010.phpt @@ -0,0 +1,245 @@ +--TEST-- +Accessing root, body, html, and head nodes.. +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_string("<HTML><BODY BGCOLOR=#FFFFFF ALINK=#000000></BODY></HTML>"); + var_dump($a->root()); + var_dump($a->body()); + var_dump($a->html()); + var_dump($a->head()); + +?> +--EXPECT-- +object(tidyNode)#2 (5) { + ["value"]=> + string(94) "<html> +<head> +<title></title> +</head> +<body bgcolor="#FFFFFF" alink="#000000"> +</body> +</html>" + ["name"]=> + string(0) "" + ["type"]=> + int(0) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#3 (6) { + ["value"]=> + string(94) "<html> +<head> +<title></title> +</head> +<body bgcolor="#FFFFFF" alink="#000000"> +</body> +</html>" + ["name"]=> + string(4) "html" + ["type"]=> + int(5) + ["id"]=> + int(48) + ["attribute"]=> + NULL + ["child"]=> + array(2) { + [0]=> + &object(tidyNode)#4 (6) { + ["value"]=> + string(31) "<head> +<title></title> +</head> +" + ["name"]=> + string(4) "head" + ["type"]=> + int(5) + ["id"]=> + int(46) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#5 (6) { + ["value"]=> + string(16) "<title></title> +" + ["name"]=> + string(5) "title" + ["type"]=> + int(5) + ["id"]=> + int(111) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } + } + [1]=> + &object(tidyNode)#6 (6) { + ["value"]=> + string(49) "<body bgcolor="#FFFFFF" alink="#000000"> +</body> +" + ["name"]=> + string(4) "body" + ["type"]=> + int(5) + ["id"]=> + int(16) + ["attribute"]=> + array(2) { + ["bgcolor"]=> + string(7) "#FFFFFF" + ["alink"]=> + string(7) "#000000" + } + ["child"]=> + NULL + } + } + } + } +} +object(tidyNode)#2 (6) { + ["value"]=> + string(49) "<body bgcolor="#FFFFFF" alink="#000000"> +</body> +" + ["name"]=> + string(4) "body" + ["type"]=> + int(5) + ["id"]=> + int(16) + ["attribute"]=> + array(2) { + ["bgcolor"]=> + string(7) "#FFFFFF" + ["alink"]=> + string(7) "#000000" + } + ["child"]=> + NULL +} +object(tidyNode)#2 (6) { + ["value"]=> + string(94) "<html> +<head> +<title></title> +</head> +<body bgcolor="#FFFFFF" alink="#000000"> +</body> +</html>" + ["name"]=> + string(4) "html" + ["type"]=> + int(5) + ["id"]=> + int(48) + ["attribute"]=> + NULL + ["child"]=> + array(2) { + [0]=> + &object(tidyNode)#3 (6) { + ["value"]=> + string(31) "<head> +<title></title> +</head> +" + ["name"]=> + string(4) "head" + ["type"]=> + int(5) + ["id"]=> + int(46) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#6 (6) { + ["value"]=> + string(16) "<title></title> +" + ["name"]=> + string(5) "title" + ["type"]=> + int(5) + ["id"]=> + int(111) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } + } + [1]=> + &object(tidyNode)#4 (6) { + ["value"]=> + string(49) "<body bgcolor="#FFFFFF" alink="#000000"> +</body> +" + ["name"]=> + string(4) "body" + ["type"]=> + int(5) + ["id"]=> + int(16) + ["attribute"]=> + array(2) { + ["bgcolor"]=> + string(7) "#FFFFFF" + ["alink"]=> + string(7) "#000000" + } + ["child"]=> + NULL + } + } +} +object(tidyNode)#2 (6) { + ["value"]=> + string(31) "<head> +<title></title> +</head> +" + ["name"]=> + string(4) "head" + ["type"]=> + int(5) + ["id"]=> + int(46) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#4 (6) { + ["value"]=> + string(16) "<title></title> +" + ["name"]=> + string(5) "title" + ["type"]=> + int(5) + ["id"]=> + int(111) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } +} diff --git a/ext/tidy/tests/011.phpt b/ext/tidy/tests/011.phpt new file mode 100644 index 000000000..2a9461675 --- /dev/null +++ b/ext/tidy/tests/011.phpt @@ -0,0 +1,22 @@ +--TEST-- +Accessing attributes of a node +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $a = tidy_parse_string("<HTML><BODY BGCOLOR=#FFFFFF ALINK=#000000></BODY></HTML>"); + $body = $a->body(); + var_dump($body->attribute); + foreach($body->attribute as $key=>$val) { + echo "Attrib '$key': $val\n"; + } +?> +--EXPECT-- +array(2) { + ["bgcolor"]=> + string(7) "#FFFFFF" + ["alink"]=> + string(7) "#000000" +} +Attrib 'bgcolor': #FFFFFF +Attrib 'alink': #000000
\ No newline at end of file diff --git a/ext/tidy/tests/012.phpt b/ext/tidy/tests/012.phpt new file mode 100644 index 000000000..5cec346b1 --- /dev/null +++ b/ext/tidy/tests/012.phpt @@ -0,0 +1,347 @@ +--TEST-- +Accessing children nodes +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + + function dump_nodes(tidyNode $node) { + + var_dump($node->hasChildren()); + if($node->hasChildren()) { + + foreach($node->child as $c) { + + var_dump($c); + + if($c->hasChildren()) { + + dump_nodes($c); + + } + } + + } + + } + + $a = tidy_parse_string("<HTML><BODY BGCOLOR=#FFFFFF ALINK=#000000><B>Hi</B><I>Bye<U>Test</U></I></BODY></HTML>"); + $html = $a->html(); + dump_nodes($html); + +?> +--EXPECT-- +bool(true) +object(tidyNode)#3 (6) { + ["value"]=> + string(31) "<head> +<title></title> +</head> +" + ["name"]=> + string(4) "head" + ["type"]=> + int(5) + ["id"]=> + int(46) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#4 (6) { + ["value"]=> + string(16) "<title></title> +" + ["name"]=> + string(5) "title" + ["type"]=> + int(5) + ["id"]=> + int(111) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } +} +bool(true) +object(tidyNode)#4 (6) { + ["value"]=> + string(16) "<title></title> +" + ["name"]=> + string(5) "title" + ["type"]=> + int(5) + ["id"]=> + int(111) + ["attribute"]=> + NULL + ["child"]=> + NULL +} +object(tidyNode)#5 (6) { + ["value"]=> + string(80) "<body bgcolor="#FFFFFF" alink="#000000"> +<b>Hi</b><i>Bye<u>Test</u></i> +</body> +" + ["name"]=> + string(4) "body" + ["type"]=> + int(5) + ["id"]=> + int(16) + ["attribute"]=> + array(2) { + ["bgcolor"]=> + string(7) "#FFFFFF" + ["alink"]=> + string(7) "#000000" + } + ["child"]=> + array(2) { + [0]=> + &object(tidyNode)#6 (6) { + ["value"]=> + string(9) "<b>Hi</b>" + ["name"]=> + string(1) "b" + ["type"]=> + int(5) + ["id"]=> + int(8) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#7 (5) { + ["value"]=> + string(2) "Hi" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } + } + [1]=> + &object(tidyNode)#8 (6) { + ["value"]=> + string(21) "<i>Bye<u>Test</u></i>" + ["name"]=> + string(1) "i" + ["type"]=> + int(5) + ["id"]=> + int(49) + ["attribute"]=> + NULL + ["child"]=> + array(2) { + [0]=> + &object(tidyNode)#9 (5) { + ["value"]=> + string(3) "Bye" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + [1]=> + &object(tidyNode)#10 (6) { + ["value"]=> + string(11) "<u>Test</u>" + ["name"]=> + string(1) "u" + ["type"]=> + int(5) + ["id"]=> + int(114) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#11 (5) { + ["value"]=> + string(4) "Test" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } + } + } + } + } +} +bool(true) +object(tidyNode)#6 (6) { + ["value"]=> + string(9) "<b>Hi</b>" + ["name"]=> + string(1) "b" + ["type"]=> + int(5) + ["id"]=> + int(8) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#7 (5) { + ["value"]=> + string(2) "Hi" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } +} +bool(true) +object(tidyNode)#7 (5) { + ["value"]=> + string(2) "Hi" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL +} +object(tidyNode)#8 (6) { + ["value"]=> + string(21) "<i>Bye<u>Test</u></i>" + ["name"]=> + string(1) "i" + ["type"]=> + int(5) + ["id"]=> + int(49) + ["attribute"]=> + NULL + ["child"]=> + array(2) { + [0]=> + &object(tidyNode)#9 (5) { + ["value"]=> + string(3) "Bye" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + [1]=> + &object(tidyNode)#10 (6) { + ["value"]=> + string(11) "<u>Test</u>" + ["name"]=> + string(1) "u" + ["type"]=> + int(5) + ["id"]=> + int(114) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#11 (5) { + ["value"]=> + string(4) "Test" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } + } + } +} +bool(true) +object(tidyNode)#9 (5) { + ["value"]=> + string(3) "Bye" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL +} +object(tidyNode)#10 (6) { + ["value"]=> + string(11) "<u>Test</u>" + ["name"]=> + string(1) "u" + ["type"]=> + int(5) + ["id"]=> + int(114) + ["attribute"]=> + NULL + ["child"]=> + array(1) { + [0]=> + &object(tidyNode)#11 (5) { + ["value"]=> + string(4) "Test" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL + } + } +} +bool(true) +object(tidyNode)#11 (5) { + ["value"]=> + string(4) "Test" + ["name"]=> + string(0) "" + ["type"]=> + int(4) + ["attribute"]=> + NULL + ["child"]=> + NULL +} diff --git a/ext/tidy/tests/013.html b/ext/tidy/tests/013.html new file mode 100644 index 000000000..7dc035777 --- /dev/null +++ b/ext/tidy/tests/013.html @@ -0,0 +1 @@ +<B>testing</I> diff --git a/ext/tidy/tests/013.phpt b/ext/tidy/tests/013.phpt new file mode 100644 index 000000000..8f1ac94ef --- /dev/null +++ b/ext/tidy/tests/013.phpt @@ -0,0 +1,13 @@ +--TEST-- +Parsing a file using constructor +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $tidy = new tidy(dirname(__FILE__)."/013.html", array("show-body-only"=>true)); + $tidy->cleanRepair(); + echo $tidy; + +?> +--EXPECT-- +<b>testing</b> diff --git a/ext/tidy/tests/014.phpt b/ext/tidy/tests/014.phpt new file mode 100644 index 000000000..a391b3dc9 --- /dev/null +++ b/ext/tidy/tests/014.phpt @@ -0,0 +1,14 @@ +--TEST-- +Passing configuration options through tidy_parse_string(). +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $text = "<B>testing</I>"; + $tidy = tidy_parse_string($text, array('show-body-only'=>true)); + tidy_clean_repair($tidy); + echo tidy_get_output($tidy); + +?> +--EXPECT-- +<b>testing</b>
\ No newline at end of file diff --git a/ext/tidy/tests/015.html b/ext/tidy/tests/015.html new file mode 100644 index 000000000..7dc035777 --- /dev/null +++ b/ext/tidy/tests/015.html @@ -0,0 +1 @@ +<B>testing</I> diff --git a/ext/tidy/tests/015.phpt b/ext/tidy/tests/015.phpt new file mode 100644 index 000000000..03018ffa1 --- /dev/null +++ b/ext/tidy/tests/015.phpt @@ -0,0 +1,13 @@ +--TEST-- +Passing configuration options through tidy_parse_file(). +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $tidy = tidy_parse_file(dirname(__FILE__)."/015.html", array('show-body-only'=>true)); + tidy_clean_repair($tidy); + echo tidy_get_output($tidy); + +?> +--EXPECT-- +<b>testing</b>
\ No newline at end of file diff --git a/ext/tidy/tests/016.html b/ext/tidy/tests/016.html new file mode 100644 index 000000000..7dc6e4aba --- /dev/null +++ b/ext/tidy/tests/016.html @@ -0,0 +1 @@ +<P><B><FONT SIZE=10 COLOR=#FF0000>testing</FONT></I></P> diff --git a/ext/tidy/tests/016.phpt b/ext/tidy/tests/016.phpt new file mode 100644 index 000000000..c2fddce6f --- /dev/null +++ b/ext/tidy/tests/016.phpt @@ -0,0 +1,24 @@ +--TEST-- +Passing configuration file through tidy_parse_file() +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php + $tidy = tidy_parse_file(dirname(__FILE__)."/016.html", dirname(__FILE__)."/016.tcfg"); + tidy_clean_repair($tidy); + echo tidy_get_output($tidy); +?> +--EXPECT-- +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<html> +<head> +<title></title> + +<style type="text/css"> + p.c1 {font-weight: bold} +</style> +</head> +<body> +<p class="c1">testing</p> +</body> +</html> diff --git a/ext/tidy/tests/016.tcfg b/ext/tidy/tests/016.tcfg new file mode 100644 index 000000000..fd6e4e44f --- /dev/null +++ b/ext/tidy/tests/016.tcfg @@ -0,0 +1 @@ +clean: yes diff --git a/ext/tidy/tests/017.phpt b/ext/tidy/tests/017.phpt new file mode 100644 index 000000000..ba620a32e --- /dev/null +++ b/ext/tidy/tests/017.phpt @@ -0,0 +1,17 @@ +--TEST-- +The Tidy Output Buffer Filter +--SKIPIF-- +<?php if (!extension_loaded("tidy")) print "skip"; ?> +--FILE-- +<?php ob_start("ob_tidyhandler"); ?> +<B>testing</I> +--EXPECT-- +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<html> +<head> +<title></title> +</head> +<body> +<b>testing</b> +</body> +</html>
\ No newline at end of file diff --git a/ext/tidy/tidy.c b/ext/tidy/tidy.c new file mode 100644 index 000000000..62c3a8ea8 --- /dev/null +++ b/ext/tidy/tidy.c @@ -0,0 +1,1763 @@ +/* + +----------------------------------------------------------------------+ + | PHP Version 5 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2004 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 3.0 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_0.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Author: John Coggeshall <john@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id: tidy.c,v 1.56.2.5 2005/02/08 05:29:48 rasmus Exp $ */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "php.h" +#include "php_tidy.h" + +#if HAVE_TIDY + +#include "php_ini.h" +#include "ext/standard/info.h" +#include "safe_mode.h" + +#include "Zend/zend_exceptions.h" +#include "Zend/zend_object_handlers.h" + +#include "tidy.h" +#include "buffio.h" + +#define PHP_TIDY_MODULE_VERSION "2.0" + +/* {{{ ext/tidy macros +*/ +#define REMOVE_NEWLINE(_z) _z->value.str.val[_z->value.str.len-1] = '\0'; _z->value.str.len--; + +#define TIDYDOC_FROM_OBJECT(tdoc, object) \ + { \ + PHPTidyObj *obj = (PHPTidyObj*) zend_object_store_get_object(object TSRMLS_CC); \ + tdoc = obj->ptdoc; \ + } + +#define TIDY_SET_CONTEXT \ + zval *object; \ + TG(inst) = getThis(); \ + object = TG(inst) + +#define TIDY_FETCH_OBJECT \ + PHPTidyObj *obj; \ + TIDY_SET_CONTEXT; \ + if (object) { \ + if (ZEND_NUM_ARGS()) { \ + WRONG_PARAM_COUNT; \ + } \ + } else { \ + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, NULL, "O", &object, tidy_ce_doc) == FAILURE) { \ + RETURN_FALSE; \ + } \ + } \ + obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC); \ + +#define TIDY_FETCH_ONLY_OBJECT \ + PHPTidyObj *obj; \ + TIDY_SET_CONTEXT; \ + if (ZEND_NUM_ARGS()) { \ + WRONG_PARAM_COUNT; \ + } \ + obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC); \ + + +#define Z_OBJ_P(zval_p) zend_objects_get_address(zval_p TSRMLS_CC) + +#define TIDY_APPLY_CONFIG_ZVAL(_doc, _val) \ + if(_val) { \ + if(Z_TYPE_P(_val) == IS_ARRAY) { \ + _php_tidy_apply_config_array(_doc, HASH_OF(_val) TSRMLS_CC); \ + } else { \ + convert_to_string_ex(&_val); \ + TIDY_SAFE_MODE_CHECK(Z_STRVAL_P(_val)); \ + if (tidyLoadConfig(_doc, Z_STRVAL_P(_val)) < 0) { \ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not load configuration file '%s'", Z_STRVAL_P(_val)); \ + RETURN_FALSE; \ + } \ + } \ + } + +#define REGISTER_TIDY_CLASS(classname, name, parent, __flags) \ + { \ + zend_class_entry ce; \ + INIT_CLASS_ENTRY(ce, # classname, tidy_funcs_ ## name); \ + ce.create_object = tidy_object_new_ ## name; \ + tidy_ce_ ## name = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \ + tidy_ce_ ## name->ce_flags |= __flags; \ + memcpy(&tidy_object_handlers_ ## name, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \ + tidy_object_handlers_ ## name.clone_obj = NULL; \ + } + +#define TIDY_TAG_CONST(tag) REGISTER_LONG_CONSTANT("TIDY_TAG_" #tag, TidyTag_##tag, CONST_CS | CONST_PERSISTENT) +#define TIDY_NODE_CONST(name, type) REGISTER_LONG_CONSTANT("TIDY_NODETYPE_" #name, TidyNode_##type, CONST_CS | CONST_PERSISTENT) + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define ADD_PROPERTY_STRING(_table, _key, _string) \ + { \ + zval *tmp; \ + MAKE_STD_ZVAL(tmp); \ + if (_string) { \ + ZVAL_STRING(tmp, (char *)_string, 1); \ + } else { \ + ZVAL_EMPTY_STRING(tmp); \ + } \ + zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \ + } + +#define ADD_PROPERTY_LONG(_table, _key, _long) \ + { \ + zval *tmp; \ + MAKE_STD_ZVAL(tmp); \ + ZVAL_LONG(tmp, _long); \ + zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \ + } + +#define ADD_PROPERTY_NULL(_table, _key) \ + { \ + zval *tmp; \ + MAKE_STD_ZVAL(tmp); \ + ZVAL_NULL(tmp); \ + zend_hash_update(_table, #_key, sizeof(#_key), (void *)&tmp, sizeof(zval *), NULL); \ + } + +#define TIDY_SAFE_MODE_CHECK(filename) \ +if ((PG(safe_mode) && (!php_checkuid(filename, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(filename TSRMLS_CC)) { \ + RETURN_FALSE; \ +} \ + +#define TIDY_SET_DEFAULT_CONFIG(_doc) \ + if (TG(default_config) && TG(default_config)[0]) { \ + if (tidyLoadConfig(_doc, TG(default_config)) < 0) { \ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to load Tidy configuration file at '%s'.", TG(default_config)); \ + } \ + } +/* }}} */ + +/* {{{ ext/tidy structs +*/ +typedef struct _PHPTidyDoc PHPTidyDoc; +typedef struct _PHPTidyObj PHPTidyObj; + +typedef enum { + is_node, + is_doc, + is_exception +} tidy_obj_type; + +typedef enum { + is_root_node, + is_html_node, + is_head_node, + is_body_node +} tidy_base_nodetypes; + +struct _PHPTidyDoc { + TidyDoc doc; + TidyBuffer *errbuf; + unsigned int ref_count; +}; + +struct _PHPTidyObj { + zend_object std; + TidyNode node; + tidy_obj_type type; + PHPTidyDoc *ptdoc; +}; +/* }}} */ + +/* {{{ ext/tidy prototypes +*/ +static char *php_tidy_file_to_mem(char *, zend_bool TSRMLS_DC); +static void tidy_object_free_storage(void * TSRMLS_DC); +static zend_object_value tidy_object_new_node(zend_class_entry * TSRMLS_DC); +static zend_object_value tidy_object_new_doc(zend_class_entry * TSRMLS_DC); +static zend_object_value tidy_object_new_exception(zend_class_entry * TSRMLS_DC); +static zend_class_entry *tidy_get_ce_node(zval * TSRMLS_DC); +static zend_class_entry *tidy_get_ce_doc(zval * TSRMLS_DC); +static zval * tidy_instanciate(zend_class_entry *, zval * TSRMLS_DC); +static int tidy_doc_cast_handler(zval *, zval *, int, int TSRMLS_DC); +static int tidy_node_cast_handler(zval *, zval *, int, int TSRMLS_DC); +static void tidy_doc_update_properties(PHPTidyObj * TSRMLS_DC); +static void tidy_add_default_properties(PHPTidyObj *, tidy_obj_type TSRMLS_DC); +static void *php_tidy_get_opt_val(PHPTidyDoc *, TidyOption, TidyOptionType * TSRMLS_DC); +static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes); +static int _php_tidy_set_tidy_opt(TidyDoc, char *, zval * TSRMLS_DC); +static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options TSRMLS_DC); +static void _php_tidy_register_nodetypes(INIT_FUNC_ARGS); +static void _php_tidy_register_tags(INIT_FUNC_ARGS); +/* }}} */ + +ZEND_DECLARE_MODULE_GLOBALS(tidy) + +PHP_INI_BEGIN() +STD_PHP_INI_ENTRY("tidy.default_config", "", PHP_INI_SYSTEM, OnUpdateString, default_config, zend_tidy_globals, tidy_globals) +PHP_INI_ENTRY("tidy.clean_output", "0", PHP_INI_PERDIR, NULL) +PHP_INI_END() + +function_entry tidy_functions[] = { + PHP_FE(tidy_getopt, NULL) + PHP_FE(tidy_parse_string, NULL) + PHP_FE(tidy_parse_file, NULL) + PHP_FE(tidy_get_output, NULL) + PHP_FE(tidy_get_error_buffer, NULL) + PHP_FE(tidy_clean_repair, NULL) + PHP_FE(tidy_repair_string, NULL) + PHP_FE(tidy_repair_file, NULL) + PHP_FE(tidy_diagnose, NULL) + PHP_FE(tidy_get_release, NULL) + PHP_FE(tidy_get_config, NULL) + PHP_FE(tidy_get_status, NULL) + PHP_FE(tidy_get_html_ver, NULL) + PHP_FE(tidy_is_xhtml, NULL) + PHP_FE(tidy_is_xml, NULL) + PHP_FE(tidy_error_count, NULL) + PHP_FE(tidy_warning_count, NULL) + PHP_FE(tidy_access_count, NULL) + PHP_FE(tidy_config_count, NULL) + PHP_FE(tidy_get_root, NULL) + PHP_FE(tidy_get_head, NULL) + PHP_FE(tidy_get_html, NULL) + PHP_FE(tidy_get_body, NULL) + PHP_FE(ob_tidyhandler, NULL) + {NULL, NULL, NULL} +}; + +function_entry tidy_funcs_doc[] = { + TIDY_METHOD_MAP(getOpt, tidy_getopt, NULL) + TIDY_METHOD_MAP(cleanRepair, tidy_clean_repair, NULL) + TIDY_DOC_ME(parseFile, NULL) + TIDY_DOC_ME(parseString, NULL) + TIDY_METHOD_MAP(repairString, tidy_repair_string, NULL) + TIDY_METHOD_MAP(repairFile, tidy_repair_file, NULL) + TIDY_METHOD_MAP(diagnose, tidy_diagnose, NULL) + TIDY_METHOD_MAP(getRelease, tidy_get_release, NULL) + TIDY_METHOD_MAP(getConfig, tidy_get_config, NULL) + TIDY_METHOD_MAP(getStatus, tidy_get_status, NULL) + TIDY_METHOD_MAP(getHtmlVer, tidy_get_html_ver, NULL) + TIDY_METHOD_MAP(isXhtml, tidy_is_xhtml, NULL) + TIDY_METHOD_MAP(isXml, tidy_is_xml, NULL) + TIDY_METHOD_MAP(root, tidy_get_root, NULL) + TIDY_METHOD_MAP(head, tidy_get_head, NULL) + TIDY_METHOD_MAP(html, tidy_get_html, NULL) + TIDY_METHOD_MAP(body, tidy_get_body, NULL) + TIDY_DOC_ME(__construct, NULL) + {NULL, NULL, NULL} +}; + +function_entry tidy_funcs_node[] = { + TIDY_NODE_ME(__construct, NULL) + TIDY_NODE_ME(hasChildren, NULL) + TIDY_NODE_ME(hasSiblings, NULL) + TIDY_NODE_ME(isComment, NULL) + TIDY_NODE_ME(isHtml, NULL) + TIDY_NODE_ME(isText, NULL) + TIDY_NODE_ME(isJste, NULL) + TIDY_NODE_ME(isAsp, NULL) + TIDY_NODE_ME(isPhp, NULL) + {NULL, NULL, NULL} +}; + +function_entry tidy_funcs_exception[] = { + {NULL, NULL, NULL} +}; + +zend_class_entry *tidy_ce_doc, *tidy_ce_node, *tidy_ce_exception; + +static zend_object_handlers tidy_object_handlers_doc; +static zend_object_handlers tidy_object_handlers_node; +static zend_object_handlers tidy_object_handlers_exception; + +zend_module_entry tidy_module_entry = { + STANDARD_MODULE_HEADER, + "tidy", + tidy_functions, + PHP_MINIT(tidy), + NULL, + PHP_RINIT(tidy), + NULL, + PHP_MINFO(tidy), + PHP_TIDY_MODULE_VERSION, + STANDARD_MODULE_PROPERTIES +}; + +#ifdef COMPILE_DL_TIDY +ZEND_GET_MODULE(tidy) +#endif + +void *php_tidy_malloc(size_t len) +{ + return emalloc(len); +} + +void *php_tidy_realloc(void *buf, size_t len) +{ + return erealloc(buf, len); +} + +void php_tidy_free(void *buf) +{ + efree(buf); +} + +void php_tidy_panic(ctmbstr msg) +{ + TSRMLS_FETCH(); + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not allocate memory for tidy! (Reason: %s)", (char *)msg); +} + +static int _php_tidy_set_tidy_opt(TidyDoc doc, char *optname, zval *value TSRMLS_DC) +{ + TidyOption opt = tidyGetOptionByName(doc, optname); + zval conv = *value; + + if (!opt) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unknown Tidy Configuration Option '%s'", optname); + return FAILURE; + } + + if (tidyOptIsReadOnly(opt)) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Attempting to set read-only option '%s'", optname); + return FAILURE; + } + + switch(tidyOptGetType(opt)) { + case TidyString: + if (Z_TYPE(conv) != IS_STRING) { + zval_copy_ctor(&conv); + convert_to_string(&conv); + } + if (tidyOptSetValue(doc, tidyOptGetId(opt), Z_STRVAL(conv))) { + if (Z_TYPE(conv) != Z_TYPE_P(value)) { + zval_dtor(&conv); + } + return SUCCESS; + } + if (Z_TYPE(conv) != Z_TYPE_P(value)) { + zval_dtor(&conv); + } + break; + + case TidyInteger: + if (Z_TYPE(conv) != IS_LONG) { + zval_copy_ctor(&conv); + convert_to_long(&conv); + } + if (tidyOptSetInt(doc, tidyOptGetId(opt), Z_LVAL(conv))) { + return SUCCESS; + } + break; + + case TidyBoolean: + if (Z_TYPE(conv) != IS_LONG) { + zval_copy_ctor(&conv); + convert_to_long(&conv); + } + if (tidyOptSetBool(doc, tidyOptGetId(opt), Z_LVAL(conv))) { + return SUCCESS; + } + break; + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of configuration option"); + break; + } + + return FAILURE; +} + +static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_file) +{ + char *data=NULL, *arg1, *enc = NULL; + int arg1_len, enc_len = 0; + zend_bool use_include_path = 0; + TidyDoc doc; + TidyBuffer *errbuf; + zval *config; + + TIDY_SET_CONTEXT; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zsb", &arg1, &arg1_len, &config, &enc, &enc_len, &use_include_path) == FAILURE) { + RETURN_FALSE; + } + + if (is_file) { + if (!(data = php_tidy_file_to_mem(arg1, use_include_path TSRMLS_CC))) { + RETURN_FALSE; + } + } else { + data = arg1; + } + + doc = tidyCreate(); + errbuf = emalloc(sizeof(TidyBuffer)); + tidyBufInit(errbuf); + + if (tidySetErrorBuffer(doc, errbuf) != 0) { + tidyBufFree(errbuf); + efree(errbuf); + tidyRelease(doc); + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer"); + } + + tidyOptSetBool(doc, TidyForceOutput, yes); + tidyOptSetBool(doc, TidyMark, no); + + TIDY_SET_DEFAULT_CONFIG(doc); + + /* We can't use TIDY_APPLY_CONFIG_ZVAL() here, it uses RETURN_FALSE */ + + if (ZEND_NUM_ARGS() > 1) { + if(Z_TYPE_P(config) == IS_ARRAY) { + _php_tidy_apply_config_array(doc, HASH_OF(config) TSRMLS_CC); + } else { + convert_to_string_ex(&config); + TIDY_SAFE_MODE_CHECK(Z_STRVAL_P(config)); + if (tidyLoadConfig(doc, Z_STRVAL_P(config)) < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not load configuration file '%s'", Z_STRVAL_P(config)); + RETVAL_FALSE; + } + } + } + + if(enc_len) { + if (tidySetCharEncoding(doc, enc) < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not set encoding '%s'", enc); + RETVAL_FALSE; + } + } + + if (data) { + if (tidyParseString(doc, data) < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", errbuf->bp); + RETVAL_FALSE; + } else { + if (tidyCleanAndRepair(doc) >= 0) { + TidyBuffer output = {0}; + + tidySaveBuffer (doc, &output); + RETVAL_STRING(output.bp, 1); + tidyBufFree(&output); + } else { + RETVAL_FALSE; + } + } + } + + if (is_file) { + efree(data); + } + + tidyBufFree(errbuf); + efree(errbuf); + tidyRelease(doc); +} + +static char *php_tidy_file_to_mem(char *filename, zend_bool use_include_path TSRMLS_DC) +{ + php_stream *stream; + int len; + char *data = NULL; + + if (!(stream = php_stream_open_wrapper(filename, "rb", (use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE, NULL))) { + return NULL; + } + if ((len = php_stream_copy_to_mem(stream, &data, PHP_STREAM_COPY_ALL, 0)) == 0) { + data = estrdup(""); + } + php_stream_close(stream); + + return data; +} + +static void tidy_object_free_storage(void *object TSRMLS_DC) +{ + PHPTidyObj *intern = (PHPTidyObj *)object; + + zend_hash_destroy(intern->std.properties); + FREE_HASHTABLE(intern->std.properties); + + if (intern->ptdoc) { + intern->ptdoc->ref_count--; + + if (intern->ptdoc->ref_count <= 0) { + tidyBufFree(intern->ptdoc->errbuf); + efree(intern->ptdoc->errbuf); + tidyRelease(intern->ptdoc->doc); + efree(intern->ptdoc); + } + } + + efree(object); +} + +static void tidy_object_new(zend_class_entry *class_type, zend_object_handlers *handlers, + zend_object_value *retval, tidy_obj_type objtype TSRMLS_DC) +{ + PHPTidyObj *intern; + zval *tmp; + + intern = emalloc(sizeof(PHPTidyObj)); + memset(intern, 0, sizeof(PHPTidyObj)); + intern->std.ce = class_type; + + ALLOC_HASHTABLE(intern->std.properties); + zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); + + switch(objtype) { + case is_node: + break; + + case is_doc: + tidySetMallocCall(php_tidy_malloc); + tidySetReallocCall(php_tidy_realloc); + tidySetFreeCall(php_tidy_free); + tidySetPanicCall(php_tidy_panic); + + intern->ptdoc = emalloc(sizeof(PHPTidyDoc)); + intern->ptdoc->doc = tidyCreate(); + intern->ptdoc->ref_count = 1; + intern->ptdoc->errbuf = emalloc(sizeof(TidyBuffer)); + tidyBufInit(intern->ptdoc->errbuf); + + if (tidySetErrorBuffer(intern->ptdoc->doc, intern->ptdoc->errbuf) != 0) { + tidyBufFree(intern->ptdoc->errbuf); + efree(intern->ptdoc->errbuf); + tidyRelease(intern->ptdoc->doc); + efree(intern->ptdoc); + efree(intern); + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer"); + } + + tidyOptSetBool(intern->ptdoc->doc, TidyForceOutput, yes); + tidyOptSetBool(intern->ptdoc->doc, TidyMark, no); + + TIDY_SET_DEFAULT_CONFIG(intern->ptdoc->doc); + + tidy_add_default_properties(intern, is_doc TSRMLS_CC); + break; + + default: + break; + } + + retval->handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t) tidy_object_free_storage, NULL TSRMLS_CC); + retval->handlers = handlers; +} + +static zend_object_value tidy_object_new_node(zend_class_entry *class_type TSRMLS_DC) +{ + zend_object_value retval; + tidy_object_new(class_type, &tidy_object_handlers_node, &retval, is_node TSRMLS_CC); + return retval; +} + +static zend_object_value tidy_object_new_doc(zend_class_entry *class_type TSRMLS_DC) +{ + zend_object_value retval; + tidy_object_new(class_type, &tidy_object_handlers_doc, &retval, is_doc TSRMLS_CC); + return retval; +} + +static zend_object_value tidy_object_new_exception(zend_class_entry *class_type TSRMLS_DC) +{ + zend_object_value retval; + tidy_object_new(class_type, &tidy_object_handlers_exception, &retval, is_exception TSRMLS_CC); + return retval; +} + +static zend_class_entry *tidy_get_ce_node(zval *object TSRMLS_DC) +{ + return tidy_ce_node; +} + +static zend_class_entry *tidy_get_ce_doc(zval *object TSRMLS_DC) +{ + return tidy_ce_doc; +} + +static zval * tidy_instanciate(zend_class_entry *pce, zval *object TSRMLS_DC) +{ + if (!object) { + ALLOC_ZVAL(object); + } + + Z_TYPE_P(object) = IS_OBJECT; + object_init_ex(object, pce); + object->refcount = 1; + object->is_ref = 1; + return object; +} + +static int tidy_doc_cast_handler(zval *in, zval *out, int type, int free TSRMLS_DC) +{ + TidyBuffer output = {0}; + PHPTidyObj *obj; + + switch(type) { + case IS_LONG: + ZVAL_LONG(out, 0); + break; + + case IS_DOUBLE: + ZVAL_DOUBLE(out, 0); + break; + + case IS_BOOL: + ZVAL_BOOL(out, TRUE); + break; + + case IS_STRING: + obj = (PHPTidyObj *)zend_object_store_get_object(in TSRMLS_CC); + tidySaveBuffer (obj->ptdoc->doc, &output); + ZVAL_STRINGL(out, output.bp, output.size, TRUE); + tidyBufFree(&output); + break; + + default: + return FAILURE; + } + + return SUCCESS; +} + +static int tidy_node_cast_handler(zval *in, zval *out, int type, int free TSRMLS_DC) +{ + TidyBuffer buf = {0}; + PHPTidyObj *obj; + + switch(type) { + case IS_LONG: + ZVAL_LONG(out, 0); + break; + + case IS_DOUBLE: + ZVAL_DOUBLE(out, 0); + break; + + case IS_BOOL: + ZVAL_BOOL(out, TRUE); + break; + + case IS_STRING: + obj = (PHPTidyObj *)zend_object_store_get_object(in TSRMLS_CC); + tidyNodeGetText(obj->ptdoc->doc, obj->node, &buf); + ZVAL_STRINGL(out, buf.bp, buf.size, TRUE); + tidyBufFree(&buf); + break; + + default: + return FAILURE; + } + + return SUCCESS; +} + +static void tidy_doc_update_properties(PHPTidyObj *obj TSRMLS_DC) +{ + + TidyBuffer output = {0}; + zval *temp; + + tidySaveBuffer (obj->ptdoc->doc, &output); + + if (output.size) { + MAKE_STD_ZVAL(temp); + ZVAL_STRINGL(temp, output.bp, output.size, TRUE); + zend_hash_update(obj->std.properties, "value", sizeof("value"), (void *)&temp, sizeof(zval *), NULL); + } + + tidyBufFree(&output); + + if (obj->ptdoc->errbuf->size) { + MAKE_STD_ZVAL(temp); + ZVAL_STRINGL(temp, obj->ptdoc->errbuf->bp, obj->ptdoc->errbuf->size, TRUE); + zend_hash_update(obj->std.properties, "errorBuffer", sizeof("errorBuffer"), (void *)&temp, sizeof(zval *), NULL); + } +} + +static void tidy_add_default_properties(PHPTidyObj *obj, tidy_obj_type type TSRMLS_DC) +{ + + TidyBuffer buf; + TidyAttr tempattr; + TidyNode tempnode; + zval *attribute, *children, *temp; + PHPTidyObj *newobj; + + switch(type) { + + case is_node: + + memset(&buf, 0, sizeof(buf)); + tidyNodeGetText(obj->ptdoc->doc, obj->node, &buf); + buf.bp[buf.size-1] = '\0'; + ADD_PROPERTY_STRING(obj->std.properties, value, buf.bp); + tidyBufFree(&buf); + + ADD_PROPERTY_STRING(obj->std.properties, name, tidyNodeGetName(obj->node)); + ADD_PROPERTY_LONG(obj->std.properties, type, tidyNodeGetType(obj->node)); + + switch(tidyNodeGetType(obj->node)) { + case TidyNode_Root: + case TidyNode_DocType: + case TidyNode_Text: + case TidyNode_Comment: + break; + + default: + ADD_PROPERTY_LONG(obj->std.properties, id, tidyNodeGetId(obj->node)); + } + + tempattr = tidyAttrFirst(obj->node); + MAKE_STD_ZVAL(attribute); + + if (tempattr) { + char *name, *val; + array_init(attribute); + + do { + name = (char *)tidyAttrName(tempattr); + val = (char *)tidyAttrValue(tempattr); + if (name && val) { + add_assoc_string(attribute, name, val, TRUE); + } + } while((tempattr = tidyAttrNext(tempattr))); + } else { + ZVAL_NULL(attribute); + } + zend_hash_update(obj->std.properties, "attribute", sizeof("attribute"), (void *)&attribute, sizeof(zval *), NULL); + + tempnode = tidyGetChild(obj->node); + + MAKE_STD_ZVAL(children); + if (tempnode) { + array_init(children); + do { + MAKE_STD_ZVAL(temp); + tidy_instanciate(tidy_ce_node, temp TSRMLS_CC); + newobj = (PHPTidyObj *) zend_object_store_get_object(temp TSRMLS_CC); + newobj->node = tempnode; + newobj->type = is_node; + newobj->ptdoc = obj->ptdoc; + newobj->ptdoc->ref_count++; + + tidy_add_default_properties(newobj, is_node TSRMLS_CC); + add_next_index_zval(children, temp); + + } while((tempnode = tidyGetNext(tempnode))); + + } else { + ZVAL_NULL(children); + } + + zend_hash_update(obj->std.properties, "child", sizeof("child"), (void *)&children, sizeof(zval *), NULL); + + break; + + case is_doc: + ADD_PROPERTY_NULL(obj->std.properties, errorBuffer); + ADD_PROPERTY_NULL(obj->std.properties, value); + break; + + case is_exception: + default: + break; + } +} + +static void *php_tidy_get_opt_val(PHPTidyDoc *ptdoc, TidyOption opt, TidyOptionType *type TSRMLS_DC) +{ + *type = tidyOptGetType(opt); + + switch (*type) { + case TidyString: { + char *val = (char *) tidyOptGetValue(ptdoc->doc, tidyOptGetId(opt)); + if (val) { + return (void *) estrdup(val); + } else { + return (void *) estrdup(""); + } + } + break; + + case TidyInteger: + return (void *) tidyOptGetInt(ptdoc->doc, tidyOptGetId(opt)); + break; + + case TidyBoolean: + return (void *) tidyOptGetBool(ptdoc->doc, tidyOptGetId(opt)); + break; + } + + /* should not happen */ + return NULL; +} + +static void php_tidy_create_node(INTERNAL_FUNCTION_PARAMETERS, tidy_base_nodetypes node) +{ + PHPTidyObj *newobj; + TIDY_FETCH_OBJECT; + + tidy_instanciate(tidy_ce_node, return_value TSRMLS_CC); + newobj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC); + newobj->type = is_node; + newobj->ptdoc = obj->ptdoc; + newobj->ptdoc->ref_count++; + + switch(node) { + case is_root_node: + newobj->node = tidyGetRoot(newobj->ptdoc->doc); + break; + + case is_html_node: + newobj->node = tidyGetHtml(newobj->ptdoc->doc); + break; + + case is_head_node: + newobj->node = tidyGetHead(newobj->ptdoc->doc); + break; + + case is_body_node: + newobj->node = tidyGetBody(newobj->ptdoc->doc); + break; + } + + tidy_add_default_properties(newobj, is_node TSRMLS_CC); +} + +static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options TSRMLS_DC) +{ + char *opt_name = NULL; + zval **opt_val; + ulong opt_indx; + + for (zend_hash_internal_pointer_reset(ht_options); + zend_hash_get_current_data(ht_options, (void **)&opt_val) == SUCCESS; + zend_hash_move_forward(ht_options)) { + + if(zend_hash_get_current_key(ht_options, &opt_name, &opt_indx, FALSE) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not retrieve key from option array"); + return FAILURE; + } + + if(opt_name) { + _php_tidy_set_tidy_opt(doc, opt_name, *opt_val TSRMLS_CC); + opt_name = NULL; + } + + } + + return SUCCESS; +} + +static int php_tidy_parse_string(PHPTidyObj *obj, char *string, char *enc TSRMLS_DC) +{ + if(enc) { + if (tidySetCharEncoding(obj->ptdoc->doc, enc) < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not set encoding '%s'", enc); + return FAILURE; + } + } + + if (tidyParseString(obj->ptdoc->doc, string) < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", obj->ptdoc->errbuf->bp); + return FAILURE; + + } else { + tidy_doc_update_properties(obj TSRMLS_CC); + + return SUCCESS; + } + + tidy_doc_update_properties(obj TSRMLS_CC); + +} + +static void tidy_globals_ctor(void *global TSRMLS_DC) +{ + +} + +static void tidy_globals_dtor(void *global TSRMLS_DC) +{ + +} + +PHP_MINIT_FUNCTION(tidy) +{ + ZEND_INIT_MODULE_GLOBALS(tidy, tidy_globals_ctor, tidy_globals_dtor); + + REGISTER_INI_ENTRIES(); + REGISTER_TIDY_CLASS(tidy, doc, NULL, 0); + REGISTER_TIDY_CLASS(tidyNode, node, NULL, ZEND_ACC_FINAL_CLASS); + /* no exceptions for now.. + REGISTER_TIDY_CLASS(tidyException, exception, zend_exception_get_default()); + */ + tidy_object_handlers_doc.get_class_entry = tidy_get_ce_doc; + tidy_object_handlers_node.get_class_entry = tidy_get_ce_node; + + tidy_object_handlers_doc.cast_object = tidy_doc_cast_handler; + tidy_object_handlers_node.cast_object = tidy_node_cast_handler; + + _php_tidy_register_tags(INIT_FUNC_ARGS_PASSTHRU); + _php_tidy_register_nodetypes(INIT_FUNC_ARGS_PASSTHRU); + + return SUCCESS; +} + +PHP_RINIT_FUNCTION(tidy) +{ + if (INI_BOOL("tidy.clean_output") == TRUE) { + if (php_start_ob_buffer_named("ob_tidyhandler", 0, 1 TSRMLS_CC) == FAILURE) { + zend_error(E_NOTICE, "Failure installing Tidy output buffering."); + } + } + + return SUCCESS; +} + +PHP_MINFO_FUNCTION(tidy) +{ + php_info_print_table_start(); + php_info_print_table_header(2, "Tidy support", "enabled"); + php_info_print_table_row(2, "libTidy Release", (char *)tidyReleaseDate()); + php_info_print_table_row(2, "Extension Version", PHP_TIDY_MODULE_VERSION " ($Id: tidy.c,v 1.56.2.5 2005/02/08 05:29:48 rasmus Exp $)"); + php_info_print_table_end(); + + DISPLAY_INI_ENTRIES(); +} + +PHP_FUNCTION(ob_tidyhandler) +{ + char *input; + int input_len; + long mode; + TidyBuffer errbuf = {0}; + TidyDoc doc; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &input, &input_len, &mode) == FAILURE) { + WRONG_PARAM_COUNT; + } + + doc = tidyCreate(); + tidyBufInit(&errbuf); + + tidyOptSetBool(doc, TidyForceOutput, yes); + tidyOptSetBool(doc, TidyMark, no); + + if (tidySetErrorBuffer(doc, &errbuf) != 0) { + tidyRelease(doc); + tidyBufFree(&errbuf); + + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Could not set Tidy error buffer"); + } + + TIDY_SET_DEFAULT_CONFIG(doc); + + if (input_len > 1) { + if (tidyParseString(doc, input) < 0 || tidyCleanAndRepair(doc) < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", errbuf.bp); + RETVAL_NULL(); + } else { + TidyBuffer output = {0}; + tidyBufInit(&output); + + tidySaveBuffer(doc, &output); + RETVAL_STRING(output.bp, 1); + + tidyBufFree(&output); + } + } else { + RETVAL_NULL(); + } + + tidyRelease(doc); + tidyBufFree(&errbuf); +} + +/* {{{ proto bool tidy_parse_string(string input [, mixed config_options [, string encoding]]) + Parse a document stored in a string */ +PHP_FUNCTION(tidy_parse_string) +{ + char *input, *enc = NULL; + int input_len, enc_len = 0; + zval *options = NULL; + + PHPTidyObj *obj; + + TIDY_SET_CONTEXT; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zs", &input, &input_len, &options, &enc, &enc_len) == FAILURE) { + RETURN_FALSE; + } + + tidy_instanciate(tidy_ce_doc, return_value TSRMLS_CC); + obj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC); + + TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options); + + if(php_tidy_parse_string(obj, input, enc TSRMLS_CC) == FAILURE) { + zval_dtor(return_value); + INIT_ZVAL(*return_value); + RETURN_FALSE; + } + +} +/* }}} */ + +/* {{{ proto string tidy_get_error_buffer([boolean detailed]) + Return warnings and errors which occured parsing the specified document*/ +PHP_FUNCTION(tidy_get_error_buffer) +{ + TIDY_FETCH_OBJECT; + + if (obj->ptdoc->errbuf && obj->ptdoc->errbuf->bp) { + RETURN_STRING(obj->ptdoc->errbuf->bp, 1); + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto string tidy_get_output() + Return a string representing the parsed tidy markup */ +PHP_FUNCTION(tidy_get_output) +{ + TidyBuffer output = {0}; + TIDY_FETCH_OBJECT; + + tidySaveBuffer(obj->ptdoc->doc, &output); + + RETVAL_STRING(output.bp, 1); + + tidyBufFree(&output); +} +/* }}} */ + +/* {{{ proto boolean tidy_parse_file(string file [, mixed config_options [, string encoding [, bool use_include_path]]]) + Parse markup in file or URI */ +PHP_FUNCTION(tidy_parse_file) +{ + char *inputfile, *enc = NULL; + int input_len, enc_len = 0; + zend_bool use_include_path = 0; + char *contents; + zval *options = NULL; + + PHPTidyObj *obj; + TIDY_SET_CONTEXT; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zsb", &inputfile, &input_len, + &options, &enc, &enc_len, &use_include_path) == FAILURE) { + RETURN_FALSE; + } + + tidy_instanciate(tidy_ce_doc, return_value TSRMLS_CC); + obj = (PHPTidyObj *) zend_object_store_get_object(return_value TSRMLS_CC); + + if (!(contents = php_tidy_file_to_mem(inputfile, use_include_path TSRMLS_CC))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot Load '%s' into memory %s", inputfile, (use_include_path) ? "(Using include path)" : ""); + RETURN_FALSE; + } + + TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options); + + if(php_tidy_parse_string(obj, contents, enc TSRMLS_CC) == FAILURE) { + zval_dtor(return_value); + INIT_ZVAL(*return_value); + RETVAL_FALSE; + } + + efree(contents); +} +/* }}} */ + +/* {{{ proto boolean tidy_clean_repair() + Execute configured cleanup and repair operations on parsed markup */ +PHP_FUNCTION(tidy_clean_repair) +{ + TIDY_FETCH_OBJECT; + + if (tidyCleanAndRepair(obj->ptdoc->doc) >= 0) { + tidy_doc_update_properties(obj TSRMLS_CC); + RETURN_TRUE; + } + + RETURN_FALSE; +} +/* }}} */ + +/* {{{ proto boolean tidy_repair_string(string data [, mixed config_file [, string encoding]]) + Repair a string using an optionally provided configuration file */ +PHP_FUNCTION(tidy_repair_string) +{ + TIDY_SET_CONTEXT; + php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, FALSE); +} +/* }}} */ + +/* {{{ proto boolean tidy_repair_file(string filename [, mixed config_file [, string encoding [, bool use_include_path]]]) + Repair a file using an optionally provided configuration file */ +PHP_FUNCTION(tidy_repair_file) +{ + TIDY_SET_CONTEXT; + php_tidy_quick_repair(INTERNAL_FUNCTION_PARAM_PASSTHRU, TRUE); +} +/* }}} */ + +/* {{{ proto boolean tidy_diagnose() + Run configured diagnostics on parsed and repaired markup. */ +PHP_FUNCTION(tidy_diagnose) +{ + TIDY_FETCH_OBJECT; + + if (tidyRunDiagnostics(obj->ptdoc->doc) >= 0) { + tidy_doc_update_properties(obj TSRMLS_CC); + RETURN_TRUE; + } + + RETURN_FALSE; +} +/* }}} */ + +/* {{{ proto string tidy_get_release() + Get release date (version) for Tidy library */ +PHP_FUNCTION(tidy_get_release) +{ + TIDY_SET_CONTEXT; + + if (ZEND_NUM_ARGS()) { + WRONG_PARAM_COUNT; + } + + RETURN_STRING((char *)tidyReleaseDate(), 1); +} +/* }}} */ + +/* {{{ proto array tidy_get_config() + Get current Tidy configuarion */ +PHP_FUNCTION(tidy_get_config) +{ + TidyIterator itOpt; + char *opt_name; + void *opt_value; + TidyOptionType optt; + + TIDY_FETCH_OBJECT; + + itOpt = tidyGetOptionList(obj->ptdoc->doc); + + array_init(return_value); + + while (itOpt) { + TidyOption opt = tidyGetNextOption(obj->ptdoc->doc, &itOpt); + + opt_name = (char *)tidyOptGetName(opt); + opt_value = php_tidy_get_opt_val(obj->ptdoc, opt, &optt TSRMLS_CC); + switch (optt) { + case TidyString: + add_assoc_string(return_value, opt_name, (char*)opt_value, 0); + break; + + case TidyInteger: + add_assoc_long(return_value, opt_name, (long)opt_value); + break; + + case TidyBoolean: + add_assoc_bool(return_value, opt_name, (long)opt_value); + break; + } + } + + return; +} +/* }}} */ + +/* {{{ proto int tidy_get_status() + Get status of specfied document. */ +PHP_FUNCTION(tidy_get_status) +{ + TIDY_FETCH_OBJECT; + + RETURN_LONG(tidyStatus(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto int tidy_get_html_ver() + Get the Detected HTML version for the specified document. */ +PHP_FUNCTION(tidy_get_html_ver) +{ + TIDY_FETCH_OBJECT; + + RETURN_LONG(tidyDetectedHtmlVersion(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto boolean tidy_is_xhtml() + Indicates if the document is a XHTML document. */ +PHP_FUNCTION(tidy_is_xhtml) +{ + TIDY_FETCH_OBJECT; + + RETURN_BOOL(tidyDetectedXhtml(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto boolean tidy_is_xhtml() + Indicates if the document is a generic (non HTML/XHTML) XML document. */ +PHP_FUNCTION(tidy_is_xml) +{ + TIDY_FETCH_OBJECT; + + RETURN_BOOL(tidyDetectedGenericXml(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto int tidy_error_count() + Returns the Number of Tidy errors encountered for specified document. */ +PHP_FUNCTION(tidy_error_count) +{ + TIDY_FETCH_OBJECT; + + RETURN_LONG(tidyErrorCount(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto int tidy_warning_count() + Returns the Number of Tidy warnings encountered for specified document. */ +PHP_FUNCTION(tidy_warning_count) +{ + TIDY_FETCH_OBJECT; + + RETURN_LONG(tidyWarningCount(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto int tidy_access_count() + Returns the Number of Tidy accessibility warnings encountered for specified document. */ +PHP_FUNCTION(tidy_access_count) +{ + TIDY_FETCH_OBJECT; + + RETURN_LONG(tidyAccessWarningCount(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto int tidy_config_count() + Returns the Number of Tidy configuration errors encountered for specified document. */ +PHP_FUNCTION(tidy_config_count) +{ + TIDY_FETCH_OBJECT; + + RETURN_LONG(tidyConfigErrorCount(obj->ptdoc->doc)); +} +/* }}} */ + +/* {{{ proto mixed tidy_getopt(string option) + Returns the value of the specified configuration option for the tidy document. */ +PHP_FUNCTION(tidy_getopt) +{ + PHPTidyObj *obj; + char *optname; + void *optval; + int optname_len; + TidyOption opt; + TidyOptionType optt; + + TIDY_SET_CONTEXT; + + if (object) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &optname, &optname_len) == FAILURE) { + RETURN_FALSE; + } + } else { + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, NULL, "Os", &object, tidy_ce_doc, &optname, &optname_len) == FAILURE) { + RETURN_FALSE; + } + } + + obj = (PHPTidyObj *) zend_object_store_get_object(object TSRMLS_CC); + + opt = tidyGetOptionByName(obj->ptdoc->doc, optname); + + if (!opt) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown Tidy Configuration Option '%s'", optname); + RETURN_FALSE; + } + + optval = php_tidy_get_opt_val(obj->ptdoc, opt, &optt TSRMLS_CC); + switch (optt) { + case TidyString: + RETURN_STRING((char *)optval, 0); + break; + + case TidyInteger: + RETURN_LONG((long)optval); + break; + + case TidyBoolean: + if (optval) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } + break; + + default: + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to determine type of configuration option"); + break; + } + + RETURN_FALSE; +} +/* }}} */ + +TIDY_DOC_METHOD(__construct) +{ + char *inputfile = NULL, *enc = NULL; + int input_len = 0, enc_len = 0; + zend_bool use_include_path = 0; + char *contents; + zval *options = NULL; + + PHPTidyObj *obj; + TIDY_SET_CONTEXT; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|szsb", &inputfile, &input_len, + &options, &enc, &enc_len, &use_include_path) == FAILURE) { + RETURN_FALSE; + } + + obj = (PHPTidyObj *)zend_object_store_get_object(object TSRMLS_CC); + + if (inputfile) { + if (!(contents = php_tidy_file_to_mem(inputfile, use_include_path TSRMLS_CC))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot Load '%s' into memory %s", inputfile, (use_include_path) ? "(Using include path)" : ""); + return; + } + + TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options); + + php_tidy_parse_string(obj, contents, enc TSRMLS_CC); + + efree(contents); + } +} + +TIDY_DOC_METHOD(parseFile) +{ + char *inputfile, *enc = NULL; + int input_len, enc_len = 0; + zend_bool use_include_path = 0; + char *contents; + zval *options = NULL; + PHPTidyObj *obj; + + TIDY_SET_CONTEXT; + + obj = (PHPTidyObj *)zend_object_store_get_object(object TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zsb", &inputfile, &input_len, + &options, &enc, &enc_len, &use_include_path) == FAILURE) { + RETURN_FALSE; + } + + if (!(contents = php_tidy_file_to_mem(inputfile, use_include_path TSRMLS_CC))) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot Load '%s' into memory %s", inputfile, (use_include_path) ? "(Using include path)" : ""); + RETURN_FALSE; + } + + TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options); + + if(php_tidy_parse_string(obj, contents, enc TSRMLS_CC) == FAILURE) { + RETVAL_FALSE; + } else { + RETVAL_TRUE; + } + + efree(contents); +} + +TIDY_DOC_METHOD(parseString) +{ + char *input, *enc = NULL; + int input_len, enc_len = 0; + zval *options = NULL; + PHPTidyObj *obj; + + TIDY_SET_CONTEXT; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|zs", &input, &input_len, &options, &enc, &enc_len) == FAILURE) { + RETURN_FALSE; + } + + obj = (PHPTidyObj *)zend_object_store_get_object(object TSRMLS_CC); + + TIDY_APPLY_CONFIG_ZVAL(obj->ptdoc->doc, options); + + if(php_tidy_parse_string(obj, input, enc TSRMLS_CC) == SUCCESS) { + RETURN_TRUE; + } + + RETURN_FALSE; +} + + +/* {{{ proto TidyNode tidy_get_root() + Returns a TidyNode Object representing the root of the tidy parse tree */ +PHP_FUNCTION(tidy_get_root) +{ + TIDY_SET_CONTEXT; + php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_root_node); +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_html() + Returns a TidyNode Object starting from the <HTML> tag of the tidy parse tree */ +PHP_FUNCTION(tidy_get_html) +{ + TIDY_SET_CONTEXT; + php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_html_node); +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_head() + Returns a TidyNode Object starting from the <HEAD> tag of the tidy parse tree */ +PHP_FUNCTION(tidy_get_head) +{ + TIDY_SET_CONTEXT; + php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_head_node); +} +/* }}} */ + +/* {{{ proto TidyNode tidy_get_body(resource tidy) + Returns a TidyNode Object starting from the <BODY> tag of the tidy parse tree */ +PHP_FUNCTION(tidy_get_body) +{ + TIDY_SET_CONTEXT; + php_tidy_create_node(INTERNAL_FUNCTION_PARAM_PASSTHRU, is_body_node); +} +/* }}} */ + +/* {{{ proto tidyNode::tidyNode() + Constructor. */ +TIDY_NODE_METHOD(__construct) +{ +} +/* }}} */ + +/* {{{ proto boolean tidyNode::hasChildren() + Returns true if this node has children */ +TIDY_NODE_METHOD(hasChildren) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyGetChild(obj->node)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::hasSiblings() + Returns true if this node has siblings */ +TIDY_NODE_METHOD(hasSiblings) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyGetNext(obj->node)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isComment() + Returns true if this node represents a comment */ +TIDY_NODE_METHOD(isComment) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyNodeGetType(obj->node) == TidyNode_Comment) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isHtml() + Returns true if this node is part of a HTML document */ +TIDY_NODE_METHOD(isHtml) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyNodeGetType(obj->node) & (TidyNode_Start | TidyNode_End | TidyNode_StartEnd)) { + RETURN_TRUE; + } + + RETURN_FALSE; +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isXhtml() + Returns true if this node is part of a XHTML document */ +TIDY_NODE_METHOD(isXhtml) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyDetectedXhtml(obj->ptdoc->doc)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isXml() + Returns true if this node is part of a XML document */ +TIDY_NODE_METHOD(isXml) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyDetectedGenericXml(obj->ptdoc->doc)) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isText() + Returns true if this node represents text (no markup) */ +TIDY_NODE_METHOD(isText) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyNodeGetType(obj->node) == TidyNode_Text) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isJste() + Returns true if this node is JSTE */ +TIDY_NODE_METHOD(isJste) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyNodeGetType(obj->node) == TidyNode_Jste) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isAsp() + Returns true if this node is ASP */ +TIDY_NODE_METHOD(isAsp) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyNodeGetType(obj->node) == TidyNode_Asp) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +/* {{{ proto boolean tidyNode::isPhp() + Returns true if this node is PHP */ +TIDY_NODE_METHOD(isPhp) +{ + TIDY_FETCH_ONLY_OBJECT; + + if (tidyNodeGetType(obj->node) == TidyNode_Php) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + +static void _php_tidy_register_nodetypes(INIT_FUNC_ARGS) +{ + TIDY_NODE_CONST(ROOT, Root); + TIDY_NODE_CONST(DOCTYPE, DocType); + TIDY_NODE_CONST(COMMENT, Comment); + TIDY_NODE_CONST(PROCINS, ProcIns); + TIDY_NODE_CONST(TEXT, Text); + TIDY_NODE_CONST(START, Start); + TIDY_NODE_CONST(END, End); + TIDY_NODE_CONST(STARTEND, StartEnd); + TIDY_NODE_CONST(CDATA, CDATA); + TIDY_NODE_CONST(SECTION, Section); + TIDY_NODE_CONST(ASP, Asp); + TIDY_NODE_CONST(JSTE, Jste); + TIDY_NODE_CONST(PHP, Php); + TIDY_NODE_CONST(XMLDECL, XmlDecl); +} + +static void _php_tidy_register_tags(INIT_FUNC_ARGS) +{ + TIDY_TAG_CONST(UNKNOWN); + TIDY_TAG_CONST(A); + TIDY_TAG_CONST(ABBR); + TIDY_TAG_CONST(ACRONYM); + TIDY_TAG_CONST(ADDRESS); + TIDY_TAG_CONST(ALIGN); + TIDY_TAG_CONST(APPLET); + TIDY_TAG_CONST(AREA); + TIDY_TAG_CONST(B); + TIDY_TAG_CONST(BASE); + TIDY_TAG_CONST(BASEFONT); + TIDY_TAG_CONST(BDO); + TIDY_TAG_CONST(BGSOUND); + TIDY_TAG_CONST(BIG); + TIDY_TAG_CONST(BLINK); + TIDY_TAG_CONST(BLOCKQUOTE); + TIDY_TAG_CONST(BODY); + TIDY_TAG_CONST(BR); + TIDY_TAG_CONST(BUTTON); + TIDY_TAG_CONST(CAPTION); + TIDY_TAG_CONST(CENTER); + TIDY_TAG_CONST(CITE); + TIDY_TAG_CONST(CODE); + TIDY_TAG_CONST(COL); + TIDY_TAG_CONST(COLGROUP); + TIDY_TAG_CONST(COMMENT); + TIDY_TAG_CONST(DD); + TIDY_TAG_CONST(DEL); + TIDY_TAG_CONST(DFN); + TIDY_TAG_CONST(DIR); + TIDY_TAG_CONST(DIV); + TIDY_TAG_CONST(DL); + TIDY_TAG_CONST(DT); + TIDY_TAG_CONST(EM); + TIDY_TAG_CONST(EMBED); + TIDY_TAG_CONST(FIELDSET); + TIDY_TAG_CONST(FONT); + TIDY_TAG_CONST(FORM); + TIDY_TAG_CONST(FRAME); + TIDY_TAG_CONST(FRAMESET); + TIDY_TAG_CONST(H1); + TIDY_TAG_CONST(H2); + TIDY_TAG_CONST(H3); + TIDY_TAG_CONST(H4); + TIDY_TAG_CONST(H5); + TIDY_TAG_CONST(H6); + TIDY_TAG_CONST(HEAD); + TIDY_TAG_CONST(HR); + TIDY_TAG_CONST(HTML); + TIDY_TAG_CONST(I); + TIDY_TAG_CONST(IFRAME); + TIDY_TAG_CONST(ILAYER); + TIDY_TAG_CONST(IMG); + TIDY_TAG_CONST(INPUT); + TIDY_TAG_CONST(INS); + TIDY_TAG_CONST(ISINDEX); + TIDY_TAG_CONST(KBD); + TIDY_TAG_CONST(KEYGEN); + TIDY_TAG_CONST(LABEL); + TIDY_TAG_CONST(LAYER); + TIDY_TAG_CONST(LEGEND); + TIDY_TAG_CONST(LI); + TIDY_TAG_CONST(LINK); + TIDY_TAG_CONST(LISTING); + TIDY_TAG_CONST(MAP); + TIDY_TAG_CONST(MARQUEE); + TIDY_TAG_CONST(MENU); + TIDY_TAG_CONST(META); + TIDY_TAG_CONST(MULTICOL); + TIDY_TAG_CONST(NOBR); + TIDY_TAG_CONST(NOEMBED); + TIDY_TAG_CONST(NOFRAMES); + TIDY_TAG_CONST(NOLAYER); + TIDY_TAG_CONST(NOSAVE); + TIDY_TAG_CONST(NOSCRIPT); + TIDY_TAG_CONST(OBJECT); + TIDY_TAG_CONST(OL); + TIDY_TAG_CONST(OPTGROUP); + TIDY_TAG_CONST(OPTION); + TIDY_TAG_CONST(P); + TIDY_TAG_CONST(PARAM); + TIDY_TAG_CONST(PLAINTEXT); + TIDY_TAG_CONST(PRE); + TIDY_TAG_CONST(Q); + TIDY_TAG_CONST(RB); + TIDY_TAG_CONST(RBC); + TIDY_TAG_CONST(RP); + TIDY_TAG_CONST(RT); + TIDY_TAG_CONST(RTC); + TIDY_TAG_CONST(RUBY); + TIDY_TAG_CONST(S); + TIDY_TAG_CONST(SAMP); + TIDY_TAG_CONST(SCRIPT); + TIDY_TAG_CONST(SELECT); + TIDY_TAG_CONST(SERVER); + TIDY_TAG_CONST(SERVLET); + TIDY_TAG_CONST(SMALL); + TIDY_TAG_CONST(SPACER); + TIDY_TAG_CONST(SPAN); + TIDY_TAG_CONST(STRIKE); + TIDY_TAG_CONST(STRONG); + TIDY_TAG_CONST(STYLE); + TIDY_TAG_CONST(SUB); + TIDY_TAG_CONST(SUP); + TIDY_TAG_CONST(TABLE); + TIDY_TAG_CONST(TBODY); + TIDY_TAG_CONST(TD); + TIDY_TAG_CONST(TEXTAREA); + TIDY_TAG_CONST(TFOOT); + TIDY_TAG_CONST(TH); + TIDY_TAG_CONST(THEAD); + TIDY_TAG_CONST(TITLE); + TIDY_TAG_CONST(TR); + TIDY_TAG_CONST(TT); + TIDY_TAG_CONST(U); + TIDY_TAG_CONST(UL); + TIDY_TAG_CONST(VAR); + TIDY_TAG_CONST(WBR); + TIDY_TAG_CONST(XMP); +} + +#endif + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/ext/tidy/tidy.dsp b/ext/tidy/tidy.dsp new file mode 100755 index 000000000..fe44fa7a5 --- /dev/null +++ b/ext/tidy/tidy.dsp @@ -0,0 +1,108 @@ +# Microsoft Developer Studio Project File - Name="tidy" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=tidy - Win32 Debug_TS
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "tidy.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "tidy.mak" CFG="tidy - Win32 Debug_TS"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "tidy - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "tidy - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "tidy - Win32 Release_TS"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release_TS"
+# PROP BASE Intermediate_Dir "Release_TS"
+# PROP BASE Ignore_Export_Lib 0
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release_TS"
+# PROP Intermediate_Dir "Release_TS"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TIDY_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\..\php_build\include" /I "..\..\..\php_build\include\libtidy" /D ZEND_DEBUG=0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "COMPILE_DL_TIDY" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D "PHP_TIDY_EXPORTS" /D "HAVE_ZLIB" /FR /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x407 /d "NDEBUG"
+# ADD RSC /l 0x407 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# ADD LINK32 php5ts.lib libtidy.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\Release_TS/php_tidy.dll" /libpath:"..\..\Release_TS" /libpath:"..\..\Release_TS_Inline" /libpath:"..\..\..\php_build\release"
+
+!ELSEIF "$(CFG)" == "tidy - Win32 Debug_TS"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug_TS"
+# PROP BASE Intermediate_Dir "Debug_TS"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug_TS"
+# PROP Intermediate_Dir "Debug_TS"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TIDY_EXPORTS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\TSRM" /I "..\..\..\php_build\include" /I "..\..\..\php_build\include\libtidy" /D ZEND_DEBUG=1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "COMPILE_DL_TIDY" /D ZTS=1 /D "ZEND_WIN32" /D "PHP_WIN32" /D "PHP_TIDY_EXPORTS" /D "HAVE_ZLIB" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x407 /d "_DEBUG"
+# ADD RSC /l 0x407 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 php5ts_debug.lib libtidy.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\Debug_TS/php_tidy.dll" /pdbtype:sept /libpath:"..\..\Debug_TS" /libpath:"..\..\..\php_build\release"
+
+!ENDIF
+
+# Begin Target
+
+# Name "tidy - Win32 Release_TS"
+# Name "tidy - Win32 Debug_TS"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\tidy.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\php_tidy.h
+# End Source File
+# End Group
+# End Target
+# End Project
|
