diff --git a/database/database.mysql b/database/database.mysql index b630c173465337d78365e24df488730a3cbc2fa8..2e91654f2ca5adf2f8e40c565811756183ed52ec 100644 --- a/database/database.mysql +++ b/database/database.mysql @@ -135,7 +135,6 @@ CREATE TABLE book ( nid int(10) unsigned NOT NULL default '0', parent int(10) NOT NULL default '0', weight tinyint(3) NOT NULL default '0', - format tinyint(2) default '0', log longtext, PRIMARY KEY (nid), KEY parent (parent) @@ -150,7 +149,7 @@ CREATE TABLE boxes ( title varchar(64) NOT NULL default '', body longtext, info varchar(128) NOT NULL default '', - type tinyint(2) NOT NULL default '0', + format int(4) NOT NULL default '0', PRIMARY KEY (bid), UNIQUE KEY title (title), UNIQUE KEY info (info) @@ -184,6 +183,7 @@ CREATE TABLE comments ( timestamp int(11) NOT NULL default '0', score mediumint(9) NOT NULL default '0', status tinyint(3) unsigned NOT NULL default '0', + format int(4) NOT NULL default '0', thread varchar(255) NOT NULL, users longtext, name varchar(60) default NULL, @@ -207,14 +207,28 @@ CREATE TABLE directory ( PRIMARY KEY (link) ) TYPE=MyISAM; +-- +-- Table structure for table 'filter_formats' +-- + +CREATE TABLE filter_formats ( + format int(4) NOT NULL default '0' auto_increment, + name varchar(255) NOT NULL default '', + roles varchar(255) NOT NULL default '', + cache tinyint(2) NOT NULL default '0', + PRIMARY KEY format (format) +) TYPE=MyISAM; + -- -- Table structure for table 'filters' -- CREATE TABLE filters ( + format int(4) NOT NULL default '0', module varchar(64) NOT NULL default '', + delta tinyint(2) DEFAULT '0' NOT NULL, weight tinyint(2) DEFAULT '0' NOT NULL, - KEY module (module) + INDEX (weight) ) TYPE=MyISAM; -- @@ -330,6 +344,7 @@ CREATE TABLE node ( body longtext NOT NULL, revisions longtext NOT NULL, sticky int(2) NOT NULL default '0', + format int(4) NOT NULL default '0', PRIMARY KEY (nid), KEY node_type (type(4)), KEY node_title_type (title,type(4)), @@ -362,7 +377,6 @@ CREATE TABLE node_access ( CREATE TABLE page ( nid int(10) unsigned NOT NULL default '0', link varchar(128) NOT NULL default '', - format tinyint(2) NOT NULL default '0', description varchar(128) NOT NULL default '', PRIMARY KEY (nid) ) TYPE=MyISAM; @@ -700,3 +714,12 @@ REPLACE blocks SET module = 'user', delta = '1', status = '1'; INSERT INTO sequences (name, id) VALUES ('menu_mid', 1); INSERT INTO node_access VALUES (0, 0, 'all', 1, 0, 0); + +INSERT INTO filter_formats VALUES (1,'Filtered HTML',',1,2,',1); +INSERT INTO filter_formats VALUES (2,'PHP code','',0); +INSERT INTO filter_formats VALUES (3,'Full HTML','',1); +INSERT INTO filters VALUES (1,'filter',0,0); +INSERT INTO filters VALUES (1,'filter',3,1); +INSERT INTO filters VALUES (2,'filter',1,0); +INSERT INTO filters VALUES (3,'filter',3,0); +INSERT INTO variable (name,value) VALUES ('filter_html_1','i:1;'); diff --git a/database/database.pgsql b/database/database.pgsql index 289a2e2752409b42a83a97dc6dc34437f8e9aff5..669889f7f804bcbe4bbc52acce1950e3b4cf4499 100644 --- a/database/database.pgsql +++ b/database/database.pgsql @@ -694,6 +694,16 @@ INSERT INTO permission VALUES (2,'access comments, access content, post comments INSERT INTO blocks(module,delta,status) VALUES('user', '0', '1'); INSERT INTO blocks(module,delta,status) VALUES('user', '1', '1'); +INSERT INTO filter_formats VALUES (1,'Filtered HTML',',1,2,',1); +INSERT INTO filter_formats VALUES (2,'PHP code','',0); +INSERT INTO filter_formats VALUES (3,'Full HTML','',1)); +INSERT INTO filters VALUES (1,'filter',0,0); +INSERT INTO filters VALUES (1,'filter',3,1); +INSERT INTO filters VALUES (2,'filter',1,0); +INSERT INTO filters VALUES (3,'filter',3,0); +INSERT INTO variable (name,value) VALUES ('filter_html_1','i:1;'); + + --- --- Functions --- diff --git a/database/updates.inc b/database/updates.inc index e2faae044e75ba90137e371694b0b61a0ac33981..be5a59b810c9a70664b7ea4208693bb3de8951f7 100644 --- a/database/updates.inc +++ b/database/updates.inc @@ -69,7 +69,8 @@ "2004-07-30" => "update_95", "2004-08-04" => "update_96", "2004-08-06" => "update_97", - "2004-08-07" => "update_98" + "2004-08-07" => "update_98", + "2004-08-09" => "update_99" ); function update_32() { @@ -1308,6 +1309,159 @@ function update_98() { return array(); } +function update_99() { + // Filter patch - Multiple input formats + $ret = array(); + + /* + ** Load the list of PHP book and page nodes. + */ + $php_nodes = array(); + $res = db_query("SELECT nid FROM {book} WHERE format = 1"); + while ($book = db_fetch_object($res)) { + $php_nodes[] = $book->nid; + } + $res = db_query("SELECT nid FROM {page} WHERE format = 1"); + while ($page = db_fetch_object($res)) { + $php_nodes[] = $page->nid; + } + + /* + ** Apply database changes + */ + if ($GLOBALS['db_type'] == 'mysql') { + // Filters table + $ret[] = update_sql("ALTER TABLE {filters} ADD format int(4) NOT NULL default '0'"); + $ret[] = update_sql("ALTER TABLE {filters} ADD delta tinyint(2) NOT NULL default '0'"); + + // Filter_formats table + $ret[] = update_sql("CREATE TABLE {filter_formats} ( + format int(4) NOT NULL auto_increment, + name varchar(255) NOT NULL default '', + roles varchar(255) NOT NULL default '', + cache tinyint(2) NOT NULL default '1', + PRIMARY KEY (format) + )"); + + // Store formats in nodes, comments and boxes + $ret[] = update_sql("ALTER TABLE {boxes} CHANGE type format int(4) NOT NULL default '0'"); + $ret[] = update_sql("ALTER TABLE {comments} ADD format int(4) NOT NULL default '0'"); + $ret[] = update_sql("ALTER TABLE {node} ADD format int(4) NOT NULL default '0'"); + + // Get rid of the old book/page type info + $ret[] = update_sql("ALTER TABLE {book} DROP format"); + $ret[] = update_sql("ALTER TABLE {page} DROP format"); + } + else if ($GLOBALS['db_type'] == 'pgsql') { + // TODO: add pgsql equivalent. Whoever does this should pay attention that + // the keys/indices for the 'filters' table are correct. There was some + // inconsistency between the MySQL and PGSQL version before. + } + + // Initialize all nodes and comments to the legacy format (see below) + $ret[] = update_sql("UPDATE {node} SET format = 1"); + $ret[] = update_sql("UPDATE {comments} SET format = 1"); + + // Set format to PHP for the old PHP book/page nodes. + if (count($php_nodes)) { + $ret[] = update_sql("UPDATE {node} SET format = 2 WHERE nid IN (". implode(',', $php_nodes) .")"); + } + + // Boxes now use the filtering system as well. + // Type 0 (HTML) maps to Format 3 (Full HTML). + // Type 1 (PHP) maps to Format 2 (PHP). + $ret[] = update_sql("UPDATE {boxes} SET format = 3 - format"); + + /* + ** Update PHP content to use tags. + */ + if ($GLOBALS['db_type'] == 'mysql') { + $ret[] = update_sql("UPDATE {node} SET teaser = CONCAT('rid; + } + $ret[] = update_sql("INSERT INTO {filter_formats} VALUES (2,'PHP code','". implode(',', $php_roles) .",',0)"); + + // This is a 'Full HTML' format which allows all HTML without restrictions. + $ret[] = update_sql("INSERT INTO {filter_formats} VALUES (3,'Full HTML','',1)"); + + // Set the default format to the legacy format + variable_set('filter_default_format', 1); + + // Put the old filters into the legacy format + $ret[] = update_sql("UPDATE {filters} SET format = 1"); + + // Add filter.module's standard filters (these used to be hardcoded). + if (!variable_get('rewrite_old_urls', 0)) { + $ret[] = update_sql("DELETE FROM {filters} WHERE module = 'filter'"); + } + else { + $ret[] = update_sql("UPDATE {filters} SET delta = 2 WHERE module ='filter'"); + } + if ($old_html_filter != 0) { + $ret[] = update_sql("INSERT INTO {filters} (format, module, delta, weight) VALUES (1,'filter',0,0)"); // HTML tag/style filter + } + $ret[] = update_sql("INSERT INTO {filters} (format, module, delta, weight) VALUES (1,'filter',3,1)"); // Linebreak filter + $ret[] = update_sql("INSERT INTO {filters} (format, module, delta, weight) VALUES (2,'filter',1,0)"); // PHP evaluator + $ret[] = update_sql("INSERT INTO {filters} (format, module, delta, weight) VALUES (3,'filter',3,0)"); // Linebreak filter + + // Migrate the settings for all core/contrib filtering modules into the legacy + // format. + $migrate = array('filter_html', // filter.module + 'allowed_html', + 'filter_style', + 'anyfilter_regexps', // anyfilter.module + 'htmlcorrector_smartclose', // htmlcorrector.module + 'htmlcorrector_xhtmlify', + 'htmlcorrector_valueentities', + 'project_filter', // project.module + 'latex_filter_link' // latex.module + ); + + foreach ($migrate as $variable) { + $value = variable_get($variable, NULL); + if ($value != NULL) { + variable_set($variable .'_1', $value); + variable_del($variable); + } + } + + return $ret; +} + + function update_sql($sql) { $edit = $_POST["edit"]; $result = db_query($sql); diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 8241fc41ffc57ea031c8b4d1b74a540f6fe704a3..0d1fb156219f8b6acb5f1a637e6b451cb04ffb1b 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -133,13 +133,22 @@ function cache_set($cid, $data, $expire = 0, $headers = NULL) { * @param $cid * If set, the cache ID to delete. Otherwise, all cache entries that can expire * are deleted. + * + * @param $wildcard + * If set to true, the $cid is treated as a substring to match rather than a + * complete ID. */ -function cache_clear_all($cid = NULL) { +function cache_clear_all($cid = NULL, $wildcard = false) { if (empty($cid)) { db_query("DELETE FROM {cache} WHERE expire <> 0"); } else { - db_query("DELETE FROM {cache} WHERE cid = '%s'", $cid); + if ($wildcard) { + db_query("DELETE FROM {cache} WHERE cid LIKE '%%%s%%'", $cid); + } + else { + db_query("DELETE FROM {cache} WHERE cid = '%s'", $cid); + } } } diff --git a/includes/common.inc b/includes/common.inc index feab010d24ebf9a50b5a2e6d6f72520c4e755cf7..209769c8fd42b96d62eff6e19c5691168207e203 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -813,7 +813,7 @@ function format_rss_item($title, $link, $description, $args = array()) { $output = "\n"; $output .= ' '. drupal_specialchars(strip_tags($title)) ."\n"; $output .= ' '. drupal_specialchars(strip_tags($link)) ."\n"; - $output .= ' '. drupal_specialchars(check_output($description)) ."\n"; + $output .= ' '. drupal_specialchars($description) ."\n"; foreach ($args as $key => $value) { $output .= ' <'. $key .'>'. drupal_specialchars(strip_tags($value)) ."\n"; } @@ -1770,6 +1770,20 @@ function truncate_utf8($string, $len) { return substr($string, 0, $len); } +/** + * Wrapper around PHP's eval(). Uses output buffering to capture both returned + * and printed text. Unlike eval(), we require code to be surrounded by + * tags (in other words, we evaluate the code as if it were a stand-alone PHP + * file). + * + * @param $code The code to evaluate + */ +function drupal_eval($code) { + ob_start(); + print eval('?>'. $code); + return ob_get_clean(); +} + include_once 'includes/theme.inc'; include_once 'includes/pager.inc'; include_once 'includes/menu.inc'; diff --git a/misc/drupal.css b/misc/drupal.css index 4ca9f0c359ea8057068d8187d09fa45d580952da..548b122bbd9c12ee2fceeac7ae038aa746d3d973 100644 --- a/misc/drupal.css +++ b/misc/drupal.css @@ -319,6 +319,13 @@ tr.light .form-item, tr.dark .form-item { margin: 0; font-size: 0.8em; } +.tips { + margin-top: 0px; + margin-bottom: 0px; + padding-top: 0px; + padding-bottom: 0px; + font-size: 0.9em; +} #forum .description { font-size: 0.9em; margin: 0.5em; diff --git a/modules/aggregator.module b/modules/aggregator.module index 6a2d53540603ea2808326e8856574540aa80c28b..7d68ddccbaee64ce4ec3f09c41c56fdd67752f3e 100644 --- a/modules/aggregator.module +++ b/modules/aggregator.module @@ -470,7 +470,12 @@ function aggregator_parse_feed(&$data, $feed) { // Prepare the item: foreach ($item as $key => $value) { - $item[$key] = filter_default(strtr(trim($value), $tt)); + // TODO: Make handling of aggregated HTML more flexible/configurable. + $value = strtr(trim($value), $tt); + $value = strip_tags($value, '