summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LibertyAttachable.php10
-rw-r--r--LibertyContent.php209
-rwxr-xr-xLibertyStructure.php4
-rwxr-xr-xLibertySystem.php34
-rw-r--r--admin/admin_liberty_inc.php5
-rw-r--r--edit_structure_inc.php42
-rw-r--r--get_content_list_inc.php16
-rw-r--r--icons/security.pngbin0 -> 729 bytes
-rw-r--r--lookup_content_inc.php11
-rw-r--r--modules/help_mod_last_changes.tpl2
-rw-r--r--modules/mod_last_changes.php11
-rw-r--r--plugins/data.addtabs.php7
-rw-r--r--plugins/data.agentinfo.php6
-rw-r--r--plugins/data.dropdown.php4
-rw-r--r--plugins/data.flash.php6
-rw-r--r--plugins/data.freemind.php4
-rw-r--r--plugins/data.gauge.php8
-rw-r--r--plugins/data.include.php7
-rw-r--r--plugins/data.mapquest.php10
-rw-r--r--plugins/data.mqdirections.php8
-rw-r--r--plugins/data.sf.php12
-rw-r--r--plugins/data.spytext.php6
-rw-r--r--plugins/data.wikigraph.php125
-rw-r--r--plugins/format.markdown.php1443
-rw-r--r--templates/comments.tpl16
-rw-r--r--templates/edit_format.tpl3
-rw-r--r--templates/edit_help_inc.tpl6
-rw-r--r--templates/edit_structure.tpl4
-rw-r--r--templates/list_content_inc.tpl17
-rw-r--r--templates/services_inc.tpl4
30 files changed, 1881 insertions, 159 deletions
diff --git a/LibertyAttachable.php b/LibertyAttachable.php
index e2e75ce..226004d 100644
--- a/LibertyAttachable.php
+++ b/LibertyAttachable.php
@@ -3,7 +3,7 @@
* Management of Liberty Content
*
* @package liberty
- * @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertyAttachable.php,v 1.4 2005/08/11 13:03:45 squareing Exp $
+ * @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertyAttachable.php,v 1.5 2005/08/24 20:55:17 squareing Exp $
* @author spider <spider@steelsun.com>
*/
// +----------------------------------------------------------------------+
@@ -475,7 +475,13 @@ function liberty_clear_thumbnails( &$pFileHash ) {
function liberty_generate_thumbnails( &$pFileHash ) {
global $gBitSystem;
$resizeFunc = ($gBitSystem->getPreference( 'image_processor' ) == 'imagick' ) ? 'liberty_imagick_resize_image' : 'liberty_gd_resize_image';
- // Small thumb is 160x120
+ // Icon thumb is 48x48
+ $pFileHash['dest_base_name'] = 'icon';
+ $pFileHash['name'] = 'icon.jpg';
+ $pFileHash['max_width'] = 48;
+ $pFileHash['max_height'] = 48;
+ $pFileHash['small_thumb_path'] = BIT_ROOT_PATH.$resizeFunc( $pFileHash );
+ // Avatar thumb is 100x100
$pFileHash['dest_base_name'] = 'avatar';
$pFileHash['name'] = 'avatar.jpg';
$pFileHash['max_width'] = 100;
diff --git a/LibertyContent.php b/LibertyContent.php
index 5e84bcb..d7e398a 100644
--- a/LibertyContent.php
+++ b/LibertyContent.php
@@ -3,7 +3,7 @@
* Management of Liberty content
*
* @package liberty
-* @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertyContent.php,v 1.7 2005/08/11 13:03:45 squareing Exp $
+* @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertyContent.php,v 1.8 2005/08/24 20:55:17 squareing Exp $
* @author spider <spider@steelsun.com>
*/
@@ -94,7 +94,28 @@ class LibertyContent extends LibertyBase {
/**
* Verify the core class data required to update the tiki_content table entries
*
- * @param array Array of content data to be stored
+ * Verify will build an array [content_store] with all of the required values
+ * and populate it with the relevent data to create/update the tiki_content
+ * table record
+ *
+ * @param array Array of content data to be stored <br>
+ * [pParamHash] <br>
+ * content_id <br>
+ * user_id <br>
+ * modifier_user_id <br>
+ * created <br>
+ * last_modified <br>
+ * content_type_guid <br>
+ * format_guid <br>
+ * hits <br>
+ * language <br>
+ * title <br>
+ * ip <br>
+ * data <br>
+ * <br>
+ * @return integer Count of the number of errors ( 0 for success ) <br>
+ * [pParamHash] will be extended to include array [content_store] populated
+ * with the require values for LibertyContent::store()
*/
function verify( &$pParamHash ) {
global $gLibertySystem;
@@ -180,10 +201,10 @@ class LibertyContent extends LibertyBase {
/**
* Create a new content object or update an existing one
*
- * @param array Array of content data to be stored
+ * @param array Array of content data to be stored <br>
+ * See verify for details of the values required
*/
function store( &$pParamHash ) {
- global $gBitSystem;
global $gLibertySystem;
if( LibertyContent::verify( $pParamHash ) ) {
$this->mDb->StartTrans();
@@ -200,13 +221,7 @@ class LibertyContent extends LibertyBase {
$result = $this->mDb->associateUpdate( $table, $pParamHash['content_store'], $locId );
}
- // If a content access system is active, let's call it
- if( $gBitSystem->isPackageActive( 'gatekeeper' ) ) {
- global $gGatekeeper;
- if( !$gGatekeeper->storeSecurity( $pParamHash ) ) {
- $this->mErrors['security'] = $gGatekeeper->mErrors['security'];
- }
- }
+ $this->invokeServices( 'content_store_function', $pParamHash );
// Call the formatter's save
if( !empty( $pParamHash['edit'] ) ) {
@@ -287,7 +302,7 @@ class LibertyContent extends LibertyBase {
/**
* Create an export object from the data
*
- * @param array Not used
+ * @param array Not used
*/
function exportHtml( $pData = NULL ) {
$ret = NULL;
@@ -314,6 +329,59 @@ class LibertyContent extends LibertyBase {
return( $this->isValid() && !empty( $this->mInfo['user_id'] ) && $this->mInfo['user_id'] == $gBitUser->mUserId );
}
+
+ /**
+ * Check user_id to establish if the object that has been loaded was created by the current user
+ */
+ function isContentType( $pContentGuid ) {
+ global $gBitUser;
+ return( $this->isValid() && !empty( $this->mInfo['content_type_guid'] ) && $this->mInfo['content_type_guid'] == $pContentGuid );
+ }
+
+
+ function verifyAccessControl() {
+ $this->invokeServices( 'content_verify_access' );
+ }
+
+
+ function invokeServices( $pServiceFunction, $pParamHash=NULL ) {
+ global $gLibertySystem;
+ $errors = array();
+ // Invoke any services store functions such as categorization or access control
+ if( $serviceFunctions = $gLibertySystem->getServiceValues( $pServiceFunction ) ) {
+ foreach ( $serviceFunctions as $func ) {
+ if( function_exists( $func ) ) {
+ if( $errors = $func( $this, $pParamHash ) ) {
+ $this->mErrors = array_merge( $this->mErrors, $errors );
+ }
+ }
+ }
+ }
+ return $errors;
+ }
+
+
+ function getServicesSql( $pServiceFunction, &$pSelectSql, &$pJoinSql, &$pWhereSql, &$pBindVars ) {
+ global $gLibertySystem;
+ if( $loadFuncs = $gLibertySystem->getServiceValues( $pServiceFunction ) ) {
+ foreach( $loadFuncs as $func ) {
+ if( function_exists( $func ) ) {
+ $loadHash = $func();
+ if( !empty( $loadHash['select_sql'] ) ) {
+ $pSelectSql .= $loadHash['select_sql'];
+ }
+ if( !empty( $loadHash['join_sql'] ) ) {
+ $pJoinSql .= $loadHash['join_sql'];
+ }
+ if( !empty( $loadHash['where_sql'] ) ) {
+ $pWhereSql .= $loadHash['where_sql'];
+ }
+ }
+ }
+ }
+ }
+
+
/**
* Check permissions for the object that has been loaded against the permission database
*/
@@ -343,6 +411,7 @@ class LibertyContent extends LibertyBase {
global $gBitUser;
if( !$gBitUser->isRegistered() || !($ret = $this->isOwner()) ) {
if( !($ret = $gBitUser->isAdmin()) ) {
+ $this->verifyAccessControl();
if( $this->loadPermissions() ) {
$userPerms = $this->getUserPermissions( $gBitUser->mUserId );
$ret = isset( $userPerms[$pPermName]['user_id'] ) && ( $userPerms[$pPermName]['user_id'] == $gBitUser->mUserId );
@@ -376,7 +445,7 @@ class LibertyContent extends LibertyBase {
/**
* Store a permission for the object that has been loaded in the permission database
- *
+ *
* Any old copy of the permission is deleted prior to loading the new copy
* @param integer Group Identifier
* @param string Name of the permission
@@ -400,7 +469,7 @@ class LibertyContent extends LibertyBase {
/**
* Check is a user has permission to access the object
- *
+ *
* @param integer User Identifier
* @param integer Content Itentifier
* @param string Content Type GUID
@@ -425,7 +494,7 @@ class LibertyContent extends LibertyBase {
/**
* Remove a permission to access the object
- *
+ *
* @param integer Group Identifier
* @param string Name of the permission
* @return bool true ( will not currently report a failure )
@@ -442,7 +511,7 @@ class LibertyContent extends LibertyBase {
/**
* Copy current permissions to another object
- *
+ *
* @param integer Content Identifier of the target object
* @return bool true ( will not currently report a failure )
*/
@@ -461,12 +530,12 @@ class LibertyContent extends LibertyBase {
/**
* Copy current permissions to another object
- *
+ *
* @param string Content Type GUID
* @param array Array of content type data
* Populates the mType array with the following entries
* string content_type_guid
- * string
+ * string
*/
function registerContentType( $pContentGuid, $pTypeParams ) {
global $gLibertySystem;
@@ -478,7 +547,7 @@ class LibertyContent extends LibertyBase {
* Increment the content item hit flag by 1
*
* @return bool true ( will not currently report a failure )
- */
+ */
function addHit() {
global $gBitUser;
if( $this->mContentId && ($gBitUser->mUserId != $this->mInfo['user_id'] ) ) {
@@ -512,11 +581,11 @@ class LibertyContent extends LibertyBase {
/**
* Create the generic title for a content item
*
- * This will normally be overwriten by extended classes to provide
+ * This will normally be overwriten by extended classes to provide
* an appropriate title title string
* @param array mInfo type hash of data to be used to provide base data
* @return string Descriptive title for the object
- */
+ */
function getTitle( $pHash=NULL ) {
$ret = NULL;
if( empty( $pHash ) ) {
@@ -534,7 +603,7 @@ class LibertyContent extends LibertyBase {
* Access a content item type GUID
*
* @return string content_type_guid for the object
- */
+ */
function getContentType() {
$ret = NULL;
if( isset( $this->mInfo['content_type_guid'] ) ) {
@@ -544,10 +613,23 @@ class LibertyContent extends LibertyBase {
}
/**
+ * Access a content item type GUID
+ *
+ * @return string content_type_guid for the object
+ */
+ function getContentId() {
+ $ret = NULL;
+ if( isset( $this->mContentId ) ) {
+ $ret = $this->mContentId;
+ }
+ return $ret;
+ }
+
+ /**
* Return content type description for this content object.
*
* @return string content_type_guid description for the object
- */
+ */
function getContentDescription() {
$ret = NULL;
if( isset( $this->mInfo['content_type_guid'] ) ) {
@@ -666,19 +748,22 @@ class LibertyContent extends LibertyBase {
* @param integer User ID - If set, then only the objcets created by that user will be returned
* @return array An array of mInfo type arrays of content objects
**/
- function getContentList( $pContentGuid=NULL, $offset = 0, $maxRecords = -1, $sort_mode = 'title_desc', $find = NULL, $pUserId=NULL ) {
+ function getContentList( $pListHash ) {
global $gLibertySystem, $gBitSystem, $gBitUser, $gBitSmarty;
- if ($sort_mode == 'size_desc') {
- $sort_mode = 'page_size_desc';
+
+ $this->prepGetList( $pListHash );
+
+ if( $pListHash['sort_mode'] == 'size_desc' ) {
+ $pListHash['sort_mode'] = 'page_size_desc';
}
- if ($sort_mode == 'size_asc') {
- $sort_mode = 'page_size_asc';
+ if( $pListHash['sort_mode'] == 'size_asc' ) {
+ $pListHash['sort_mode'] = 'page_size_asc';
}
$old_sort_mode = '';
- if (in_array($sort_mode, array(
+ if (in_array($pListHash['sort_mode'], array(
'versions_desc',
'versions_asc',
'links_asc',
@@ -686,12 +771,12 @@ class LibertyContent extends LibertyBase {
'backlinks_asc',
'backlinks_desc'
))) {
- $old_offset = $offset;
- $old_maxRecords = $maxRecords;
- $old_sort_mode = $sort_mode;
- $sort_mode = 'modifier_user_desc';
- $offset = 0;
- $maxRecords = -1;
+ $old_offset = $pListHash['offset'];
+ $old_maxRecords = $pListHash['max_records'];
+ $old_sort_mode = $pListHash['sort_mode'];
+ $pListHash['sort_mode'] = 'modifier_user_desc';
+ $pListHash['offset'] = 0;
+ $pListHash['max_records'] = -1;
}
$bindVars = array();
@@ -699,25 +784,34 @@ class LibertyContent extends LibertyBase {
$gateSelect = '';
$gateFrom = '';
- if (is_array($find)) { // you can use an array of pages
- $mid = " AND tc.`title` IN (".implode(',',array_fill(0,count($find),'?')).")";
- $bindVars[] = $find;
- } elseif (!empty($find) && is_string($find)) { // or a string
+ if (is_array($pListHash['find'])) { // you can use an array of titles
+ $mid = " AND tc.`title` IN (".implode(',',array_fill(0,count($pListHash['find']),'?')).")";
+ $bindVars[] = $pListHash['find'];
+ } elseif (!empty($pListHash['find']) && is_string($pListHash['find'])) { // or a string
$mid = " AND UPPER(tc.`title`) like ? ";
- $bindVars[] = ('%' . strtoupper( $find ) . '%');
+ $bindVars[] = ('%' . strtoupper( $pListHash['find'] ) . '%');
+ }
+
+ // calendar specific selection method - use timestamps to limit selection
+ if( !empty( $pListHash['start'] ) && !empty( $pListHash['stop'] ) ) {
+ $mid .= " AND ( tc.`".$pListHash['calendar_sort_mode']."` > ? AND tc.`".$pListHash['calendar_sort_mode']."` < ? ) ";
+ $bindVars[] = $pListHash['start'];
+ $bindVars[] = $pListHash['stop'];
}
- if( !empty( $pUserId ) ) {
+ if( !empty( $pListHash['user_id'] ) ) {
$mid .= " AND tc.`user_id` = ? ";
- $bindVars[] = $pUserId;
+ $bindVars[] = $pListHash['user_id'];
}
- if( !empty( $pContentGuid ) ) {
+ if( !empty( $pListHash['content_type_guid'] ) && is_string( $pListHash['content_type_guid'] ) ) {
$mid .= ' AND `content_type_guid`=? ';
- $bindVars[] = $pContentGuid;
+ $bindVars[] = $pListHash['content_type_guid'];
+ } elseif( !empty( $pListHash['content_type_guid'] ) && is_array( $pListHash['content_type_guid'] ) ) {
+ $mid .= " AND tc.`content_type_guid` IN ( ".implode( ',',array_fill ( 0, count( $pListHash['content_type_guid'] ),'?' ) )." )";
+ $bindVars = array_merge( $bindVars, $pListHash['content_type_guid'] );
}
-
if( $gBitSystem->isPackageActive( 'gatekeeper' ) ) {
$gateSelect .= ' ,ts.`security_id`, ts.`security_description`, ts.`is_private`, ts.`is_hidden`, ts.`access_question`, ts.`access_answer` ';
$gateFrom .= " LEFT OUTER JOIN `".BIT_DB_PREFIX."tiki_content_security_map` tcs ON (tc.`content_id`=tcs.`content_id`) LEFT OUTER JOIN `".BIT_DB_PREFIX."tiki_security` ts ON (ts.`security_id`=tcs.`security_id` )";
@@ -736,7 +830,7 @@ class LibertyContent extends LibertyBase {
}
}
- if( in_array( $sort_mode, array(
+ if( in_array( $pListHash['sort_mode'], array(
'modifier_user_desc',
'modifier_user_asc',
'modifier_real_name_desc',
@@ -755,14 +849,14 @@ class LibertyContent extends LibertyBase {
// If sort mode is versions then offset is 0, maxRecords is -1 (again) and sort_mode is nil
// If sort mode is links then offset is 0, maxRecords is -1 (again) and sort_mode is nil
// If sort mode is backlinks then offset is 0, maxRecords is -1 (again) and sort_mode is nil
- $query = "SELECT uue.`login` AS `modifier_user`, uue.`real_name` AS `modifier_real_name`, uue.`user_id` AS `modifier_user_id`, uuc.`login` AS`creator_user`, uuc.`real_name` AS `creator_real_name`, uuc.`user_id` AS `creator_user_id`, `hits`, tc.`title`, tc.`last_modified`, tc.`content_type_guid`, `ip`, tc.`content_id` $gateSelect
+ $query = "SELECT uue.`login` AS `modifier_user`, uue.`real_name` AS `modifier_real_name`, uue.`user_id` AS `modifier_user_id`, uuc.`login` AS`creator_user`, uuc.`real_name` AS `creator_real_name`, uuc.`user_id` AS `creator_user_id`, `hits`, tc.`title`, tc.`last_modified`, tc.`content_type_guid`, `ip`, tc.`created`, tc.`content_id` $gateSelect
FROM `".BIT_DB_PREFIX."tiki_content` tc $gateFrom, `".BIT_DB_PREFIX."users_users` uue, `".BIT_DB_PREFIX."users_users` uuc
WHERE tc.`modifier_user_id`=uue.`user_id` AND tc.`user_id`=uuc.`user_id` $mid
- ORDER BY ".$orderTable.$this->mDb->convert_sortmode($sort_mode);
+ ORDER BY ".$orderTable.$this->mDb->convert_sortmode($pListHash['sort_mode']);
$query_cant = "select count(tc.`content_id`) FROM `".BIT_DB_PREFIX."tiki_content` tc $gateFrom, `".BIT_DB_PREFIX."users_users` uu WHERE uu.`user_id`=tc.`user_id` $mid";
// previous cant query - updated by xing
// $query_cant = "select count(*) from `".BIT_DB_PREFIX."tiki_pages` tp INNER JOIN `".BIT_DB_PREFIX."tiki_content` tc ON (tc.`content_id` = tp.`content_id`) $mid";
- $result = $this->mDb->query($query,$bindVars,$maxRecords,$offset);
+ $result = $this->mDb->query($query,$bindVars,$pListHash['max_records'],$pListHash['offset']);
$cant = $this->mDb->getOne($query_cant,$bindVars);
$ret = array();
$contentTypes = $gLibertySystem->mContentTypes;
@@ -770,7 +864,7 @@ class LibertyContent extends LibertyBase {
$aux = array();
$aux = $res;
if( !empty( $contentTypes[$res['content_type_guid']] ) ) {
- // quick alias for code readability
+ // quick alias for code readability
$type = &$contentTypes[$res['content_type_guid']];
if( empty( $type['content_object'] ) ) {
// create *one* object for each object *type* to call virtual methods.
@@ -781,7 +875,6 @@ class LibertyContent extends LibertyBase {
$aux['real_name'] = (isset( $res['creator_real_name'] ) ? $res['creator_real_name'] : $res['creator_user'] );
$aux['editor'] = (isset( $res['modifier_real_name'] ) ? $res['modifier_real_name'] : $res['modifier_user'] );
$aux['content_description'] = $type['content_description'];
-//WIKI_PKG_URL."index.php?page_d=".$res['page_id'];
$aux['user'] = $res['creator_user'];
$aux['real_name'] = (isset( $res['creator_real_name'] ) ? $res['creator_real_name'] : $res['creator_user'] );
$aux['user_id'] = $res['creator_user_id'];
@@ -888,10 +981,10 @@ class LibertyContent extends LibertyBase {
/**
- * Special parsing for multipage articles
+ * Special parsing for multipage articles
*
- * Temporary remove <PRE></PRE> secions to protect
- * from broke <PRE> tags and leave well known <PRE>
+ * Temporary remove &lt;PRE&gt;&lt;/PRE&gt; secions to protect
+ * from broke &lt;PRE&gt; tags and leave well known &lt;PRE&gt;
* behaviour (i.e. type all text inside AS IS w/o
* any interpretation)
* @param string Data to process
@@ -918,10 +1011,10 @@ class LibertyContent extends LibertyBase {
}
/**
- * Special parsing for a particular page of a multipage article
+ * Special parsing for a particular page of a multipage article
*
- * Temporary remove <PRE></PRE> secions to protect
- * from broke <PRE> tags and leave well known <PRE>
+ * Temporary remove &lt;PRE&gt;&lt;/PRE&gt; secions to protect
+ * from broke &lt;PRE&gt; tags and leave well known &lt;PRE&gt;
* behaviour (i.e. type all text inside AS IS w/o
* any interpretation)
* @param string Data to process
@@ -971,7 +1064,7 @@ class LibertyContent extends LibertyBase {
$query = "select `cache_id` from `".BIT_DB_PREFIX."tiki_link_cache` where `url`=?";
// sometimes we can have a cache_id of 0(?!) - seen it with my own eyes, spiderr
$ret = $this->mDb->getOne($query, array( $url ) );
- return( isset( $ret ) );
+ return $ret;
}
/**
diff --git a/LibertyStructure.php b/LibertyStructure.php
index 46424c5..7274191 100755
--- a/LibertyStructure.php
+++ b/LibertyStructure.php
@@ -3,7 +3,7 @@
* Management of Liberty Content
*
* @package liberty
- * @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertyStructure.php,v 1.5 2005/08/07 17:40:29 squareing Exp $
+ * @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertyStructure.php,v 1.6 2005/08/24 20:55:17 squareing Exp $
* @author spider <spider@steelsun.com>
*/
@@ -541,7 +541,7 @@ class LibertyStructure extends LibertyBase {
// it's used only in {toc} thing hardcoded in parse gBitSystem->parse -- (mose)
// the $tocPrefix can be used to Prefix a subtree as it would start from a given number (e.g. 2.1.3)
function build_subtree_toc($id,$slide=false,$order='asc',$tocPrefix='') {
- $ret = array();
+ $back = array();
$cant = $this->mDb->getOne("select count(*) from `".BIT_DB_PREFIX."tiki_structures` where `parent_id`=?",array((int)$id));
if ($cant) {
$query = "SELECT `structure_id`, tc.`title`, `page_alias`
diff --git a/LibertySystem.php b/LibertySystem.php
index 3324937..1c358bf 100755
--- a/LibertySystem.php
+++ b/LibertySystem.php
@@ -3,7 +3,7 @@
* System class for handling the liberty package
*
* @package liberty
-* @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertySystem.php,v 1.5 2005/08/07 17:40:29 squareing Exp $
+* @version $Header: /cvsroot/bitweaver/_bit_liberty/LibertySystem.php,v 1.6 2005/08/24 20:55:17 squareing Exp $
* @author spider <spider@steelsun.com>
*/
@@ -26,6 +26,12 @@ define( 'STORAGE_PLUGIN', 'storage' );
define( 'FORMAT_PLUGIN', 'format' );
define( 'DATA_PLUGIN', 'data' );
+define( 'LIBERTY_SERVICE_ACCESS_CONTROL', 'access_control' );
+define( 'LIBERTY_SERVICE_CATEGORIZATION', 'categorization' );
+define( 'LIBERTY_SERVICE_MENU', 'menu' );
+define( 'LIBERTY_SERVICE_DOCUMENT_GENERATION', 'document_generation' );
+
+
define( 'DEFAULT_ACCEPTABLE_TAGS', '<a><br><b><blockquote><cite><code><div><dd><dl><dt><em><h1><h2><h3><h4><hr>'
.' <i><it><img><li><ol><p><pre><span><strong><table><tbody><div><tr><td><th><u><ul>'
.' <button><fieldset><form><label><input><option><select><textarea>' );
@@ -118,6 +124,32 @@ class LibertySystem extends LibertyBase {
}
}
+ function registerService( $pServiceName, $pPackageName, $pServiceHash ) {
+ $this->mServices[$pServiceName][$pPackageName] = $pServiceHash;
+ }
+
+ function hasService( $pServiceName ) {
+ return( !empty( $this->mServices[$pServiceName] ) );
+ }
+
+ function getServiceValues( $pServiceValue ) {
+ global $gBitSystem;
+ $ret = NULL;
+ if( !empty( $this->mServices ) ) {
+ foreach( array_keys( $this->mServices ) as $service ) {
+ if( $this->hasService( $service ) ) {
+ if( !($package = $gBitSystem->getPreference( 'liberty_service_'.$service )) ) {
+ $package = key( $this->mServices[$service] );
+ }
+ if( !empty( $this->mServices[$service][$package][$pServiceValue] ) ) {
+ $ret[$service] = $this->mServices[$service][$package][$pServiceValue];
+ }
+ }
+ }
+ }
+ return $ret;
+ }
+
function isPluginActive( $pPluginGuid ) {
return( isset( $this->mPlugins[$pGuid] ) && ($this->mPlugins[$pGuid] == 'y') );
}
diff --git a/admin/admin_liberty_inc.php b/admin/admin_liberty_inc.php
index a2a7108..0fff5f9 100644
--- a/admin/admin_liberty_inc.php
+++ b/admin/admin_liberty_inc.php
@@ -25,6 +25,11 @@ $formCommentFeatures = array(
'note' => 'Display an option bar above comments to specify how they should be sorted and how they should be displayed. Useful if your site uses comments extensively.',
'page' => '',
),
+ "comments_display_expanded" => array(
+ 'label' => 'Expand Comments',
+ 'note' => 'When users first visit your site, comments can be hidden or displayed by default.',
+ 'page' => '',
+ ),
);
$gBitSmarty->assign( 'formCommentFeatures', $formCommentFeatures );
diff --git a/edit_structure_inc.php b/edit_structure_inc.php
index f4c2f0e..eeeb059 100644
--- a/edit_structure_inc.php
+++ b/edit_structure_inc.php
@@ -3,7 +3,7 @@
* edit_structure_inc
*
* @author Christian Fowler>
- * @version $Revision: 1.7 $
+ * @version $Revision: 1.8 $
* @package liberty
* @subpackage functions
*/
@@ -23,9 +23,8 @@ if( empty( $_REQUEST["structure_id"] ) ) {
} else {
global $gStructure;
$gStructure = new LibertyStructure( $_REQUEST["structure_id"] );
- $gStructure->mDb->StartTrans();
$gStructure->load();
-
+
// order matters for these conditionals
if( empty( $gStructure ) || !$gStructure->isValid() ) {
$gBitSystem->fatalError( 'Invalid structure' );
@@ -50,25 +49,27 @@ if( empty( $_REQUEST["structure_id"] ) ) {
$gBitUser->storePreference( 'edit_structure_name', $rootStructure->mInfo['title'] );
$gBitUser->storePreference( 'edit_structure_id', $rootStructure->mStructureId );
- include_once( LIBERTY_PKG_PATH.'get_content_list_inc.php' );
- foreach( $contentList['data'] as $cItem ) {
- $cList[$contentTypes[$cItem['content_type_guid']]][$cItem['content_id']] = $cItem['title'].' [id: '.$cItem['content_id'].']';
- }
- $gBitSmarty->assign( 'contentList', $cList );
- $gBitSmarty->assign( 'contentSelect', $contentSelect );
- $gBitSmarty->assign( 'contentTypes', $contentTypes );
- $gBitSmarty->assign( 'contentTypes', $contentTypes );
+ if( !$gBitSystem->isFeatureActive( 'wikibook_hide_add_content' ) ) {
+ include_once( LIBERTY_PKG_PATH.'get_content_list_inc.php' );
+ foreach( $contentList['data'] as $cItem ) {
+ $cList[$contentTypes[$cItem['content_type_guid']]][$cItem['content_id']] = $cItem['title'].' [id: '.$cItem['content_id'].']';
+ }
+ $gBitSmarty->assign( 'contentList', $cList );
+ $gBitSmarty->assign( 'contentSelect', $contentSelect );
+ $gBitSmarty->assign( 'contentTypes', $contentTypes );
+ $gBitSmarty->assign( 'contentTypes', $contentTypes );
- $subpages = $gStructure->s_get_pages($_REQUEST["structure_id"]);
- $max = count($subpages);
- $gBitSmarty->assign_by_ref('subpages', $subpages);
- if ($max != 0) {
- $last_child = $subpages[$max - 1];
- $gBitSmarty->assign('insert_after', $last_child["structure_id"]);
+ $subpages = $gStructure->s_get_pages($_REQUEST["structure_id"]);
+ $max = count($subpages);
+ $gBitSmarty->assign_by_ref('subpages', $subpages);
+ if ($max != 0) {
+ $last_child = $subpages[$max - 1];
+ $gBitSmarty->assign('insert_after', $last_child["structure_id"]);
+ }
}
if( ( isset( $_REQUEST["action"] ) && ( $_REQUEST["action"] == 'remove' ) ) || isset( $_REQUEST["confirm"] ) ) {
-
+
if( isset( $_REQUEST["confirm"] ) ) {
if( $gStructure->s_remove_page( $_REQUEST["structure_id"], false ) ) {
header( "Location: ".$_SERVER['PHP_SELF'].'?structure_id='.$gStructure->mInfo["parent_id"] );
@@ -99,11 +100,11 @@ if( empty( $_REQUEST["structure_id"] ) ) {
header( "Location: ".$_SERVER['PHP_SELF'].'?structure_id='.$gStructure->mInfo["structure_id"] );
die;
} elseif (isset($_REQUEST["create"])) {
-
+
if (isset($_REQUEST["pageAlias"])) {
$gStructure->set_page_alias($_REQUEST["structure_id"], $_REQUEST["pageAlias"]);
}
-
+
$structureHash['root_structure_id'] = $rootStructure->mStructureId;
$structureHash['parent_id'] = $_REQUEST['structure_id'];
@@ -126,7 +127,6 @@ if( empty( $_REQUEST["structure_id"] ) ) {
$gBitSmarty->assign( (!empty( $_REQUEST['tab'] ) ? $_REQUEST['tab'] : 'body').'TabSelect', 'tdefault' );
$gBitSmarty->assign('subtree', $rootTree = $rootStructure->getSubTree( $rootStructure->mStructureId ));
- $gStructure->mDb->CompleteTrans();
}
?>
diff --git a/get_content_list_inc.php b/get_content_list_inc.php
index 9e78045..a96c4db 100644
--- a/get_content_list_inc.php
+++ b/get_content_list_inc.php
@@ -3,7 +3,7 @@
* get_content_list
*
* @author Christian Fowler>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage functions
*/
@@ -19,10 +19,18 @@ if( empty( $gContent ) || !is_object( $gContent ) ) {
$gContent = new LibertyContent();
}
-$contentSelect = empty( $_REQUEST['content_type_guid'] ) ? NULL : $_REQUEST['content_type_guid'];
-
// get_content_list_inc doesn't use $_REQUEST parameters as it might not be the only list in the page that needs sorting and limiting
-$contentList = $gContent->getContentList( $contentSelect, isset( $offset_content ) ? $offset_content : 0, isset( $max_content ) ? $max_content : 500, isset( $content_sort_mode ) ? $content_sort_mode : 'title_asc', empty( $_REQUEST["find_objects"] ) ? NULL : $_REQUEST["find_objects"], isset( $_REQUEST['user_id'] ) ? $_REQUEST['user_id'] : NULL );
+if( empty( $contentListHash ) ) {
+ $contentListHash = array(
+ 'content_type_guid' => $contentSelect = empty( $_REQUEST['content_type_guid'] ) ? NULL : $_REQUEST['content_type_guid'],
+ 'offset' => !empty( $offset_content ) ? $offset_content : 0,
+ 'max_records' => !empty( $max_content ) ? $max_content : 500,
+ 'sort_mode' => !empty( $content_sort_mode ) ? $content_sort_mode : 'title_asc',
+ 'find' => !empty( $_REQUEST["find_objects"] ) ? $_REQUEST["find_objects"] : NULL,
+ 'user_id' => !empty( $_REQUEST['user_id'] ) ? $_REQUEST['user_id'] : NULL,
+ );
+}
+$contentList = $gContent->getContentList( $contentListHash );
$contentTypes = array( '' => tra( 'All Content' ) );
foreach( $gLibertySystem->mContentTypes as $cType ) {
diff --git a/icons/security.png b/icons/security.png
new file mode 100644
index 0000000..33091eb
--- /dev/null
+++ b/icons/security.png
Binary files differ
diff --git a/lookup_content_inc.php b/lookup_content_inc.php
index e7305fc..9d6049d 100644
--- a/lookup_content_inc.php
+++ b/lookup_content_inc.php
@@ -3,12 +3,12 @@
* lookup_content_inc
*
* @author spider <spider@steelsun.com>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage functions
*/
global $gContent;
-
+
if( !empty( $_REQUEST['structure_id'] ) ) {
/**
* required setup
@@ -22,7 +22,6 @@
$gBitSmarty->assign( 'structureInfo', $gStructure->mInfo );
// $_REQUEST['page_id'] = $gStructure->mInfo['page_id'];
if( $viewContent = $gStructure->getLibertyObject( $gStructure->mInfo['content_id'], $gStructure->mInfo['content_type']['content_type_guid'] ) ) {
- $viewContent->load();
$viewContent->setStructure( $_REQUEST['structure_id'] );
$gBitSmarty->assign_by_ref( 'pageInfo', $viewContent->mInfo );
$gContent = &$viewContent;
@@ -32,10 +31,8 @@
} elseif( !empty( $_REQUEST['content_id'] ) ) {
require_once( LIBERTY_PKG_PATH.'LibertyBase.php');
if( $gContent = LibertyBase::getLibertyObject( $_REQUEST['content_id'] ) ) {
- if( $gContent->load() ) {
- $gBitSmarty->assign_by_ref( 'gContent', $gContent );
- $gBitSmarty->assign_by_ref( 'pageInfo', $gContent->mInfo );
- }
+ $gBitSmarty->assign_by_ref( 'gContent', $gContent );
+ $gBitSmarty->assign_by_ref( 'pageInfo', $gContent->mInfo );
}
}
diff --git a/modules/help_mod_last_changes.tpl b/modules/help_mod_last_changes.tpl
index bdec014..08afc24 100644
--- a/modules/help_mod_last_changes.tpl
+++ b/modules/help_mod_last_changes.tpl
@@ -12,7 +12,7 @@
</tr>
<tr class="even">
<td>show_date</td>
- <td>(boolean)</td>
+ <td>( {tr}boolean{/tr} )</td>
<td>{tr}Specify if you want to display the date of the last modification.{/tr}</td>
</tr>
</table>
diff --git a/modules/mod_last_changes.php b/modules/mod_last_changes.php
index f042231..c24074a 100644
--- a/modules/mod_last_changes.php
+++ b/modules/mod_last_changes.php
@@ -1,5 +1,5 @@
<?php
-// $Header: /cvsroot/bitweaver/_bit_liberty/modules/mod_last_changes.php,v 1.5 2005/08/07 17:40:30 squareing Exp $
+// $Header: /cvsroot/bitweaver/_bit_liberty/modules/mod_last_changes.php,v 1.6 2005/08/24 20:55:17 squareing Exp $
/**
* Params:
* - content_type_guid : if set, show only those content_type_guid's
@@ -32,6 +32,13 @@ if( !empty( $module_params['show_date'] ) ) {
$gBitSmarty->assign( 'showDate' , TRUE );
}
-$modLastContent = $gBitUser->getContentList( !empty( $module_params['content_type_guid'] ) ? $module_params['content_type_guid'] : NULL, 0, $module_rows, 'last_modified_desc', NULL, $userId );
+$listHash = array(
+ 'content_type_guid' => !empty( $module_params['content_type_guid'] ) ? $module_params['content_type_guid'] : NULL,
+ 'offset' => 0,
+ 'max_records' => $module_rows,
+ 'sort_mode' => 'last_modified_desc',
+ 'user_id' => $userId,
+);
+$modLastContent = $gBitUser->getContentList( $listHash );
$gBitSmarty->assign_by_ref( 'modLastContent', $modLastContent['data'] );
?>
diff --git a/plugins/data.addtabs.php b/plugins/data.addtabs.php
index b1eff09..889daa0 100644
--- a/plugins/data.addtabs.php
+++ b/plugins/data.addtabs.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage plugins_data
*/
@@ -15,7 +15,7 @@
// +----------------------------------------------------------------------+
// | Author: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.addtabs.php,v 1.4 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.addtabs.php,v 1.5 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -66,8 +66,7 @@ function data_addtabs($data, $params) {
$ret = '<div class="tabpane">';
for ($i = 1; $i <= 99; $i++) {
if( isset( ${'tab'.$i} ) && is_numeric( ${'tab'.$i} ) ) {
- $obj = LibertyBase::getLibertyObject( ${'tab'.$i} );
- if( $obj->load() ) {
+ if( $obj = LibertyBase::getLibertyObject( ${'tab'.$i} ) ) {
$ret .= '<div class="tabpage"><h4 class="tab">'.$obj->getTitle().'</h4>'.$obj->parseData().'</div>';
$good=True;
}
diff --git a/plugins/data.agentinfo.php b/plugins/data.agentinfo.php
index a5f69cf..9071162 100644
--- a/plugins/data.agentinfo.php
+++ b/plugins/data.agentinfo.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage plugins_data
*/
@@ -17,7 +17,7 @@
// | Reworked for Bitweaver (& Undoubtedly Screwed-Up)
// | by: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.agentinfo.php,v 1.4 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.agentinfo.php,v 1.5 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -55,7 +55,7 @@ function data_agentinfo_help() {
.'<td>' . tra( "Show information about the Browser being used.") . '<br />'
.'<strong>ip</strong>: ' . tra( "To get the client\'s IP address (default)" ) . '<br />'
.'<strong>browser</strong>: ' . tra( "To get the clients Browser infromation." ) . '<br />'
- .'<strong>server</strong>: ' . tra( "To get the site\'s server software" ) . '<br />'
+ .'<strong>server</strong>: ' . tra( "To get the site\'s server software" ) . '</td>'
.'</tr>'
.'</table>'
. tra("Example: ") . "{AGENTINFO info='browser'}";
diff --git a/plugins/data.dropdown.php b/plugins/data.dropdown.php
index db384d3..b04e6c6 100644
--- a/plugins/data.dropdown.php
+++ b/plugins/data.dropdown.php
@@ -4,7 +4,7 @@
* assigned_modules
*
* @author StarRider <starrrider@sourceforge.net>
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage plugins_data
*
@@ -55,7 +55,7 @@ function data_dropdown_help() {
.'</tr>'
.'</table>'
. tra("Example: ") . '{DD}' . tra("Text in the Drop-Down box.") . '{DD}<br />'
- . tra("Example: ") . "{DD title='" . tra("Explaining the Lines #1 #3 & #7'} Text in the Drop-Down box") . '{DD}';
+ . tra("Example: ") . "{DD title='" . tra("Explaining the Lines #1 #3 &amp; #7'} Text in the Drop-Down box") . '{DD}';
return $help;
}
diff --git a/plugins/data.flash.php b/plugins/data.flash.php
index 4a5abae..652d9f2 100644
--- a/plugins/data.flash.php
+++ b/plugins/data.flash.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.3 $
+ * @version $Revision: 1.4 $
* @package liberty
* @subpackage plugins_data
*/
@@ -17,7 +17,7 @@
// | Reworked for Bitweaver (& Undoubtedly Screwed-Up)
// | by: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.flash.php,v 1.3 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.flash.php,v 1.4 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -53,7 +53,7 @@ function data_flash_help() {
.'<tr class="odd">'
.'<td>movie</td>'
.'<td>' . tra( "string") . '<br />' . tra("(manditory)") . '</td>'
- .'<td>' . tra( "A location where the Flash SWF file can be found. This can be any URL or a site value. See Examples.")
+ .'<td>' . tra( "A location where the Flash SWF file can be found. This can be any URL or a site value. See Examples.") . '</td>'
.'</tr>'
.'<tr class="even">'
.'<td>width</td>'
diff --git a/plugins/data.freemind.php b/plugins/data.freemind.php
index c338e6a..f4ba52e 100644
--- a/plugins/data.freemind.php
+++ b/plugins/data.freemind.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
* @package liberty
* @subpackage plugins_data
*/
@@ -90,7 +90,7 @@ function data_freemind( $data, $params ) {
' <param name="browsemode_initial_map" value="' . $params["src"] . '" >'.
' <param name="initial_mode" value="Browse" >'.
'</applet>'.
- '<br>'.
+ '<br />'.
'<span class="">Download <a href="' . $params["src"] . '">this mind map</a> and use this application to edit it: <a href="http://freemind.sourceforge.net/">Freemind </a> </span>';
}
}
diff --git a/plugins/data.gauge.php b/plugins/data.gauge.php
index 5f578c2..f3f57a5 100644
--- a/plugins/data.gauge.php
+++ b/plugins/data.gauge.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.6 $
+ * @version $Revision: 1.7 $
* @package liberty
* @subpackage plugins_data
*/
@@ -17,7 +17,7 @@
// | Reworked for Bitweaver (& Undoubtedly Screwed-Up)
// | by: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.gauge.php,v 1.6 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.gauge.php,v 1.7 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -50,12 +50,12 @@ function data_gauge_help() {
.'<tr class="odd">'
.'<td>color</td>'
.'<td>' . tra( "colorname or hex color") . '<br />' . tra("(optional)") . '</td>'
- .'<td>' . tra( "Specifies the color of the of the Bar in the Gauge. Colornames or HTML colors can be used. To specify HTML color the <strong>#</strong> character <strong>MUST</strong> be included like this: ( <strong>#RRGGBB </strong> ). If not specified - the <strong>Current Text Color</strong> will be used. See Note below for Colornames & HTML Colors Sources.") . '</td>'
+ .'<td>' . tra( "Specifies the color of the of the Bar in the Gauge. Colornames or HTML colors can be used. To specify HTML color the <strong>#</strong> character <strong>MUST</strong> be included like this: ( <strong>#RRGGBB </strong> ). If not specified - the <strong>Current Text Color</strong> will be used. See Note below for Colornames &amp; HTML Colors Sources.") . '</td>'
.'</tr>'
.'<tr class="even">'
.'<td>bgcolor</td>'
.'<td>' . tra( "colorname or hex color") . '<br />' . tra("(optional)") . '</td>'
- .'<td>' . tra( "Specifies the color of the Gauges Background. Colornames or HTML colors can be used. To specify HTML color the <strong>#</strong> character <strong>MUST</strong> be included like this: ( <strong>#RRGGBB </strong> ). If not specified - the <strong>Current Background Color</strong> will be used. See Note below for Colornames & HTML Colors Sources.") . '</td>'
+ .'<td>' . tra( "Specifies the color of the Gauges Background. Colornames or HTML colors can be used. To specify HTML color the <strong>#</strong> character <strong>MUST</strong> be included like this: ( <strong>#RRGGBB </strong> ). If not specified - the <strong>Current Background Color</strong> will be used. See Note below for Colornames &amp; HTML Colors Sources.") . '</td>'
.'</tr>'
.'<tr class="odd">'
.'<td>max</td>'
diff --git a/plugins/data.include.php b/plugins/data.include.php
index eabd09c..ae416cb 100644
--- a/plugins/data.include.php
+++ b/plugins/data.include.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
* @package liberty
* @subpackage plugins_data
*/
@@ -17,7 +17,7 @@
// | Reworked for Bitweaver (& Undoubtedly Screwed-Up)
// | by: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.include.php,v 1.5 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.include.php,v 1.6 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -81,8 +81,7 @@ function data_include($data, $params) {
}
// load page by content_id
} elseif( isset( $params['content_id'] ) && is_numeric( $params['content_id'] ) ) {
- $obj = LibertyBase::getLibertyObject( $params['content_id'] );
- if( $obj->load() ) {
+ if( $obj = LibertyBase::getLibertyObject( $params['content_id'] ) ) {
$ret = $obj->parseData();
}
// load page by page_name
diff --git a/plugins/data.mapquest.php b/plugins/data.mapquest.php
index dff3dc3..da8f7a9 100644
--- a/plugins/data.mapquest.php
+++ b/plugins/data.mapquest.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage plugins_data
*/
@@ -15,7 +15,7 @@
// +----------------------------------------------------------------------+
// | Author: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.mapquest.php,v 1.4 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.mapquest.php,v 1.5 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -100,12 +100,12 @@ function data_mapquest_help() {
.'<td>' . tra( "The Country (Uses 2-digit ISO Codes)")
. tra("<br />The Default = ") . '<strong>US</strong>'
. tra("<br /><strong>Note:</strong> 2-Digit ISO Country Codes are available from ")
- . '<a href="http://www.bcpl.net/~j1m5path/isocodes-table.html" title="Launch BCPL.net in New Window" onkeypress="popUpWin(this.href,\'standard\',800,800);" onclick="popUpWin(this.href,\'standard\',800,800);return false;">' . tra( "ISO Country Codes" ) . '</a>'
+ . '<a href="http://www.bcpl.net/~j1m5path/isocodes-table.html" title="Launch BCPL.net in New Window" onkeypress="popUpWin(this.href,\'standard\',800,800);" onclick="popUpWin(this.href,\'standard\',800,800);return false;">' . tra( "ISO Country Codes" ) . '</a></td>'
.'</tr>'
.'<tr class="odd">'
.'<td>title</td>'
.'<td>' . tra( "string") . '<br />' . tra("(optional)") . '</td>'
- .'<td>' . tra( "MapQuest labels each Map with the Address, City, State, & Zip Code. This parameter overwrites that label when defined.")
+ .'<td>' . tra( "MapQuest labels each Map with the Address, City, State, &amp; Zip Code. This parameter overwrites that label when defined.")
. tra("<br />The Default = ") . '<strong>NONE</strong></td>'
.'</tr>'
.'<tr class="even">'
@@ -156,7 +156,7 @@ function data_mapquest( $data, $params ) {
$map = isset($title) ? $map . '&title=' . implode('+', explode(' ',$title)) : $map;
$map = '"' . $map . '&cid=lfmaplink"';
- $map = '<a href=' . $map . ' title="Launch Map Quest in a New Window" onkeypress="popUpWin(this.href,\'standard\',800,800);" onclick="popUpWin(this.href,\'standard\',800,800);return false;">';
+ $map = '<a href="' . $map . '" title="Launch Map Quest in a New Window" onkeypress="popUpWin(this.href,\'standard\',800,800);" onclick="popUpWin(this.href,\'standard\',800,800);return false;">';
if (isset($myicon)) { // Test for the existance of MyIcon
$ret = $map . '<img border="0" src="' . $myicon . '"></a>';
diff --git a/plugins/data.mqdirections.php b/plugins/data.mqdirections.php
index 25694d1..6bb384b 100644
--- a/plugins/data.mqdirections.php
+++ b/plugins/data.mqdirections.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage plugins_data
*/
@@ -15,7 +15,7 @@
// +----------------------------------------------------------------------+
// | Author: StarRider <starrrider@users.sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.mqdirections.php,v 1.4 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.mqdirections.php,v 1.5 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -85,7 +85,7 @@ function data_mqdir_help() {
.'<td>' . tra( "The Country (Uses 2-digit ISO Codes)")
. tra("<br />The Default = ") . '<strong>US</strong>'
. tra("<br /><strong>Note:</strong> 2-Digit ISO Country Codes are available from ")
- . "<a class='wiki' target=" . '"_blank"' . " href=http://www.bcpl.net/~j1m5path/isocodes-table.html>" . tra("ISO Country Codes</a> ")
+ . "<a href=\"http://www.bcpl.net/~j1m5path/isocodes-table.html\">" . tra("ISO Country Codes").'</a></td>'
.'</tr>'
.'</table>'
. tra("Example: ") . "{MQDIR icon=sm address='1730 Blake St' city=Denver state=CO zip=80202 }";
@@ -127,7 +127,7 @@ function data_mqdir( $data, $params ) {
.'<input type="hidden" name="2s" value="' . $a2s . '">'
.'<input type="hidden" name="2z" value="' . $a2z . '">'
.'<input type="hidden" name="2y" value="' . $a2y . '">'
- .'<br>'
+ .'<br />'
.'<table border="0" cellpadding="0" cellspacing="0" style="font: 11px Arial,Helvetica;">'
.'<tr><td colspan="2" style="font-weight: bold;">'
.'<div align="center">'
diff --git a/plugins/data.sf.php b/plugins/data.sf.php
index 8506d67..c52ef3b 100644
--- a/plugins/data.sf.php
+++ b/plugins/data.sf.php
@@ -1,6 +1,6 @@
<?php
/**
- * @version $Revision: 1.5 $
+ * @version $Revision: 1.6 $
* @package liberty
* @subpackage plugins_data
*/
@@ -17,7 +17,7 @@
// | Reworked & Undoubtedly Screwed-Up for (Bitweaver)
// | by: StarRider <starrrider@sourceforge.net>
// +----------------------------------------------------------------------+
-// $Id: data.sf.php,v 1.5 2005/08/07 17:40:31 squareing Exp $
+// $Id: data.sf.php,v 1.6 2005/08/24 20:55:17 squareing Exp $
/**
* definitions
@@ -54,10 +54,10 @@ function data_sf_help() {
.'<td>' . tra( "string") . '<br />' . tra("(optional)") . '</td>'
.'<td>' . tra( "The") . ' <strong>tag</strong> ' . tra("is a short-cut that allows you to use this plugin without having to look up the SourceForge")
.' <strong>groupid or adit</strong> ' . tra("numbers for specific projects.")
- .'</br>' . tra("Possible values for BitWeaver are:") . '<strong>bugs / rfe / patches / support</strong>'
- .'</br>' . tra("Possible values for TikiWiki are:") . '<strong>twbugs / twrfe / twpatches / twsupport</strong>'
- .'</br>' . tra("Possible values for JGraph are:") . '<strong>jgbugs / jgrfe / jgsupport</strong>'
- .'</br>' . tra("Possible values for PhpBB are:") . '<strong>pbbrfe</strong></td>'
+ .'<br/>' . tra("Possible values for BitWeaver are:") . '<strong>bugs / rfe / patches / support</strong>'
+ .'<br/>' . tra("Possible values for TikiWiki are:") . '<strong>twbugs / twrfe / twpatches / twsupport</strong>'
+ .'<br/>' . tra("Possible values for JGraph are:") . '<strong>jgbugs / jgrfe / jgsupport</strong>'
+ .'<br/>' . tra("Possible values for PhpBB are:") . '<strong>pbbrfe</strong></td>'
.'</tr>'
.'<tr class="even">'
.'<td>aid</td>'
diff --git a/plugins/data.spytext.php b/plugins/data.spytext.php
index 4e9a4b0..e46c1dd 100644
--- a/plugins/data.spytext.php
+++ b/plugins/data.spytext.php
@@ -4,7 +4,7 @@
* assigned_modules
*
* @author StarRider starrrider@sourceforge.net
- * @version $Revision: 1.4 $
+ * @version $Revision: 1.5 $
* @package liberty
* @subpackage plugins_data
* @copyright Copyright (c) 2004, bitweaver.org
@@ -71,7 +71,7 @@ function data_spytext_help() {
.'<td>to</td>'
.'<td>' . tra( "boolean/string") . '<br />' .tra( "(optional)") . '</td>'
.'<td>' .tra( "Determines if an Address Box will be displayed before the Message. The Address Box is always in it's own ")
- .tra( "DropDown box which contains 3 lines where the") .' <strong>spy(s) / agency(s) / & sender(s)</strong> '
+ .tra( "DropDown box which contains 3 lines where the") .' <strong>spy(s) / agency(s) / &amp; sender(s)</strong> '
.tra( "are identified. These lines are only displayed if a valid UserName / GroupName is found for that line. ")
.'<br />' . tra( "The Default Header for each line is:")
.'<br />Line 1 for Spy (Users) = <strong>"To the Spy:"</strong> '
@@ -138,7 +138,7 @@ function data_spytext_help() {
."<br /><strong>alert='TRUE'</strong> ". tra( "will enable the Alert Box with the Default Headers. The Default Headers is:")
.'<br /><strong>"Wake Up Charlie! There is a message on this page for you. Use your Secret Decoder Ring!"</strong> '
.tra( "<br />In this instance - <strong>Charlie</strong> is the UserName of the user viewing the page. The string:")
- .'<br /><strong>*UserName*<strong> ' . tra("is replaced with name of the spy viewing the page every place it is found.")
+ .'<br /><strong>*UserName*</strong> ' . tra("is replaced with name of the spy viewing the page every place it is found.")
.tra( "Passing <strong>ANY</strong> other value will replace Default Message.")
.'<br />' . tra( "<strong>Note:</strong> The Administrator is a Spy and will be Alerted - with a slightly different message.")
.'</td>'
diff --git a/plugins/data.wikigraph.php b/plugins/data.wikigraph.php
new file mode 100644
index 0000000..484dcaa
--- /dev/null
+++ b/plugins/data.wikigraph.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * @version $Revision: 1.2 $
+ * @package liberty
+ * @subpackage plugins_data
+ */
+// +----------------------------------------------------------------------+
+// | Copyright (c) 2004, bitweaver.org
+// +----------------------------------------------------------------------+
+// | All Rights Reserved. See copyright.txt for details and a complete list of authors.
+// | Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details
+// |
+// | For comments, please use phpdocu.sourceforge.net documentation standards!!!
+// | -> see http://phpdocu.sourceforge.net/
+// +----------------------------------------------------------------------+
+// | Author (TikiWiki): Unknown
+// | Reworked & Undoubtedly Screwed-Up for (Bitweaver)
+// | by: wolff_borg <wolff_borg@yahoo.com.au>
+// | Reworked from: wikiplugin_wikigraph.php - see deprecated code below
+// +----------------------------------------------------------------------+
+// $Id: data.wikigraph.php,v 1.2 2005/08/24 20:55:17 squareing Exp $
+/**
+ * definitions
+ */
+global $gBitSystem;
+if (!$gBitSystem->isPackageActive( 'wiki' ) ) { // Do not include this Plugin if the Package is not active
+define( 'PLUGIN_GUID_DATAWIKIGRAPH', 'datawikigraph' );
+global $gLibertySystem;
+$pluginParams = array ( 'tag' => 'WIKIGRAPH',
+ 'auto_activate' => FALSE,
+ 'requires_pair' => TRUE,
+ 'load_function' => 'data_wikigraph',
+ 'title' => 'WikiGraph',
+ 'help_page' => 'DataPluginWikiGraph',
+ 'description' => tra("Inserts a graph for visual navigation. The graph shows the page and every page that can be reached from that page."),
+ 'help_function' => 'data_wikigraph_help',
+ 'syntax' => "{WIKIGRAPH(level=> ,title=> ,nodesep=> ,rankdir=> ,bgcolor=> ,size=> ,fontsize=> ,fontname=> ,shap=> ,nodestyle=> ,nodecolor=> ,nodefillcolor=> ,nodewidth=> ,nodeheight=> ,edgecolor=> ,edgestyle=> )}".tra("Wiki page name")."{WIKIGRAPH}",
+ 'plugin_type' => DATA_PLUGIN
+ );
+$gLibertySystem->registerPlugin( PLUGIN_GUID_DATAWIKIGRAPH, $pluginParams );
+$gLibertySystem->registerDataTag( $pluginParams['tag'], PLUGIN_GUID_DATAWIKIGRAPH );
+
+function data_wikigraph_help() {
+ $back = tra("^__Parameter Syntax:__ ") . "~np~{WIKIGRAPH" . tra("(key=>value)}~/np~\n");
+ $back.= tra("Inserts a graph for visual navigation. The graph shows the page and every page that can be reached from that page. Each node in the graph can be clicked to navigate to the selected page. Unless a PageName is included between the ") . "__~np~{WIKIGRAPH}~/np~__" . tra(" blocks, the graph will be created for the Current Page. __Note:__ This plugin requires the installation of ))GraphViz(( on the server.");
+ $back.= tra("||__::key::__ | __::value::__ | __::Comments::__\n");
+ $back.= "::level::" . tra(" | ::number:: | the number of levels that will be followed from the starting page. __Optional__ - can be omitted - the __Default = 0__ so only the links from the page will be displayed.\n");
+ $back.= "::title::" . tra(" | ::string:: | the title of the graph. __Optional__ - can be omitted - the __Default = ~034~Wiki-Graph~034~__.\n");
+ $back.= "::nodesep::" . tra(" | ::inches:: | the minimum distance between two nodes at the same level.Use the format __1.2__ in inches. __Optional__ - can be omitted - the __Default = .1__.\n");
+ $back.= "::rankdir::" . tra(" | ::string:: | direction of graph layout. Can be Left to Right ") . "__LR__ or __RL__" . tra(" Right to Left. Vertical graphs can also be made using Top to Bottom ") . "__TB__ or __BT__" . tra(" Bottom to Top. __Optional__ - can be omitted - the __Default = ") . "TB__.\n";
+ $back.= "::bgcolor::" . tra(" | ::colorname or hex color:: | specifies the background color for the graph. HTML colors (#RRGGBB) can be used if preceeded by the character #. __Optional__ - can be omitted - the __Default = ~034~transparent~034~__.\n");
+ $back.= "::size::" . tra(" | ::inches:: | the width and height of the graph. Use the format __5,3__ in inches. If the graph is larger that the size it will be scaled down to fit. __Optional__ - can be omitted - the __Default = Unlimited__.\n");
+ $back.= "::fontsize::" . tra(" | ::points:: | the font size in points - used in all text. __Optional__ - can be omitted - the __Default = 9__.\n");
+ $back.= "::fontname::" . tra(" | ::font name:: | the name of the font used for the labels. It is better to use a font that is generally available, such as Times-Roman, Helvetica or Courier. __Optional__ - can be omitted - the __Default = Helvetica__.\n");
+ $back.= "::shap::" . tra(" | ::value:: | the shape of the nodes. Values can be") . "__a1 / box / circle / diamond / doublecircle / doubleoctagon / egg / ellipse / hexagon / house / invhouse / invtrapezium / invtriangle / Mcircle / Mdiamond / Msquare / octagon / parallelogram / pentagon / point / polygon / rect / rectangle / septagon / trapezium / triangle / tripleoctagon__." . tra(" __Optional__ - can be omitted - the __Default = ") . "box__.\n";
+ $back.= "::nodestyle::" . tra(" | ::value:: | the style used for creating the nodes. Values are: ") . "__dashed / dotted / solid / invis / bold / filled / diagonals / rounded__." . tra(" __Optional__ - can be omitted - the __Default = ") . "filled__.\n";
+ $back.= "::nodecolor::" . tra(" | ::colorname or hex-color:: | basic color for all graphics. HTML colors (#RRGGBB) can be used if preceeded by the character #. __Optional__ - can be omitted - the __Default = #aeaeae__ (a light gray).\n");
+ $back.= "::nodefillcolor::" . tra(" | ::colorname or hex-color:: | specifies the background color for the nodes. HTML colors (#RRGGBB) can be used if preceeded by the character #. __Optional__ - can be omitted - the __Default = #FFFFFF__ (White).\n");
+ $back.= "::nodewidth::" . tra(" | ::inches:: | width of the nodes. This is the initial, minimum width of a node. Use the format __1.2__ in inches. __Optional__ - can be omitted - the __Default = .1__.\n");
+ $back.= "::nodeheight::" . tra(" | ::inches:: | height of the nodes. This is the initial, minimum height of a node. Use the format __1.2__ in inches. __Optional__ - can be omitted - the __Default = .1__.\n");
+ $back.= "::edgecolor::" . tra(" | ::colorname or hex-color:: | specifies the color of the links. HTML colors (#RRGGBB) can be used if preceeded by the character #. __Optional__ - can be omitted - the __Default = #999999__ (a darker gray).\n");
+ $back.= "::edgestyle::" . tra(" | ::value:: | the shape of the arrow that points at the link. Values are: ") . "__normal / inv / dot / invdot / odot / invodot / none / tree / empty / invempty / diamond / ediamond / odiamond / crow / box / obox / open / halfopen__." . tra(" __Optional__ - can be omitted - the __Default = ") . "normal__.||^"; // This one may not be correct - this had a default of "solid" but the ArrowTypes given at http://www.research.att.com/~erg/graphviz/info/attrs.html#k:arrowType specify the default as "normal"
+ $back.= tra("^__Example:__ ") . "~np~{WIKIGRAPH(level=>0)}HomePage{WIKIGRAPH}~/np~^";
+ $back.= tra("^__Note 1:__ Plugin's are __case sensitive__. The Name of the plugin __MUST__ be UPPERCASE. The Key(s) are __always__ lowercase. Some Values are mixed-case but most require lowercase. When in doubt - look at the Example.\n");
+ $back.= tra("__Note 2:__ A listing of ColorNames can be found at ") . "<a class='wiki' target=" . '"_blank"' . " href='http://www.tikipro.org/wiki/index.php?page=Browser+ColorNames/'>" . tra("TikiPro</a>^");
+ $back.= tra("__Note 3:__ One useful place for obtaining HTML colors is ") . "<a class='wiki' target=" . '"_blank"' . " href='http://www.pagetutor.com/pagetutor/makapage/picker/'>" . tra("The Color Picker II</a>^");
+ return $back;
+}
+
+include_once( WIKI_PKG_PATH.'BitPage.php');
+include_once( UTIL_PKG_PATH.'GraphViz.php' );
+
+function data_wikigraph($data, $params) {
+ global $gContent, $wikilib;
+ $add = "";
+ extract ($params);
+ if(!isset($level)) $level = 0;
+ if(!isset($title)) $title = "Wiki-Graph";
+ if(isset($nodesep)) $add.="&amp;nodesep=$nodesep";
+ if(isset($rankdir)) $add.="&amp;rankdir=$rankdir";
+ if(isset($size)) $add.="&amp;size=$size";
+ if(isset($bgcolor)) $add.="&amp;bgcolor=$bgcolor";
+ if(isset($fontsize)) $add.="&amp;fontsize=$fontsize";
+ if(isset($fontname)) $add.="&amp;fontname=$fontname";
+ if(isset($shape)) $add.="&amp;shape=$shape";
+ if(isset($nodestyle)) $add.="&amp;nodestyle=$nodestyle";
+ if(isset($nodecolor)) $add.="&amp;nodecolor=$nodecolor";
+ if(isset($nodefillcolor)) $add.="&amp;nodefillcolor=$nodefillcolor";
+ if(isset($nodewidth)) $add.="&amp;nodewidth=$nodewidth";
+ if(isset($nodeheight)) $add.="&amp;nodeheight=$nodeheight";
+ if(isset($edgecolor)) $add.="&amp;edgecolor=$edgecolor";
+ if(isset($edgestyle)) $add.="&amp;edgestyle=$edgestyle";
+ if(empty($data)) $data=$gContent->mInfo['title'];
+ $mapname=md5(uniqid("."));
+ $ret='';
+$garg = array(
+ 'att' => array(
+ 'level' => $level,
+ 'nodesep' => isset($nodesep) ? $nodesep : ".1",
+ 'rankdir' => isset($rankdir) ? $rankdir : "LR",
+ 'bgcolor' => isset($bgcolor) ? $bgcolor : "transparent",
+ 'size' => isset($size) ? $size : ""
+ ),
+ 'node' => array(
+ 'fontsize' => isset($fontsize) ? $fontsize : "9",
+ 'fontname' => isset($fontname) ? $fontname : "Helvetica",
+ 'shape' => isset($shape) ? $shape : "box",
+ 'style' => isset($nodestyle) ? $nodestyle : "filled",
+ 'color' => isset($nodecolor) ? $nodecolor : "#aeaeae",
+ 'fillcolor' => isset($nodefillcolor) ? $nodefillcolor : "#FFFFFF",
+ 'width' => isset($nodewidth) ? $nodewidth : ".1",
+ 'height' => isset($nodeheight) ? $nodeheight : ".1"
+ ),
+ 'edge' => array(
+ 'color' => isset($edgecolor) ? $edgecolor : "#999999",
+ 'style' => isset($edgestyle) ? $edgestyle : "solid"
+));
+ $ret .= "<div align='center'><img border='0' src=\"".WIKI_PKG_URL."wiki_graph.php?page=".urlencode($data)."&amp;level=$level$add\" alt='graph' usemap='#$mapname' />";
+ $mapdata = $wikilib->get_graph_map($data, $level, $garg);
+ $mapdata = preg_replace("/\n|\r/", '', $mapdata);
+ $ret .= "<map name='$mapname'>$mapdata</map></div>";
+ return $ret;
+}
+}
+?>
diff --git a/plugins/format.markdown.php b/plugins/format.markdown.php
new file mode 100644
index 0000000..432cb74
--- /dev/null
+++ b/plugins/format.markdown.php
@@ -0,0 +1,1443 @@
+<?php
+
+//===================================================//
+//=========== start bitweaver configuration =========//
+//===================================================//
+
+global $gLibertySystem;
+
+/**
+ * definitions
+ */
+define( 'PLUGIN_GUID_MARKDOWN', 'markdown' );
+
+$pluginParams = array (
+ 'store_function' => 'markdown_save_data',
+ 'load_function' => 'markdown_parse_data',
+ 'verify_function' => 'markdown_verify_data',
+ 'auto_activate' => FALSE,
+ 'description' => 'This parser allows you to use plain text, which is then converted to HTML. For the full syntax, please view <a href="http://daringfireball.net/projects/markdown/syntax">Markdown Syntax</a>',
+ 'edit_label' => 'Markdown',
+ 'edit_field' => '<input type="radio" name="format_guid" value="'.PLUGIN_GUID_MARKDOWN.'"',
+ 'plugin_type' => FORMAT_PLUGIN
+);
+
+$gLibertySystem->registerPlugin( PLUGIN_GUID_MARKDOWN, $pluginParams );
+
+function markdown_verify_data( &$pParamHash ) {
+ $errorMsg = NULL;
+ $pParamHash['content_store']['data'] = Markdown( $pParamHash['edit'] );
+ return $errorMsg;
+}
+
+function markdown_save_data( &$pParamHash ) {
+ static $parser;
+ if( empty( $parser ) ) {
+ $parser = new TikiWikiParser();
+ }
+ if( $pParamHash['edit'] ) {
+ $parser->storeLinks( $pParamHash );
+ }
+}
+
+function markdown_parse_data( &$pData, &$pCommonObject ) {
+ global $gLibertySystem;
+ // eventually we should strip tags, maybe tikilink, or other things.
+ parse_data_plugins( $pData, $foo, $bar, $empty );
+ // this function is called manually, since it processes the HTML code
+ if( preg_match( "/\{maketoc.*?\}/i", $pData ) && @$gLibertySystem->mPlugins['datamaketoc']['is_active'] == 'y' ) {
+ $pData = data_maketoc( $pData );
+ }
+ return $pData;
+}
+
+//===================================================//
+//============ end bitweaver configuration ==========//
+//===================================================//
+
+#
+# Markdown - A text-to-HTML conversion tool for web writers
+#
+# Copyright (c) 2004-2005 John Gruber
+# <http://daringfireball.net/projects/markdown/>
+#
+# Copyright (c) 2004-2005 Michel Fortin - PHP Port
+# <http://www.michelf.com/projects/php-markdown/>
+#
+
+global $MarkdownPHPVersion, $MarkdownSyntaxVersion,
+ $md_empty_element_suffix, $md_tab_width,
+ $md_nested_brackets_depth, $md_nested_brackets,
+ $md_escape_table, $md_backslash_escape_table,
+ $md_list_level;
+
+$MarkdownPHPVersion = '1.0.1b'; # Mon 6 Jun 2005
+$MarkdownSyntaxVersion = '1.0.1'; # Sun 12 Dec 2004
+
+
+#
+# Global default settings:
+#
+$md_empty_element_suffix = " />"; # Change to ">" for HTML output
+$md_tab_width = 4;
+
+#
+# WordPress settings:
+#
+$md_wp_posts = true; # Set to false to remove Markdown from posts.
+$md_wp_comments = true; # Set to false to remove Markdown from comments.
+
+
+# -- WordPress Plugin Interface -----------------------------------------------
+/*
+Plugin Name: Markdown
+Plugin URI: http://www.michelf.com/projects/php-markdown/
+Description: <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>
+Version: 1.0.1b
+Author: Michel Fortin
+Author URI: http://www.michelf.com/
+*/
+if (isset($wp_version)) {
+ # More details about how it works here:
+ # <http://www.michelf.com/weblog/2005/wordpress-text-flow-vs-markdown/>
+
+ # Post content and excerpts
+ if ($md_wp_posts) {
+ remove_filter('the_content', 'wpautop');
+ remove_filter('the_excerpt', 'wpautop');
+ add_filter('the_content', 'Markdown', 6);
+ add_filter('get_the_excerpt', 'Markdown', 6);
+ add_filter('get_the_excerpt', 'trim', 7);
+ add_filter('the_excerpt', 'md_add_p');
+ add_filter('the_excerpt_rss', 'md_strip_p');
+
+ remove_filter('content_save_pre', 'balanceTags', 50);
+ remove_filter('excerpt_save_pre', 'balanceTags', 50);
+ add_filter('the_content', 'balanceTags', 50);
+ add_filter('get_the_excerpt', 'balanceTags', 9);
+
+ function md_add_p($text) {
+ if (strlen($text) == 0) return;
+ if (strcasecmp(substr($text, -3), '<p>') == 0) return $text;
+ return '<p>'.$text.'</p>';
+ }
+ function md_strip_p($t) { return preg_replace('{</?[pP]>}', '', $t); }
+ }
+
+ # Comments
+ if ($md_wp_comments) {
+ remove_filter('comment_text', 'wpautop');
+ remove_filter('comment_text', 'make_clickable');
+ add_filter('pre_comment_content', 'Markdown', 6);
+ add_filter('pre_comment_content', 'md_hide_tags', 8);
+ add_filter('pre_comment_content', 'md_show_tags', 12);
+ add_filter('get_comment_text', 'Markdown', 6);
+ add_filter('get_comment_excerpt', 'Markdown', 6);
+ add_filter('get_comment_excerpt', 'md_strip_p', 7);
+
+ global $md_hidden_tags;
+ $md_hidden_tags = array(
+ '<p>' => md5('<p>'), '</p>' => md5('</p>'),
+ '<pre>' => md5('<pre>'), '</pre>'=> md5('</pre>'),
+ '<ol>' => md5('<ol>'), '</ol>' => md5('</ol>'),
+ '<ul>' => md5('<ul>'), '</ul>' => md5('</ul>'),
+ '<li>' => md5('<li>'), '</li>' => md5('</li>'),
+ );
+
+ function md_hide_tags($text) {
+ global $md_hidden_tags;
+ return str_replace(array_keys($md_hidden_tags),
+ array_values($md_hidden_tags), $text);
+ }
+ function md_show_tags($text) {
+ global $md_hidden_tags;
+ return str_replace(array_values($md_hidden_tags),
+ array_keys($md_hidden_tags), $text);
+ }
+ }
+}
+
+
+# -- bBlog Plugin Info --------------------------------------------------------
+function identify_modifier_markdown() {
+ global $MarkdownPHPVersion;
+ return array(
+ 'name' => 'markdown',
+ 'type' => 'modifier',
+ 'nicename' => 'Markdown',
+ 'description' => 'A text-to-HTML conversion tool for web writers',
+ 'authors' => 'Michel Fortin and John Gruber',
+ 'licence' => 'GPL',
+ 'version' => $MarkdownPHPVersion,
+ 'help' => '<a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a> allows you to write using an easy-to-read, easy-to-write plain text format. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>. <a href="http://www.michelf.com/projects/php-markdown/">More...</a>'
+ );
+}
+
+# -- Smarty Modifier Interface ------------------------------------------------
+function smarty_modifier_markdown($text) {
+ return Markdown($text);
+}
+
+# -- Textile Compatibility Mode -----------------------------------------------
+# Rename this file to "classTextile.php" and it can replace Textile anywhere.
+if (strcasecmp(substr(__FILE__, -16), "classTextile.php") == 0) {
+ # Try to include PHP SmartyPants. Should be in the same directory.
+ @include_once 'smartypants.php';
+ # Fake Textile class. It calls Markdown instead.
+ class Textile {
+ function TextileThis($text, $lite='', $encode='', $noimage='', $strict='') {
+ if ($lite == '' && $encode == '') $text = Markdown($text);
+ if (function_exists('SmartyPants')) $text = SmartyPants($text);
+ return $text;
+ }
+ }
+}
+
+
+
+#
+# Globals:
+#
+
+# Regex to match balanced [brackets].
+# Needed to insert a maximum bracked depth while converting to PHP.
+$md_nested_brackets_depth = 6;
+$md_nested_brackets =
+ str_repeat('(?>[^\[\]]+|\[', $md_nested_brackets_depth).
+ str_repeat('\])*', $md_nested_brackets_depth);
+
+# Table of hash values for escaped characters:
+$md_escape_table = array(
+ "\\" => md5("\\"),
+ "`" => md5("`"),
+ "*" => md5("*"),
+ "_" => md5("_"),
+ "{" => md5("{"),
+ "}" => md5("}"),
+ "[" => md5("["),
+ "]" => md5("]"),
+ "(" => md5("("),
+ ")" => md5(")"),
+ ">" => md5(">"),
+ "#" => md5("#"),
+ "+" => md5("+"),
+ "-" => md5("-"),
+ "." => md5("."),
+ "!" => md5("!")
+);
+# Create an identical table but for escaped characters.
+$md_backslash_escape_table;
+foreach ($md_escape_table as $key => $char)
+ $md_backslash_escape_table["\\$key"] = $char;
+
+
+function Markdown($text) {
+#
+# Main function. The order in which other subs are called here is
+# essential. Link and image substitutions need to happen before
+# _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
+# and <img> tags get encoded.
+#
+ # Clear the global hashes. If we don't clear these, you get conflicts
+ # from other articles when generating a page which contains more than
+ # one article (e.g. an index page that shows the N most recent
+ # articles):
+ global $md_urls, $md_titles, $md_html_blocks;
+ $md_urls = array();
+ $md_titles = array();
+ $md_html_blocks = array();
+
+ # Standardize line endings:
+ # DOS to Unix and Mac to Unix
+ $text = str_replace(array("\r\n", "\r"), "\n", $text);
+
+ # Make sure $text ends with a couple of newlines:
+ $text .= "\n\n";
+
+ # Convert all tabs to spaces.
+ $text = _Detab($text);
+
+ # Strip any lines consisting only of spaces and tabs.
+ # This makes subsequent regexen easier to write, because we can
+ # match consecutive blank lines with /\n+/ instead of something
+ # contorted like /[ \t]*\n+/ .
+ $text = preg_replace('/^[ \t]+$/m', '', $text);
+
+ # Turn block-level HTML blocks into hash entries
+ $text = _HashHTMLBlocks($text);
+
+ # Strip link definitions, store in hashes.
+ $text = _StripLinkDefinitions($text);
+
+ $text = _RunBlockGamut($text);
+
+ $text = _UnescapeSpecialChars($text);
+
+ return $text . "\n";
+}
+
+
+function _StripLinkDefinitions($text) {
+#
+# Strips link definitions from text, stores the URLs and titles in
+# hash references.
+#
+ global $md_tab_width;
+ $less_than_tab = $md_tab_width - 1;
+
+ # Link defs are in the form: ^[id]: url "optional title"
+ $text = preg_replace_callback('{
+ ^[ ]{0,'.$less_than_tab.'}\[(.+)\]: # id = $1
+ [ \t]*
+ \n? # maybe *one* newline
+ [ \t]*
+ <?(\S+?)>? # url = $2
+ [ \t]*
+ \n? # maybe one newline
+ [ \t]*
+ (?:
+ (?<=\s) # lookbehind for whitespace
+ ["(]
+ (.+?) # title = $3
+ [")]
+ [ \t]*
+ )? # title is optional
+ (?:\n+|\Z)
+ }xm',
+ '_StripLinkDefinitions_callback',
+ $text);
+ return $text;
+}
+function _StripLinkDefinitions_callback($matches) {
+ global $md_urls, $md_titles;
+ $link_id = strtolower($matches[1]);
+ $md_urls[$link_id] = _EncodeAmpsAndAngles($matches[2]);
+ if (isset($matches[3]))
+ $md_titles[$link_id] = str_replace('"', '&quot;', $matches[3]);
+ return ''; # String that will replace the block
+}
+
+
+function _HashHTMLBlocks($text) {
+ global $md_tab_width;
+ $less_than_tab = $md_tab_width - 1;
+
+ # Hashify HTML blocks:
+ # We only want to do this for block-level HTML tags, such as headers,
+ # lists, and tables. That's because we still want to wrap <p>s around
+ # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ # phrase emphasis, and spans. The list of tags we're looking for is
+ # hard-coded:
+ $block_tags_a = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|'.
+ 'script|noscript|form|fieldset|iframe|math|ins|del';
+ $block_tags_b = 'p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|'.
+ 'script|noscript|form|fieldset|iframe|math';
+
+ # First, look for nested blocks, e.g.:
+ # <div>
+ # <div>
+ # tags for inner block must be indented.
+ # </div>
+ # </div>
+ #
+ # The outermost tags must start at the left margin for this to match, and
+ # the inner nested divs must be indented.
+ # We need to do this before the next, more liberal match, because the next
+ # match will start at the first `<div>` and stop at the first `</div>`.
+ $text = preg_replace_callback("{
+ ( # save in $1
+ ^ # start of line (with /m)
+ <($block_tags_a) # start tag = $2
+ \\b # word break
+ (.*\\n)*? # any number of lines, minimally matching
+ </\\2> # the matching end tag
+ [ \\t]* # trailing spaces/tabs
+ (?=\\n+|\\Z) # followed by a newline or end of document
+ )
+ }xm",
+ '_HashHTMLBlocks_callback',
+ $text);
+
+ #
+ # Now match more liberally, simply from `\n<tag>` to `</tag>\n`
+ #
+ $text = preg_replace_callback("{
+ ( # save in $1
+ ^ # start of line (with /m)
+ <($block_tags_b) # start tag = $2
+ \\b # word break
+ (.*\\n)*? # any number of lines, minimally matching
+ .*</\\2> # the matching end tag
+ [ \\t]* # trailing spaces/tabs
+ (?=\\n+|\\Z) # followed by a newline or end of document
+ )
+ }xm",
+ '_HashHTMLBlocks_callback',
+ $text);
+
+ # Special case just for <hr />. It was easier to make a special case than
+ # to make the other regex more complicated.
+ $text = preg_replace_callback('{
+ (?:
+ (?<=\n\n) # Starting after a blank line
+ | # or
+ \A\n? # the beginning of the doc
+ )
+ ( # save in $1
+ [ ]{0,'.$less_than_tab.'}
+ <(hr) # start tag = $2
+ \b # word break
+ ([^<>])*? #
+ /?> # the matching end tag
+ [ \t]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+ )
+ }x',
+ '_HashHTMLBlocks_callback',
+ $text);
+
+ # Special case for standalone HTML comments:
+ $text = preg_replace_callback('{
+ (?:
+ (?<=\n\n) # Starting after a blank line
+ | # or
+ \A\n? # the beginning of the doc
+ )
+ ( # save in $1
+ [ ]{0,'.$less_than_tab.'}
+ (?s:
+ <!
+ (--.*?--\s*)+
+ >
+ )
+ [ \t]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+ )
+ }x',
+ '_HashHTMLBlocks_callback',
+ $text);
+
+ return $text;
+}
+function _HashHTMLBlocks_callback($matches) {
+ global $md_html_blocks;
+ $text = $matches[1];
+ $key = md5($text);
+ $md_html_blocks[$key] = $text;
+ return "\n\n$key\n\n"; # String that will replace the block
+}
+
+
+function _RunBlockGamut($text) {
+#
+# These are all the transformations that form block-level
+# tags like paragraphs, headers, and list items.
+#
+ global $md_empty_element_suffix;
+
+ $text = _DoHeaders($text);
+
+ # Do Horizontal Rules:
+ $text = preg_replace(
+ array('{^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$}mx',
+ '{^[ ]{0,2}([ ]? -[ ]?){3,}[ \t]*$}mx',
+ '{^[ ]{0,2}([ ]? _[ ]?){3,}[ \t]*$}mx'),
+ "\n<hr$md_empty_element_suffix\n",
+ $text);
+
+ $text = _DoLists($text);
+ $text = _DoCodeBlocks($text);
+ $text = _DoBlockQuotes($text);
+
+ # We already ran _HashHTMLBlocks() before, in Markdown(), but that
+ # was to escape raw HTML in the original Markdown source. This time,
+ # we're escaping the markup we've just created, so that we don't wrap
+ # <p> tags around block-level tags.
+ $text = _HashHTMLBlocks($text);
+ $text = _FormParagraphs($text);
+
+ return $text;
+}
+
+
+function _RunSpanGamut($text) {
+#
+# These are all the transformations that occur *within* block-level
+# tags like paragraphs, headers, and list items.
+#
+ global $md_empty_element_suffix;
+
+ $text = _DoCodeSpans($text);
+
+ $text = _EscapeSpecialChars($text);
+
+ # Process anchor and image tags. Images must come first,
+ # because ![foo][f] looks like an anchor.
+ $text = _DoImages($text);
+ $text = _DoAnchors($text);
+
+ # Make links out of things like `<http://example.com/>`
+ # Must come after _DoAnchors(), because you can use < and >
+ # delimiters in inline links like [this](<url>).
+ $text = _DoAutoLinks($text);
+ $text = _EncodeAmpsAndAngles($text);
+ $text = _DoItalicsAndBold($text);
+
+ # Do hard breaks:
+ $text = preg_replace('/ {2,}\n/', "<br$md_empty_element_suffix\n", $text);
+
+ return $text;
+}
+
+
+function _EscapeSpecialChars($text) {
+ global $md_escape_table;
+ $tokens = _TokenizeHTML($text);
+
+ $text = ''; # rebuild $text from the tokens
+# $in_pre = 0; # Keep track of when we're inside <pre> or <code> tags.
+# $tags_to_skip = "!<(/?)(?:pre|code|kbd|script|math)[\s>]!";
+
+ foreach ($tokens as $cur_token) {
+ if ($cur_token[0] == 'tag') {
+ # Within tags, encode * and _ so they don't conflict
+ # with their use in Markdown for italics and strong.
+ # We're replacing each such character with its
+ # corresponding MD5 checksum value; this is likely
+ # overkill, but it should prevent us from colliding
+ # with the escape values by accident.
+ $cur_token[1] = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $cur_token[1]);
+ $text .= $cur_token[1];
+ } else {
+ $t = $cur_token[1];
+ $t = _EncodeBackslashEscapes($t);
+ $text .= $t;
+ }
+ }
+ return $text;
+}
+
+
+function _DoAnchors($text) {
+#
+# Turn Markdown link shortcuts into XHTML <a> tags.
+#
+ global $md_nested_brackets;
+ #
+ # First, handle reference-style links: [link text] [id]
+ #
+ $text = preg_replace_callback("{
+ ( # wrap whole match in $1
+ \\[
+ ($md_nested_brackets) # link text = $2
+ \\]
+
+ [ ]? # one optional space
+ (?:\\n[ ]*)? # one optional newline followed by spaces
+
+ \\[
+ (.*?) # id = $3
+ \\]
+ )
+ }xs",
+ '_DoAnchors_reference_callback', $text);
+
+ #
+ # Next, inline-style links: [link text](url "optional title")
+ #
+ $text = preg_replace_callback("{
+ ( # wrap whole match in $1
+ \\[
+ ($md_nested_brackets) # link text = $2
+ \\]
+ \\( # literal paren
+ [ \\t]*
+ <?(.*?)>? # href = $3
+ [ \\t]*
+ ( # $4
+ (['\"]) # quote char = $5
+ (.*?) # Title = $6
+ \\5 # matching quote
+ )? # title is optional
+ \\)
+ )
+ }xs",
+ '_DoAnchors_inline_callback', $text);
+
+ return $text;
+}
+function _DoAnchors_reference_callback($matches) {
+ global $md_urls, $md_titles, $md_escape_table;
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($link_text); # for shortcut links like [this][].
+ }
+
+ if (isset($md_urls[$link_id])) {
+ $url = $md_urls[$link_id];
+ # We've got to encode these to avoid conflicting with italics/bold.
+ $url = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $url);
+ $result = "<a href=\"$url\"";
+ if ( isset( $md_titles[$link_id] ) ) {
+ $title = $md_titles[$link_id];
+ $title = str_replace(array('*', '_'),
+ array($md_escape_table['*'],
+ $md_escape_table['_']), $title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= ">$link_text</a>";
+ }
+ else {
+ $result = $whole_match;
+ }
+ return $result;
+}
+function _DoAnchors_inline_callback($matches) {
+ global $md_escape_table;
+ $whole_match = $matches[1];
+ $link_text = $matches[2];
+ $url = $matches[3];
+ $title =& $matches[6];
+
+ # We've got to encode these to avoid conflicting with italics/bold.
+ $url = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $url);
+ $result = "<a href=\"$url\"";
+ if (isset($title)) {
+ $title = str_replace('"', '&quot;', $title);
+ $title = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $title);
+ $result .= " title=\"$title\"";
+ }
+
+ $result .= ">$link_text</a>";
+
+ return $result;
+}
+
+
+function _DoImages($text) {
+#
+# Turn Markdown image shortcuts into <img> tags.
+#
+ global $md_nested_brackets;
+
+ #
+ # First, handle reference-style labeled images: ![alt text][id]
+ #
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$md_nested_brackets.') # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }xs',
+ '_DoImages_reference_callback', $text);
+
+ #
+ # Next, handle inline images: ![alt text](url "optional title")
+ # Don't forget: encode * and _
+
+ $text = preg_replace_callback('{
+ ( # wrap whole match in $1
+ !\[
+ ('.$md_nested_brackets.') # alt text = $2
+ \]
+ \( # literal paren
+ [ \t]*
+ <?(\S+?)>? # src url = $3
+ [ \t]*
+ ( # $4
+ ([\'"]) # quote char = $5
+ (.*?) # title = $6
+ \5 # matching quote
+ [ \t]*
+ )? # title is optional
+ \)
+ )
+ }xs',
+ '_DoImages_inline_callback', $text);
+
+ return $text;
+}
+function _DoImages_reference_callback($matches) {
+ global $md_urls, $md_titles, $md_empty_element_suffix, $md_escape_table;
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $link_id = strtolower($matches[3]);
+
+ if ($link_id == "") {
+ $link_id = strtolower($alt_text); # for shortcut links like ![this][].
+ }
+
+ $alt_text = str_replace('"', '&quot;', $alt_text);
+ if (isset($md_urls[$link_id])) {
+ $url = $md_urls[$link_id];
+ # We've got to encode these to avoid conflicting with italics/bold.
+ $url = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $url);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($md_titles[$link_id])) {
+ $title = $md_titles[$link_id];
+ $title = str_replace(array('*', '_'),
+ array($md_escape_table['*'],
+ $md_escape_table['_']), $title);
+ $result .= " title=\"$title\"";
+ }
+ $result .= $md_empty_element_suffix;
+ }
+ else {
+ # If there's no such link ID, leave intact:
+ $result = $whole_match;
+ }
+
+ return $result;
+}
+function _DoImages_inline_callback($matches) {
+ global $md_empty_element_suffix, $md_escape_table;
+ $whole_match = $matches[1];
+ $alt_text = $matches[2];
+ $url = $matches[3];
+ $title = '';
+ if (isset($matches[6])) {
+ $title = $matches[6];
+ }
+
+ $alt_text = str_replace('"', '&quot;', $alt_text);
+ $title = str_replace('"', '&quot;', $title);
+ # We've got to encode these to avoid conflicting with italics/bold.
+ $url = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $url);
+ $result = "<img src=\"$url\" alt=\"$alt_text\"";
+ if (isset($title)) {
+ $title = str_replace(array('*', '_'),
+ array($md_escape_table['*'], $md_escape_table['_']),
+ $title);
+ $result .= " title=\"$title\""; # $title already quoted
+ }
+ $result .= $md_empty_element_suffix;
+
+ return $result;
+}
+
+
+function _DoHeaders($text) {
+ # Setext-style headers:
+ # Header 1
+ # ========
+ #
+ # Header 2
+ # --------
+ #
+ $text = preg_replace(
+ array('{ ^(.+)[ \t]*\n=+[ \t]*\n+ }emx',
+ '{ ^(.+)[ \t]*\n-+[ \t]*\n+ }emx'),
+ array("'<h1>'._RunSpanGamut(_UnslashQuotes('\\1')).'</h1>\n\n'",
+ "'<h2>'._RunSpanGamut(_UnslashQuotes('\\1')).'</h2>\n\n'"),
+ $text);
+
+ # atx-style headers:
+ # # Header 1
+ # ## Header 2
+ # ## Header 2 with closing hashes ##
+ # ...
+ # ###### Header 6
+ #
+ $text = preg_replace("{
+ ^(\\#{1,6}) # $1 = string of #'s
+ [ \\t]*
+ (.+?) # $2 = Header text
+ [ \\t]*
+ \\#* # optional closing #'s (not counted)
+ \\n+
+ }xme",
+ "'<h'.strlen('\\1').'>'._RunSpanGamut(_UnslashQuotes('\\2')).'</h'.strlen('\\1').'>\n\n'",
+ $text);
+
+ return $text;
+}
+
+
+function _DoLists($text) {
+#
+# Form HTML ordered (numbered) and unordered (bulleted) lists.
+#
+ global $md_tab_width, $md_list_level;
+ $less_than_tab = $md_tab_width - 1;
+
+ # Re-usable patterns to match list item bullets and number markers:
+ $marker_ul = '[*+-]';
+ $marker_ol = '\d+[.]';
+ $marker_any = "(?:$marker_ul|$marker_ol)";
+
+ $markers = array($marker_ul, $marker_ol);
+
+ foreach ($markers as $marker) {
+ # Re-usable pattern to match any entirel ul or ol list:
+ $whole_list = '
+ ( # $1 = whole list
+ ( # $2
+ [ ]{0,'.$less_than_tab.'}
+ ('.$marker.') # $3 = first list item marker
+ [ \t]+
+ )
+ (?s:.+?)
+ ( # $4
+ \z
+ |
+ \n{2,}
+ (?=\S)
+ (?! # Negative lookahead for another list item marker
+ [ \t]*
+ '.$marker.'[ \t]+
+ )
+ )
+ )
+ '; // mx
+
+ # We use a different prefix before nested lists than top-level lists.
+ # See extended comment in _ProcessListItems().
+
+ if ($md_list_level) {
+ $text = preg_replace_callback('{
+ ^
+ '.$whole_list.'
+ }mx',
+ '_DoLists_callback_top', $text);
+ }
+ else {
+ $text = preg_replace_callback('{
+ (?:(?<=\n\n)|\A\n?)
+ '.$whole_list.'
+ }mx',
+ '_DoLists_callback_nested', $text);
+ }
+ }
+
+ return $text;
+}
+function _DoLists_callback_top($matches) {
+ # Re-usable patterns to match list item bullets and number markers:
+ $marker_ul = '[*+-]';
+ $marker_ol = '\d+[.]';
+ $marker_any = "(?:$marker_ul|$marker_ol)";
+
+ $list = $matches[1];
+ $list_type = preg_match("/$marker_ul/", $matches[3]) ? "ul" : "ol";
+
+ $marker_any = ( $list_type == "ul" ? $marker_ul : $marker_ol );
+
+ # Turn double returns into triple returns, so that we can make a
+ # paragraph for the last item in a list, if necessary:
+ $list = preg_replace("/\n{2,}/", "\n\n\n", $list);
+ $result = _ProcessListItems($list, $marker_any);
+
+ # Trim any trailing whitespace, to put the closing `</$list_type>`
+ # up on the preceding line, to get it past the current stupid
+ # HTML block parser. This is a hack to work around the terrible
+ # hack that is the HTML block parser.
+ $result = rtrim($result);
+ $result = "<$list_type>" . $result . "</$list_type>\n";
+ return $result;
+}
+function _DoLists_callback_nested($matches) {
+ # Re-usable patterns to match list item bullets and number markers:
+ $marker_ul = '[*+-]';
+ $marker_ol = '\d+[.]';
+ $marker_any = "(?:$marker_ul|$marker_ol)";
+
+ $list = $matches[1];
+ $list_type = preg_match("/$marker_ul/", $matches[3]) ? "ul" : "ol";
+
+ $marker_any = ( $list_type == "ul" ? $marker_ul : $marker_ol );
+
+ # Turn double returns into triple returns, so that we can make a
+ # paragraph for the last item in a list, if necessary:
+ $list = preg_replace("/\n{2,}/", "\n\n\n", $list);
+ $result = _ProcessListItems($list, $marker_any);
+ $result = "<$list_type>\n" . $result . "</$list_type>\n";
+ return $result;
+}
+
+
+function _ProcessListItems($list_str, $marker_any) {
+#
+# Process the contents of a single ordered or unordered list, splitting it
+# into individual list items.
+#
+ global $md_list_level;
+
+ # The $md_list_level global keeps track of when we're inside a list.
+ # Each time we enter a list, we increment it; when we leave a list,
+ # we decrement. If it's zero, we're not in a list anymore.
+ #
+ # We do this because when we're not inside a list, we want to treat
+ # something like this:
+ #
+ # I recommend upgrading to version
+ # 8. Oops, now this line is treated
+ # as a sub-list.
+ #
+ # As a single paragraph, despite the fact that the second line starts
+ # with a digit-period-space sequence.
+ #
+ # Whereas when we're inside a list (or sub-list), that line will be
+ # treated as the start of a sub-list. What a kludge, huh? This is
+ # an aspect of Markdown's syntax that's hard to parse perfectly
+ # without resorting to mind-reading. Perhaps the solution is to
+ # change the syntax rules such that sub-lists must start with a
+ # starting cardinal number; e.g. "1." or "a.".
+
+ $md_list_level++;
+
+ # trim trailing blank lines:
+ $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str);
+
+ $list_str = preg_replace_callback('{
+ (\n)? # leading line = $1
+ (^[ \t]*) # leading whitespace = $2
+ ('.$marker_any.') [ \t]+ # list marker = $3
+ ((?s:.+?) # list item text = $4
+ (\n{1,2}))
+ (?= \n* (\z | \2 ('.$marker_any.') [ \t]+))
+ }xm',
+ '_ProcessListItems_callback', $list_str);
+
+ $md_list_level--;
+ return $list_str;
+}
+function _ProcessListItems_callback($matches) {
+ $item = $matches[4];
+ $leading_line =& $matches[1];
+ $leading_space =& $matches[2];
+
+ if ($leading_line || preg_match('/\n{2,}/', $item)) {
+ $item = _RunBlockGamut(_Outdent($item));
+ }
+ else {
+ # Recursion for sub-lists:
+ $item = _DoLists(_Outdent($item));
+ $item = preg_replace('/\n+$/', '', $item);
+ $item = _RunSpanGamut($item);
+ }
+
+ return "<li>" . $item . "</li>\n";
+}
+
+
+function _DoCodeBlocks($text) {
+#
+# Process Markdown `<pre><code>` blocks.
+#
+ global $md_tab_width;
+ $text = preg_replace_callback("{
+ (?:\\n\\n|\\A)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?:
+ (?:[ ]\{$md_tab_width} | \\t) # Lines must start with a tab or a tab-width of spaces
+ .*\\n+
+ )+
+ )
+ ((?=^[ ]{0,$md_tab_width}\\S)|\\Z) # Lookahead for non-space at line-start, or end of doc
+ }xm",
+ '_DoCodeBlocks_callback', $text);
+
+ return $text;
+}
+function _DoCodeBlocks_callback($matches) {
+ $codeblock = $matches[1];
+
+ $codeblock = _EncodeCode(_Outdent($codeblock));
+// $codeblock = _Detab($codeblock);
+ # trim leading newlines and trailing whitespace
+ $codeblock = preg_replace(array('/\A\n+/', '/\s+\z/'), '', $codeblock);
+
+ $result = "\n\n<pre><code>" . $codeblock . "\n</code></pre>\n\n";
+
+ return $result;
+}
+
+
+function _DoCodeSpans($text) {
+#
+# * Backtick quotes are used for <code></code> spans.
+#
+# * You can use multiple backticks as the delimiters if you want to
+# include literal backticks in the code span. So, this input:
+#
+# Just type ``foo `bar` baz`` at the prompt.
+#
+# Will translate to:
+#
+# <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
+#
+# There's no arbitrary limit to the number of backticks you
+# can use as delimters. If you need three consecutive backticks
+# in your code, use four for delimiters, etc.
+#
+# * You can use spaces to get literal backticks at the edges:
+#
+# ... type `` `bar` `` ...
+#
+# Turns to:
+#
+# ... type <code>`bar`</code> ...
+#
+ $text = preg_replace_callback('@
+ (?<!\\\) # Character before opening ` can\'t be a backslash
+ (`+) # $1 = Opening run of `
+ (.+?) # $2 = The code block
+ (?<!`)
+ \1 # Matching closer
+ (?!`)
+ @xs',
+ '_DoCodeSpans_callback', $text);
+
+ return $text;
+}
+function _DoCodeSpans_callback($matches) {
+ $c = $matches[2];
+ $c = preg_replace('/^[ \t]*/', '', $c); # leading whitespace
+ $c = preg_replace('/[ \t]*$/', '', $c); # trailing whitespace
+ $c = _EncodeCode($c);
+ return "<code>$c</code>";
+}
+
+
+function _EncodeCode($_) {
+#
+# Encode/escape certain characters inside Markdown code runs.
+# The point is that in code, these characters are literals,
+# and lose their special Markdown meanings.
+#
+ global $md_escape_table;
+
+ # Encode all ampersands; HTML entities are not
+ # entities within a Markdown code span.
+ $_ = str_replace('&', '&amp;', $_);
+
+ # Do the angle bracket song and dance:
+ $_ = str_replace(array('<', '>'),
+ array('&lt;', '&gt;'), $_);
+
+ # Now, escape characters that are magic in Markdown:
+ $_ = str_replace(array_keys($md_escape_table),
+ array_values($md_escape_table), $_);
+
+ return $_;
+}
+
+
+function _DoItalicsAndBold($text) {
+ # <strong> must go first:
+ $text = preg_replace('{
+ ( # $1: Marker
+ (?<!\*\*) \*\* | # (not preceded by two chars of
+ (?<!__) __ # the same marker)
+ )
+ (?=\S) # Not followed by whitespace
+ (?!\1) # or two others marker chars.
+ ( # $2: Content
+ (?:
+ [^*_]+? # Anthing not em markers.
+ |
+ # Balence any regular emphasis inside.
+ ([*_]) (?=\S) .+? (?<=\S) \3 # $3: em char (* or _)
+ |
+ (?! \1 ) . # Allow unbalenced * and _.
+ )+?
+ )
+ (?<=\S) \1 # End mark not preceded by whitespace.
+ }sx',
+ '<strong>\2</strong>', $text);
+ # Then <em>:
+ $text = preg_replace(
+ '{ ( (?<!\*)\* | (?<!_)_ ) (?=\S) (?! \1) (.+?) (?<=\S) \1 }sx',
+ '<em>\2</em>', $text);
+
+ return $text;
+}
+
+
+function _DoBlockQuotes($text) {
+ $text = preg_replace_callback('/
+ ( # Wrap whole match in $1
+ (
+ ^[ \t]*>[ \t]? # ">" at the start of a line
+ .+\n # rest of the first line
+ (.+\n)* # subsequent consecutive lines
+ \n* # blanks
+ )+
+ )
+ /xm',
+ '_DoBlockQuotes_callback', $text);
+
+ return $text;
+}
+function _DoBlockQuotes_callback($matches) {
+ $bq = $matches[1];
+ # trim one level of quoting - trim whitespace-only lines
+ $bq = preg_replace(array('/^[ \t]*>[ \t]?/m', '/^[ \t]+$/m'), '', $bq);
+ $bq = _RunBlockGamut($bq); # recurse
+
+ $bq = preg_replace('/^/m', " ", $bq);
+ # These leading spaces screw with <pre> content, so we need to fix that:
+ $bq = preg_replace_callback('{(\s*<pre>.+?</pre>)}sx',
+ '_DoBlockQuotes_callback2', $bq);
+
+ return "<blockquote>\n$bq\n</blockquote>\n\n";
+}
+function _DoBlockQuotes_callback2($matches) {
+ $pre = $matches[1];
+ $pre = preg_replace('/^ /m', '', $pre);
+ return $pre;
+}
+
+
+function _FormParagraphs($text) {
+#
+# Params:
+# $text - string to process with html <p> tags
+#
+ global $md_html_blocks;
+
+ # Strip leading and trailing lines:
+ $text = preg_replace(array('/\A\n+/', '/\n+\z/'), '', $text);
+
+ $grafs = preg_split('/\n{2,}/', $text, -1, PREG_SPLIT_NO_EMPTY);
+
+ #
+ # Wrap <p> tags.
+ #
+ foreach ($grafs as $key => $value) {
+ if (!isset( $md_html_blocks[$value] )) {
+ $value = _RunSpanGamut($value);
+ $value = preg_replace('/^([ \t]*)/', '<p>', $value);
+ $value .= "</p>";
+ $grafs[$key] = $value;
+ }
+ }
+
+ #
+ # Unhashify HTML blocks
+ #
+ foreach ($grafs as $key => $value) {
+ if (isset( $md_html_blocks[$value] )) {
+ $grafs[$key] = $md_html_blocks[$value];
+ }
+ }
+
+ return implode("\n\n", $grafs);
+}
+
+
+function _EncodeAmpsAndAngles($text) {
+# Smart processing for ampersands and angle brackets that need to be encoded.
+
+ # Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
+ # http://bumppo.net/projects/amputator/
+ $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/',
+ '&amp;', $text);;
+
+ # Encode naked <'s
+ $text = preg_replace('{<(?![a-z/?\$!])}i', '&lt;', $text);
+
+ return $text;
+}
+
+
+function _EncodeBackslashEscapes($text) {
+#
+# Parameter: String.
+# Returns: The string, with after processing the following backslash
+# escape sequences.
+#
+ global $md_escape_table, $md_backslash_escape_table;
+ # Must process escaped backslashes first.
+ return str_replace(array_keys($md_backslash_escape_table),
+ array_values($md_backslash_escape_table), $text);
+}
+
+
+function _DoAutoLinks($text) {
+ $text = preg_replace("!<((https?|ftp):[^'\">\\s]+)>!",
+ '<a href="\1">\1</a>', $text);
+
+ # Email addresses: <address@domain.foo>
+ $text = preg_replace('{
+ <
+ (?:mailto:)?
+ (
+ [-.\w]+
+ \@
+ [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
+ )
+ >
+ }exi',
+ "_EncodeEmailAddress(_UnescapeSpecialChars(_UnslashQuotes('\\1')))",
+ $text);
+
+ return $text;
+}
+
+
+function _EncodeEmailAddress($addr) {
+#
+# Input: an email address, e.g. "foo@example.com"
+#
+# Output: the email address as a mailto link, with each character
+# of the address encoded as either a decimal or hex entity, in
+# the hopes of foiling most address harvesting spam bots. E.g.:
+#
+# <a href="&#x6D;&#97;&#105;&#108;&#x74;&#111;:&#102;&#111;&#111;&#64;&#101;
+# x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;">&#102;&#111;&#111;
+# &#64;&#101;x&#x61;&#109;&#x70;&#108;&#x65;&#x2E;&#99;&#111;&#109;</a>
+#
+# Based by a filter by Matthew Wickline, posted to the BBEdit-Talk
+# mailing list: <http://tinyurl.com/yu7ue>
+#
+ $addr = "mailto:" . $addr;
+ $length = strlen($addr);
+
+ # leave ':' alone (to spot mailto: later)
+ $addr = preg_replace_callback('/([^\:])/',
+ '_EncodeEmailAddress_callback', $addr);
+
+ $addr = "<a href=\"$addr\">$addr</a>";
+ # strip the mailto: from the visible part
+ $addr = preg_replace('/">.+?:/', '">', $addr);
+
+ return $addr;
+}
+function _EncodeEmailAddress_callback($matches) {
+ $char = $matches[1];
+ $r = rand(0, 100);
+ # roughly 10% raw, 45% hex, 45% dec
+ # '@' *must* be encoded. I insist.
+ if ($r > 90 && $char != '@') return $char;
+ if ($r < 45) return '&#x'.dechex(ord($char)).';';
+ return '&#'.ord($char).';';
+}
+
+
+function _UnescapeSpecialChars($text) {
+#
+# Swap back in all the special characters we've hidden.
+#
+ global $md_escape_table;
+ return str_replace(array_values($md_escape_table),
+ array_keys($md_escape_table), $text);
+}
+
+
+# _TokenizeHTML is shared between PHP Markdown and PHP SmartyPants.
+# We only define it if it is not already defined.
+if (!function_exists('_TokenizeHTML')) :
+function _TokenizeHTML($str) {
+#
+# Parameter: String containing HTML markup.
+# Returns: An array of the tokens comprising the input
+# string. Each token is either a tag (possibly with nested,
+# tags contained therein, such as <a href="<MTFoo>">, or a
+# run of text between tags. Each element of the array is a
+# two-element array; the first is either 'tag' or 'text';
+# the second is the actual value.
+#
+#
+# Regular expression derived from the _tokenize() subroutine in
+# Brad Choate's MTRegex plugin.
+# <http://www.bradchoate.com/past/mtregex.php>
+#
+ $index = 0;
+ $tokens = array();
+
+ $match = '(?s:<!(?:--.*?--\s*)+>)|'. # comment
+ '(?s:<\?.*?\?>)|'. # processing instruction
+ # regular tags
+ '(?:<[/!$]?[-a-zA-Z0-9:]+\b(?>[^"\'>]+|"[^"]*"|\'[^\']*\')*>)';
+
+ $parts = preg_split("{($match)}", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+ foreach ($parts as $part) {
+ if (++$index % 2 && $part != '')
+ $tokens[] = array('text', $part);
+ else
+ $tokens[] = array('tag', $part);
+ }
+
+ return $tokens;
+}
+endif;
+
+
+function _Outdent($text) {
+#
+# Remove one level of line-leading tabs or spaces
+#
+ global $md_tab_width;
+ return preg_replace("/^(\\t|[ ]{1,$md_tab_width})/m", "", $text);
+}
+
+
+function _Detab($text) {
+#
+# Replace tabs with the appropriate amount of space.
+#
+ global $md_tab_width;
+
+ # For each line we separate the line in blocks delemited by
+ # tab characters. Then we reconstruct every line by adding the
+ # appropriate number of space between each blocks.
+
+ $lines = explode("\n", $text);
+ $text = "";
+
+ foreach ($lines as $line) {
+ # Split in blocks.
+ $blocks = explode("\t", $line);
+ # Add each blocks to the line.
+ $line = $blocks[0];
+ unset($blocks[0]); # Do not add first block twice.
+ foreach ($blocks as $block) {
+ # Calculate amount of space, insert spaces, insert block.
+ $amount = $md_tab_width - strlen($line) % $md_tab_width;
+ $line .= str_repeat(" ", $amount) . $block;
+ }
+ $text .= "$line\n";
+ }
+ return $text;
+}
+
+
+function _UnslashQuotes($text) {
+#
+# This function is useful to remove automaticaly slashed double quotes
+# when using preg_replace and evaluating an expression.
+# Parameter: String.
+# Returns: The string with any slash-double-quote (\") sequence replaced
+# by a single double quote.
+#
+ return str_replace('\"', '"', $text);
+}
+
+
+/*
+
+PHP Markdown
+============
+
+Description
+-----------
+
+This is a PHP translation of the original Markdown formatter written in
+Perl by John Gruber.
+
+Markdown is a text-to-HTML filter; it translates an easy-to-read /
+easy-to-write structured text format into HTML. Markdown's text format
+is most similar to that of plain text email, and supports features such
+as headers, *emphasis*, code blocks, blockquotes, and links.
+
+Markdown's syntax is designed not as a generic markup language, but
+specifically to serve as a front-end to (X)HTML. You can use span-level
+HTML tags anywhere in a Markdown document, and you can use block level
+HTML tags (like <div> and <table> as well).
+
+For more information about Markdown's syntax, see:
+
+<http://daringfireball.net/projects/markdown/>
+
+
+Bugs
+----
+
+To file bug reports please send email to:
+
+<michel.fortin@michelf.com>
+
+Please include with your report: (1) the example input; (2) the output you
+expected; (3) the output Markdown actually produced.
+
+
+Version History
+---------------
+
+See the readme file for detailed release notes for this version.
+
+1.0.1b - 6 Jun 2005
+
+1.0.1a - 15 Apr 2005
+
+1.0.1 - 16 Dec 2004
+
+1.0 - 21 Aug 2004
+
+
+Author & Contributors
+---------------------
+
+Original Perl version by John Gruber
+<http://daringfireball.net/>
+
+PHP port and other contributions by Michel Fortin
+<http://www.michelf.com/>
+
+
+Copyright and License
+---------------------
+
+Copyright (c) 2004-2005 Michel Fortin
+<http://www.michelf.com/>
+All rights reserved.
+
+Copyright (c) 2003-2004 John Gruber
+<http://daringfireball.net/>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+* Neither the name "Markdown" nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+This software is provided by the copyright holders and contributors "as
+is" and any express or implied warranties, including, but not limited
+to, the implied warranties of merchantability and fitness for a
+particular purpose are disclaimed. In no event shall the copyright owner
+or contributors be liable for any direct, indirect, incidental, special,
+exemplary, or consequential damages (including, but not limited to,
+procurement of substitute goods or services; loss of use, data, or
+profits; or business interruption) however caused and on any theory of
+liability, whether in contract, strict liability, or tort (including
+negligence or otherwise) arising in any way out of the use of this
+software, even if advised of the possibility of such damage.
+
+*/
+?>
diff --git a/templates/comments.tpl b/templates/comments.tpl
index ef508d3..5536c59 100644
--- a/templates/comments.tpl
+++ b/templates/comments.tpl
@@ -1,5 +1,11 @@
{strip}
<br />
+{if $gBitSystem->isFeatureActive( 'comments_display_expanded' )}
+ {assign var=initial value=none}{assign var=subsequent value=block}{assign var=iname value=expanded}
+{else}
+ {assign var=initial value=block}{assign var=subsequent value=none}{assign var=iname value=collapsed}
+{/if}
+
<div class="display comment">
<div class="header">
@@ -8,18 +14,16 @@
{/if}
<h2>
<a onclick="icntoggle('bitcomments');">
- {biticon ipackage=liberty iname="collapsed" id="bitcommentsimg" iexplain=""} {tr}Comments{/tr}
+ {biticon ipackage=liberty iname=$iname id="bitcommentsimg" iexplain=""} {tr}Comments{/tr}
</a>
</h2>
</div>
{/strip}
- <script type="text/javascript">
- //<![CDATA[
+ <script type="text/javascript">//<![CDATA[
setfoldericonstate('bitcomments');
- document.write('<div id="bitcomments" style="display:{if $smarty.cookies.bitcomments eq 'o'}block{else}none{/if};">');
- //]]>
- </script>
+ document.write('<div id="bitcomments" style="display:{if $smarty.cookies.bitcomments eq 'o'}{$initial}{else}{$subsequent}{/if};">');
+ //]]></script>
{strip}
<div class="body">
diff --git a/templates/edit_format.tpl b/templates/edit_format.tpl
index 15669bd..94263a9 100644
--- a/templates/edit_format.tpl
+++ b/templates/edit_format.tpl
@@ -27,14 +27,13 @@
{/foreach}
{/if}
"
- id="editformatguid"
/> {$plugin.edit_label}</label>
{formhelp note=`$plugin.edit_help`}
{/forminput}
{/if}
{/foreach}
{forminput}
- {formhelp note="You can choose what kind of syntax you want to submit your data in. Some plugins can be used independently of format type. Please view the help at the bottom of the screen for more information."}
+ {formhelp note="Choose what kind of syntax you want to submit your data in."}
{/forminput}
</div>
diff --git a/templates/edit_help_inc.tpl b/templates/edit_help_inc.tpl
index 404f40a..1a9d602 100644
--- a/templates/edit_help_inc.tpl
+++ b/templates/edit_help_inc.tpl
@@ -1,4 +1,4 @@
-{* $Header: /cvsroot/bitweaver/_bit_liberty/templates/edit_help_inc.tpl,v 1.4 2005/08/11 13:03:46 squareing Exp $ *}
+{* $Header: /cvsroot/bitweaver/_bit_liberty/templates/edit_help_inc.tpl,v 1.5 2005/08/24 20:55:17 squareing Exp $ *}
{strip}
{if $gBitSystem->isFeatureActive( 'feature_wikihelp' )}
@@ -41,8 +41,8 @@
{/if}
{if $p.exthelp ne ''}
- <a title="{tr}Extended Help{/tr}" href="javascript:flip('help-{$p.name}');">{tr}Display Extended Help{/tr}</a>
- <div id="help-{$p.name}" style="display: none;">{$p.exthelp}</div>
+ <a title="{tr}Extended Help{/tr}" href="javascript:flip('help-{$p.guid}');">{tr}Display Extended Help{/tr}</a>
+ <div id="help-{$p.guid}" style="display: none;">{$p.exthelp}</div>
{/if}
{if $p.help_page}
diff --git a/templates/edit_structure.tpl b/templates/edit_structure.tpl
index 8a39b20..89cd2f4 100644
--- a/templates/edit_structure.tpl
+++ b/templates/edit_structure.tpl
@@ -3,11 +3,11 @@
{jstab title="Edit Structure"}
{include file="bitpackage:liberty/edit_structure_inc.tpl"}
{/jstab}
-
+{if !$gBitSystem->isFeatureActive( 'wikibook_edit_add_content' )}
{jstab title="Structure Content"}
{include file="bitpackage:liberty/edit_structure_content.tpl"}
{/jstab}
-
+{/if}
{* removing alias stuff until we know what to do with it - XING
{jstab title="Update Alias"}
{include file="bitpackage:liberty/edit_structure_alias.tpl"}
diff --git a/templates/list_content_inc.tpl b/templates/list_content_inc.tpl
index 74386ce..8560e1f 100644
--- a/templates/list_content_inc.tpl
+++ b/templates/list_content_inc.tpl
@@ -12,7 +12,7 @@
{forminput}
<input type="text" name="find_objects" />
- <input type="submit" value="{tr}filter{/tr}" name="search_objects" />
+ <input type="submit" value="{tr}Apply Filter{/tr}" name="search_objects" />
{formhelp note="You can restrict the content listing to a given content type or apply a filter."}
{/forminput}
</div>
@@ -30,21 +30,22 @@
<table class="data">
<caption>{tr}Available Content{/tr} <span class="total">[ {$contentCount} ]</span></caption>
<tr>
- <th>{smartlink ititle="Title" isort=title page=$page user_id=$user_id idefault=1}</th>
- <th>{smartlink ititle="Content Type" isort=content_type_guid page=$page user_id=$user_id}</th>
- <th>{smartlink ititle="Author" isort=$isort_author page=$page}</th>
- <th colspan="2">{smartlink ititle="Most recent editor" isort=$isort_editor page=$page}</th>
+ <th>{smartlink ititle="Title" isort=title page=$page user_id=$user_id idefault=1 content_type_guid=$contentSelect}</th>
+ <th>{smartlink ititle="Content Type" isort=content_type_guid page=$page user_id=$user_id content_type_guid=$contentSelect}</th>
+ <th>{smartlink ititle="Author" isort=$isort_author page=$page content_type_guid=$contentSelect}</th>
+ <th>{smartlink ititle="Most recent editor" isort=$isort_editor page=$page content_type_guid=$contentSelect}</th>
</tr>
{foreach from=$contentList item=item}
<tr class="{cycle values='odd,even'}">
<td>{$item.display_link}</td>
<td>{assign var=content_type_guid value=`$item.content_type_guid`}{$contentTypes.$content_type_guid}</td>
<td>{displayname real_name=$item.creator_real_name user=$item.creator_user}</td>
- <td>{displayname real_name=$item.modifier_real_name user=$item.modifier_user}</td>
- <td style="text-align:right;">{$item.last_modified|bit_short_date}</td>
+ <td style="text-align:right;">
+ {displayname real_name=$item.modifier_real_name user=$item.modifier_user} {$item.last_modified|bit_short_date}
+ </td>
</tr>
{/foreach}
</table>
-{libertypagination numPages=$numPages page=$curPage sort_mode=$sort_mode content_type=$contentSelect user_id=$user_id}
+{libertypagination numPages=$numPages page=$curPage sort_mode=$sort_mode content_type_guid=$contentSelect user_id=$user_id}
{/strip}
diff --git a/templates/services_inc.tpl b/templates/services_inc.tpl
new file mode 100644
index 0000000..bf77c2f
--- /dev/null
+++ b/templates/services_inc.tpl
@@ -0,0 +1,4 @@
+{assign var=serviceLocTpls value=$gLibertySystem->getServiceValues("content_`$serviceLocation`_tpl")}
+{foreach from=$serviceLocTpls key=serviceName item=template}
+ {include file=$template serviceHash=$serviceHash}
+{/foreach} \ No newline at end of file