john Tue Jan 6 13:24:18 2004 EDT
Added files:
/php-src/ext/tidy/tests 014.phpt 015.html 015.phpt
Modified files:
/php-src/ext/tidy php_tidy.h tidy.c
Log:
Added an optional array parameter to tidy_parse_file/string to
fix a bug. Apparently some libtidy config options must be set
prior to parsing in order to work properly.
Index: php-src/ext/tidy/php_tidy.h
diff -u php-src/ext/tidy/php_tidy.h:1.13 php-src/ext/tidy/php_tidy.h:1.14
--- php-src/ext/tidy/php_tidy.h:1.13 Thu Dec 18 14:59:58 2003
+++ php-src/ext/tidy/php_tidy.h Tue Jan 6 13:24:17 2004
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_tidy.h,v 1.13 2003/12/18 19:59:58 sniper Exp $ */
+/* $Id: php_tidy.h,v 1.14 2004/01/06 18:24:17 john Exp $ */
#ifndef PHP_TIDY_H
#define PHP_TIDY_H
@@ -213,6 +213,8 @@
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 *);
+static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options);
void _php_tidy_register_nodetypes(INIT_FUNC_ARGS);
void _php_tidy_register_tags(INIT_FUNC_ARGS);
Index: php-src/ext/tidy/tidy.c
diff -u php-src/ext/tidy/tidy.c:1.27 php-src/ext/tidy/tidy.c:1.28
--- php-src/ext/tidy/tidy.c:1.27 Tue Dec 23 15:12:55 2003
+++ php-src/ext/tidy/tidy.c Tue Jan 6 13:24:17 2004
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: tidy.c,v 1.27 2003/12/23 20:12:55 wez Exp $ */
+/* $Id: tidy.c,v 1.28 2004/01/06 18:24:17 john Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -32,8 +32,9 @@
#include "Zend/zend_API.h"
#include "Zend/zend_hash.h"
#include "safe_mode.h"
-#include "zend_default_classes.h"
-#include "zend_object_handlers.h"
+#include "Zend/zend_default_classes.h"
+#include "Zend/zend_object_handlers.h"
+#include "Zend/zend_hash.h"
ZEND_DECLARE_MODULE_GLOBALS(tidy)
@@ -178,6 +179,52 @@
zend_error(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)
+{
+ TidyOption opt;
+
+ opt = tidyGetOptionByName(doc, optname);
+
+ if (!opt) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown Tidy
Configuration Option '%s'", optname);
+ return FAILURE;
+ }
+
+ if (tidyOptIsReadOnly(opt)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attempted to set
read-only option '%s'", optname);
+ return FAILURE;
+ }
+
+ switch(tidyOptGetType(opt)) {
+ case TidyString:
+ convert_to_string_ex(&value);
+ if (tidyOptSetValue(doc, tidyOptGetId(opt),
Z_STRVAL_P(value))) {
+ return SUCCESS;
+ }
+ break;
+
+ case TidyInteger:
+ convert_to_long_ex(&value);
+ if (tidyOptSetInt(doc, tidyOptGetId(opt), Z_LVAL_P(value))) {
+ return SUCCESS;
+ }
+ break;
+
+ case TidyBoolean:
+ convert_to_long_ex(&value);
+ if (tidyOptSetBool(doc, tidyOptGetId(opt), Z_LVAL_P(value))) {
+ return SUCCESS;
+ }
+ break;
+
+ default:
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to
determine type of Tidy configuration constant to set");
+ break;
+ }
+
+ return FAILURE;
+}
+
static void php_tidy_quick_repair(INTERNAL_FUNCTION_PARAMETERS, zend_bool is_file)
{
char *data=NULL, *cfg_file=NULL, *arg1;
@@ -478,10 +525,6 @@
{
}
-static void tidy_globals_dtor(zend_tidy_globals *g TSRMLS_DC)
-{
-}
-
static void tidy_add_default_properties(PHPTidyObj *obj, tidy_obj_type type TSRMLS_DC)
{
@@ -640,19 +683,41 @@
tidy_add_default_properties(newobj, is_node TSRMLS_CC);
}
+static int _php_tidy_apply_config_array(TidyDoc doc, HashTable *ht_options)
+{
+ char *opt_name;
+ 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_WARNING, "Could not
retrieve key from array");
+ }
+
+ _php_tidy_set_tidy_opt(doc, opt_name, *opt_val);
+
+ }
+
+ return SUCCESS;
+}
+
static void php_tidy_parse_file(INTERNAL_FUNCTION_PARAMETERS)
{
char *inputfile;
int input_len;
zend_bool use_include_path = 0;
char *contents;
-
+ zval *options = NULL;
+
zend_bool is_object = FALSE;
zval *object = getThis();
PHPTidyObj *obj;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &inputfile,
&input_len, &use_include_path) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ab", &inputfile,
&input_len, &options, &use_include_path) == FAILURE) {
RETURN_FALSE;
}
@@ -673,6 +738,10 @@
RETURN_FALSE;
}
+ if(options) {
+ _php_tidy_apply_config_array(obj->ptdoc->doc, HASH_OF(options));
+ }
+
if (tidyParseString(obj->ptdoc->doc, contents) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s",
obj->ptdoc->errbuf->bp);
RETVAL_FALSE;
@@ -739,7 +808,7 @@
php_info_print_table_start();
php_info_print_table_header(2, "Tidy support", "enabled");
php_info_print_table_row(2, "libTidy Library Version", (char
*)tidyReleaseDate());
- php_info_print_table_row(2, "Extension Version", PHP_TIDY_MODULE_VERSION "
($Id: tidy.c,v 1.27 2003/12/23 20:12:55 wez Exp $)");
+ php_info_print_table_row(2, "Extension Version", PHP_TIDY_MODULE_VERSION "
($Id: tidy.c,v 1.28 2004/01/06 18:24:17 john Exp $)");
php_info_print_table_end();
DISPLAY_INI_ENTRIES();
@@ -803,13 +872,14 @@
{
char *input;
int input_len;
-
+ zval *options = NULL;
+
zend_bool is_object = FALSE;
zval *object = getThis();
PHPTidyObj *obj;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &input, &input_len)
== FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|a", &input,
&input_len, &options) == FAILURE) {
RETURN_FALSE;
}
@@ -826,6 +896,10 @@
obj = (PHPTidyObj *) zend_object_store_get_object(return_value
TSRMLS_CC);
}
+ if(options) {
+ _php_tidy_apply_config_array(obj->ptdoc->doc, HASH_OF(options));
+ }
+
if (tidyParseString(obj->ptdoc->doc, input) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s",
obj->ptdoc->errbuf->bp);
return;
@@ -866,7 +940,7 @@
}
/* }}} */
-/* {{{ proto boolean tidy_parse_file(string file [, bool use_include_path])
+/* {{{ proto boolean tidy_parse_file(string file [, array config_options [, bool
use_include_path]])
Parse markup in file or URI */
PHP_FUNCTION(tidy_parse_file)
{
@@ -1237,7 +1311,6 @@
zval *value;
char *optname;
int optname_len;
- TidyOption opt;
if (object) {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &optname,
&optname_len, &value) == FAILURE) {
@@ -1251,45 +1324,10 @@
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;
- }
-
- if (tidyOptIsReadOnly(opt)) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Attempted to set
read-only option '%s'", optname);
- RETURN_FALSE;
- }
-
- switch(tidyOptGetType(opt)) {
- case TidyString:
- convert_to_string_ex(&value);
- if (tidyOptSetValue(obj->ptdoc->doc, tidyOptGetId(opt),
Z_STRVAL_P(value))) {
- RETURN_TRUE;
- }
- break;
-
- case TidyInteger:
- convert_to_long_ex(&value);
- if (tidyOptSetInt(obj->ptdoc->doc, tidyOptGetId(opt),
Z_LVAL_P(value))) {
- RETURN_TRUE;
- }
- break;
-
- case TidyBoolean:
- convert_to_long_ex(&value);
- if (tidyOptSetBool(obj->ptdoc->doc, tidyOptGetId(opt),
Z_LVAL_P(value))) {
- RETURN_TRUE;
- }
- break;
-
- default:
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to
determine type of Tidy configuration constant to set");
- break;
+ if(_php_tidy_set_tidy_opt(obj->ptdoc->doc, optname, value) == SUCCESS) {
+ RETURN_TRUE;
}
-
+
RETURN_FALSE;
}
/* }}} */
Index: php-src/ext/tidy/tests/014.phpt
+++ php-src/ext/tidy/tests/014.phpt
--TEST--
Passing configuration options through tidy_parse_string().
--SKIPIF--
<?php if (!extension_loaded("tidy")) print "skip"; ?>
--POST--
--GET--
--INI--
--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>
Index: php-src/ext/tidy/tests/015.html
+++ php-src/ext/tidy/tests/015.html
<B>testing</I>
Index: php-src/ext/tidy/tests/015.phpt
+++ php-src/ext/tidy/tests/015.phpt
--TEST--
Passing configuration options through tidy_parse_file().
--SKIPIF--
<?php if (!extension_loaded("tidy")) print "skip"; ?>
--POST--
--GET--
--INI--
--FILE--
<?php
$tidy = tidy_parse_file("ext/tidy/tests/015.html",
array('show-body-only'=>true));
tidy_clean_repair($tidy);
echo tidy_get_output($tidy);
?>
--EXPECT--
<b>testing</b>
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php