Merge branch 'master' into privatekey2
Conflicts: data/templates/default/bookmarks.tpl.php
60
build.xml
@ -41,7 +41,6 @@
|
|||||||
|
|
||||||
Test your zip with: unzip -l SemanticScuttle-0.95.0.zip
|
Test your zip with: unzip -l SemanticScuttle-0.95.0.zip
|
||||||
-->
|
-->
|
||||||
<mkdir dir="dist" />
|
|
||||||
<echo msg="Creating distribution zip for SemanticScuttle ${version}"/>
|
<echo msg="Creating distribution zip for SemanticScuttle ${version}"/>
|
||||||
<delete file="${distfile}" failonerror="false"/>
|
<delete file="${distfile}" failonerror="false"/>
|
||||||
<zip destfile="${distfile}" prefix="${phing.project.name}-${version}/">
|
<zip destfile="${distfile}" prefix="${phing.project.name}-${version}/">
|
||||||
@ -121,18 +120,19 @@
|
|||||||
|
|
||||||
<replacement
|
<replacement
|
||||||
path="src/SemanticScuttle/header.php"
|
path="src/SemanticScuttle/header.php"
|
||||||
type="pear-config"
|
type="pear-config" from="@data_dir@" to="data_dir"
|
||||||
from="@data_dir@" to="data_dir"
|
/>
|
||||||
|
<replacement
|
||||||
|
path="src/SemanticScuttle/header.php"
|
||||||
|
type="pear-config" from="@www_dir@" to="www_dir"
|
||||||
/>
|
/>
|
||||||
<replacement
|
<replacement
|
||||||
path="www/www-header.php"
|
path="www/www-header.php"
|
||||||
type="pear-config"
|
type="pear-config" from="@data_dir@" to="data_dir"
|
||||||
from="@data_dir@" to="data_dir"
|
|
||||||
/>
|
/>
|
||||||
<replacement
|
<replacement
|
||||||
path="tests/prepare.php"
|
path="tests/prepare.php"
|
||||||
type="pear-config"
|
type="pear-config" from="@data_dir@" to="data_dir"
|
||||||
from="@data_dir@" to="data_dir"
|
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<changelog version="0.97" date="2010-06-09" license="GPL">
|
<changelog version="0.97" date="2010-06-09" license="GPL">
|
||||||
@ -207,6 +207,48 @@
|
|||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- you need to have the python docutils package installed, since
|
||||||
|
we use the rst2html tool -->
|
||||||
|
<target name="build-docs">
|
||||||
|
<foreach param="fname" absparam="abs-fname" target="build-doc-file">
|
||||||
|
<fileset dir=".">
|
||||||
|
<include name="doc/ChangeLog"/>
|
||||||
|
<include name="doc/**.txt"/>
|
||||||
|
<include name="doc/**.rst"/>
|
||||||
|
<include name="doc/**/*.rst"/>
|
||||||
|
<exclude name="doc/LICENSE.txt"/>
|
||||||
|
<exclude name="doc/developers/TODO.rst"/>
|
||||||
|
</fileset>
|
||||||
|
</foreach>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
|
||||||
|
<target name="build-doc-file" depends="check"
|
||||||
|
description="Builds a single documentation file. Pass file path as $fname"
|
||||||
|
>
|
||||||
|
<echo msg="${fname}"/>
|
||||||
|
<php function="preg_replace" returnProperty="outfile">
|
||||||
|
<param value="/^(.+)(.rst|.txt)$/"/>
|
||||||
|
<param value="dist/\1.html"/>
|
||||||
|
<param value="${fname}"/>
|
||||||
|
</php>
|
||||||
|
|
||||||
|
<!-- only render file if the doc file is newer than the html file -->
|
||||||
|
<property name="isuptodate" value="false"/>
|
||||||
|
<uptodate property="isuptodate" srcfile="${fname}" targetfile="${outfile}" />
|
||||||
|
<if>
|
||||||
|
<not><istrue value="${isuptodate}"/></not>
|
||||||
|
<then>
|
||||||
|
<exec
|
||||||
|
command="rst2html --exit-status=2 ${fname} ${outfile}"
|
||||||
|
checkreturn="1"
|
||||||
|
/>
|
||||||
|
</then>
|
||||||
|
</if>
|
||||||
|
|
||||||
|
</target>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<target name="release" depends="check,zip,package,deploy-sf"
|
<target name="release" depends="check,zip,package,deploy-sf"
|
||||||
description="Release the version on sourceforge"
|
description="Release the version on sourceforge"
|
||||||
@ -314,6 +356,10 @@
|
|||||||
<fail unless="sfuser" message="Sourceforge username not defined!" />
|
<fail unless="sfuser" message="Sourceforge username not defined!" />
|
||||||
<fail unless="sfproject" message="Sourceforge project name not defined!" />
|
<fail unless="sfproject" message="Sourceforge project name not defined!" />
|
||||||
<fail unless="sffilepath" message="Sourceforge project file path not defined!" />
|
<fail unless="sffilepath" message="Sourceforge project file path not defined!" />
|
||||||
|
|
||||||
|
<mkdir dir="dist" />
|
||||||
|
<mkdir dir="dist/doc" />
|
||||||
|
<mkdir dir="dist/doc/developers" />
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -63,6 +63,15 @@ $sidebarTopMessage = '';
|
|||||||
*/
|
*/
|
||||||
$sidebarBottomMessage = '';
|
$sidebarBottomMessage = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The HTML theme to use. With themes, you can give your semanticscuttle
|
||||||
|
* installation a new look.
|
||||||
|
*
|
||||||
|
* Themes are the folders in data/templates/
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
$theme = 'default';
|
||||||
|
|
||||||
|
|
||||||
/***************************************************
|
/***************************************************
|
||||||
|
20
data/schema/1.sql
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
RENAME TABLE `sc_tags` TO `sc_bookmarks2tags` ;
|
||||||
|
|
||||||
|
CREATE TABLE `sc_searchhistory` (
|
||||||
|
`shId` int(11) NOT NULL auto_increment,
|
||||||
|
`shTerms` varchar(255) NOT NULL default '',
|
||||||
|
`shRange` varchar(32) NOT NULL default '',
|
||||||
|
`shDatetime` datetime NOT NULL default '0000-00-00 00:00:00',
|
||||||
|
`shNbResults` int(6) NOT NULL default '0',
|
||||||
|
`uId` int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`shId`)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE `sc_tags` (
|
||||||
|
`tId` int(11) NOT NULL auto_increment,
|
||||||
|
`tag` varchar(32) NOT NULL default '',
|
||||||
|
`uId` int(11) NOT NULL default '0',
|
||||||
|
`tDescription` varchar(255) default NULL,
|
||||||
|
PRIMARY KEY (`tId`),
|
||||||
|
UNIQUE KEY `sc_tags_tag_uId` (`tag`, `uId`)
|
||||||
|
);
|
10
data/schema/2.sql
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bDescription` `bDescription` VARCHAR( 1500 )
|
||||||
|
CREATE TABLE `sc_tagscache` (
|
||||||
|
`tcId` int(11) NOT NULL auto_increment,
|
||||||
|
`tag1` varchar(100) NOT NULL default '',
|
||||||
|
`tag2` varchar(100) NOT NULL default '',
|
||||||
|
`relationType` varchar(32) NOT NULL default '',
|
||||||
|
`uId` int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`tcId`),
|
||||||
|
UNIQUE KEY `sc_tagscache_tag1_tag2_type_uId` (`tag1`,`tag2`,`relationType`,`uId`)
|
||||||
|
);
|
85
data/schema/3.sql
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/* modify and add fields */
|
||||||
|
ALTER TABLE `sc_bookmarks` MODIFY `bAddress` varchar(1500) NOT NULL;
|
||||||
|
ALTER TABLE `sc_bookmarks` MODIFY `bDescription` TEXT default NULL;
|
||||||
|
ALTER TABLE `sc_bookmarks` ADD `bPrivateNote` TEXT NULL AFTER `bDescription` ;
|
||||||
|
ALTER TABLE `sc_tags` MODIFY `tDescription` TEXT default NULL;
|
||||||
|
ALTER TABLE `sc_commondescription` MODIFY `cdDescription` TEXT default NULL;
|
||||||
|
|
||||||
|
/* convert to UTF-8 if your table is ISO-something (through BLOB: tips provided by MYSQL documentation)*/
|
||||||
|
/* first need to remove index keys because of BLOB constraints*/
|
||||||
|
ALTER TABLE `sc_tags` DROP INDEX `sc_tags_tag_uId`;
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` DROP INDEX `sc_bookmarks2tags_tag_bId`;
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` DROP INDEX `sc_bookmarks2tags_bId`;
|
||||||
|
ALTER TABLE `sc_tags2tags` DROP INDEX `sc_tags2tags_tag1_tag2_uId`;
|
||||||
|
ALTER TABLE `sc_commondescription` DROP INDEX `sc_commondescription_tag_datetime`;
|
||||||
|
ALTER TABLE `sc_tagscache` DROP INDEX `sc_tagscache_tag1_tag2_type_uId`;
|
||||||
|
ALTER TABLE `sc_tagsstats` DROP INDEX `sc_tagsstats_tag1_type_uId`;
|
||||||
|
|
||||||
|
/* secondly convert through BLOB type */
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bTitle` `bTitle` BLOB;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bTitle` `bTitle` varchar(255) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bAddress` `bAddress` BLOB;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bAddress` `bAddress` varchar(1500) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bDescription` `bDescription` BLOB;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bDescription` `bDescription` text CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bPrivateNote` `bPrivateNote` BLOB;
|
||||||
|
ALTER TABLE `sc_bookmarks` CHANGE `bPrivateNote` `bPrivateNote` text CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_tags` CHANGE `tag` `tag` BLOB;
|
||||||
|
ALTER TABLE `sc_tags` CHANGE `tag` `tag` varchar(100) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_tags` CHANGE `tDescription` `tDescription` BLOB;
|
||||||
|
ALTER TABLE `sc_tags` CHANGE `tDescription` `tDescription` text CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` CHANGE `tag` `tag` BLOB;
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` CHANGE `tag` `tag` varchar(100) CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_users` CHANGE `name` `name` BLOB;
|
||||||
|
ALTER TABLE `sc_users` CHANGE `name` `name` varchar(50) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_users` CHANGE `uContent` `uContent` BLOB;
|
||||||
|
ALTER TABLE `sc_users` CHANGE `uContent` `uContent` text CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_tags2tags` CHANGE `tag1` `tag1` BLOB;
|
||||||
|
ALTER TABLE `sc_tags2tags` CHANGE `tag1` `tag1` varchar(100) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_tags2tags` CHANGE `tag2` `tag2` BLOB;
|
||||||
|
ALTER TABLE `sc_tags2tags` CHANGE `tag2` `tag2` varchar(100) CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_tagsstats` CHANGE `tag1` `tag1` BLOB;
|
||||||
|
ALTER TABLE `sc_tagsstats` CHANGE `tag1` `tag1` varchar(100) CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_tagscache` CHANGE `tag1` `tag1` BLOB;
|
||||||
|
ALTER TABLE `sc_tagscache` CHANGE `tag1` `tag1` varchar(100) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_tagscache` CHANGE `tag2` `tag2` BLOB;
|
||||||
|
ALTER TABLE `sc_tagscache` CHANGE `tag2` `tag2` varchar(100) CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_commondescription` CHANGE `tag` `tag` BLOB;
|
||||||
|
ALTER TABLE `sc_commondescription` CHANGE `tag` `tag` varchar(100) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_commondescription` CHANGE `cdTitle` `cdTitle` BLOB;
|
||||||
|
ALTER TABLE `sc_commondescription` CHANGE `cdTitle` `cdTitle` varchar(255) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_commondescription` CHANGE `cdDescription` `cdDescription` BLOB;
|
||||||
|
ALTER TABLE `sc_commondescription` CHANGE `cdDescription` `cdDescription` text CHARACTER SET utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `sc_searchhistory` CHANGE `shTerms` `shTerms` BLOB;
|
||||||
|
ALTER TABLE `sc_searchhistory` CHANGE `shTerms` `shTerms` varchar(255) CHARACTER SET utf8;
|
||||||
|
ALTER TABLE `sc_searchhistory` CHANGE `shRange` `shRange` BLOB;
|
||||||
|
ALTER TABLE `sc_searchhistory` CHANGE `shRange` `shRange` varchar(32) CHARACTER SET utf8;
|
||||||
|
|
||||||
|
/* Thirdly re-add index keys */
|
||||||
|
ALTER TABLE `sc_tags` ADD UNIQUE KEY `sc_tags_tag_uId` (`tag`, `uId`);
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` ADD UNIQUE KEY `sc_bookmarks2tags_tag_bId` (`tag`,`bId`);
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` ADD KEY `sc_bookmarks2tags_bId` (`bId`);
|
||||||
|
ALTER TABLE `sc_tags2tags` ADD UNIQUE KEY `sc_tags2tags_tag1_tag2_uId` (`tag1`,`tag2`,`relationType`,`uId`);
|
||||||
|
ALTER TABLE `sc_commondescription` ADD UNIQUE KEY `sc_commondescription_tag_datetime` (`tag`,`cdDatetime`);
|
||||||
|
ALTER TABLE `sc_tagscache` ADD UNIQUE KEY `sc_tagscache_tag1_tag2_type_uId` (`tag1`,`tag2`,`relationType`,`uId`);
|
||||||
|
ALTER TABLE `sc_tagsstats` ADD UNIQUE KEY `sc_tagsstats_tag1_type_uId` (`tag1`,`relationType`,`uId`);
|
||||||
|
|
||||||
|
/* Change tables to utf-8 charset */
|
||||||
|
ALTER TABLE `sc_bookmarks` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_tags` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_bookmarks2tags` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_users` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_watched` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_tags2tags` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_tagsstats` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_tagscache` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_commondescription` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
||||||
|
ALTER TABLE `sc_searchhistory` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
11
data/schema/4.sql
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
ALTER TABLE `sc_bookmarks` ADD `bVoting` INT NOT NULL;
|
||||||
|
ALTER TABLE `sc_bookmarks` ADD `bVotes` INT NOT NULL;
|
||||||
|
|
||||||
|
CREATE TABLE `sc_votes` (
|
||||||
|
`bId` INT NOT NULL ,
|
||||||
|
`uId` INT NOT NULL ,
|
||||||
|
`vote` INT( 2 ) NOT NULL ,
|
||||||
|
UNIQUE KEY `bid_2` (`bId`,`uId`),
|
||||||
|
KEY `bid` (`bId`),
|
||||||
|
KEY `uid` (`uId`)
|
||||||
|
) CHARACTER SET utf8 COLLATE utf8_general_ci ;
|
1
data/schema/5.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE `sc_bookmarks` ADD `bShort` VARCHAR(16) NULL DEFAULT NULL;
|
@ -39,7 +39,9 @@ include('search.menu.php');
|
|||||||
|
|
||||||
<?php if($GLOBALS['enableAdminColors']!=false && isset($userid) && $userservice->isAdmin($userid) && $pageName != PAGE_WATCHLIST) : ?>
|
<?php if($GLOBALS['enableAdminColors']!=false && isset($userid) && $userservice->isAdmin($userid) && $pageName != PAGE_WATCHLIST) : ?>
|
||||||
<div style="width:70%;text-align:center;">
|
<div style="width:70%;text-align:center;">
|
||||||
<img src="<?php echo ROOT ?>images/logo_24.gif" width="12px"/> <?php echo T_('Bookmarks on this page are managed by an admin user.'); ?><img src="<?php echo ROOT ?>images/logo_24.gif" width="12px"/>
|
<img src="<?php $theme->resource('images/logo_24.gif'); ?>" width="12px"/>
|
||||||
|
<?php echo T_('Bookmarks on this page are managed by an admin user.'); ?>
|
||||||
|
<img src="<?php $theme->resource('images/logo_24.gif'); ?>" width="12px"/>
|
||||||
</div>
|
</div>
|
||||||
<?php endif?>
|
<?php endif?>
|
||||||
|
|
||||||
@ -70,7 +72,7 @@ if ($userservice->isLoggedOn()) {
|
|||||||
) {
|
) {
|
||||||
echo ' <a href="'. createURL('tagcommondescriptionedit', $currenttag).'" title="'.T_('Edit the common description of this tag').'">';
|
echo ' <a href="'. createURL('tagcommondescriptionedit', $currenttag).'" title="'.T_('Edit the common description of this tag').'">';
|
||||||
echo !is_array($cDescription) || strlen($cDescription['cdDescription'])==0?T_('Edit the common description of this tag'):'';
|
echo !is_array($cDescription) || strlen($cDescription['cdDescription'])==0?T_('Edit the common description of this tag'):'';
|
||||||
echo ' <img src="'.ROOT.'images/b_edit.png" /></a>';
|
echo ' <img src="' . $theme->resource('images/b_edit.png') . '" /></a>';
|
||||||
} else if (isset($hash)) {
|
} else if (isset($hash)) {
|
||||||
echo ' (<a href="'.createURL('bookmarkcommondescriptionedit', $hash).'" title="'.T_('Edit the common description of this bookmark').'">';
|
echo ' (<a href="'.createURL('bookmarkcommondescriptionedit', $hash).'" title="'.T_('Edit the common description of this bookmark').'">';
|
||||||
echo T_('Edit the common description of this bookmark').'</a>)';
|
echo T_('Edit the common description of this bookmark').'</a>)';
|
||||||
@ -95,7 +97,7 @@ if($userservice->isLoggedOn()) {
|
|||||||
if($currenttag!= '') {
|
if($currenttag!= '') {
|
||||||
echo ' <a href="'. createURL('tagedit', $currenttag).'" title="'.T_('Edit your personal description of this tag').'" >';
|
echo ' <a href="'. createURL('tagedit', $currenttag).'" title="'.T_('Edit your personal description of this tag').'" >';
|
||||||
echo strlen($pDescription['tDescription'])==0?T_('Edit your personal description of this tag'):'';
|
echo strlen($pDescription['tDescription'])==0?T_('Edit your personal description of this tag'):'';
|
||||||
echo ' <img src="'.ROOT.'images/b_edit.png" /></a>';
|
echo ' <img src="' . $theme->resource('images/b_edit.png') . '" /></a>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?></p>
|
?></p>
|
||||||
@ -361,9 +363,15 @@ if ($currenttag!= '') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Admin specific design
|
// Admin specific design
|
||||||
if ($userservice->isAdmin($row['username']) && $GLOBALS['enableAdminColors']) {
|
if ($userservice->isAdmin($row['username'])
|
||||||
|
&& $GLOBALS['enableAdminColors']
|
||||||
|
) {
|
||||||
$adminBgClass = ' class="adminBackground"';
|
$adminBgClass = ' class="adminBackground"';
|
||||||
$adminStar = ' <img src="'. ROOT .'images/logo_24.gif" width="12px" title="'. T_('This bookmark is certified by an admin user.') .'" />';
|
$adminStar = ' <img'
|
||||||
|
. ' src="' . $theme->resource('images/logo_24.gif') . '"'
|
||||||
|
. ' width="12px"'
|
||||||
|
. ' title="' . T_('This bookmark is certified by an admin user.') . '"'
|
||||||
|
. '/>';
|
||||||
} else {
|
} else {
|
||||||
$adminBgClass = '';
|
$adminBgClass = '';
|
||||||
$adminStar = '';
|
$adminStar = '';
|
@ -36,7 +36,6 @@ window.onload = function() {
|
|||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</p>
|
|
||||||
|
|
||||||
<?php if (isset($referrer)): ?>
|
<?php if (isset($referrer)): ?>
|
||||||
<div><input type="hidden" name="referrer" value="<?php echo $referrer; ?>" /></div>
|
<div><input type="hidden" name="referrer" value="<?php echo $referrer; ?>" /></div>
|
@ -21,7 +21,6 @@ window.onload = function() {
|
|||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</p>
|
|
||||||
|
|
||||||
<?php if (isset($referrer)): ?>
|
<?php if (isset($referrer)): ?>
|
||||||
<div><input type="hidden" name="referrer" value="<?php echo $referrer; ?>" /></div>
|
<div><input type="hidden" name="referrer" value="<?php echo $referrer; ?>" /></div>
|
66
data/templates/default/top.inc.php
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
|
||||||
|
<title><?php echo filter($GLOBALS['sitename'] .(isset($pagetitle) ? ' » ' . $pagetitle : '')); ?></title>
|
||||||
|
<link rel="icon" type="image/png" href="<?php echo $theme->resource('icon.png');?>" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="<?php echo $theme->resource('scuttle.css');?>" />
|
||||||
|
<link rel="search" type="application/opensearchdescription+xml" href="<?php echo ROOT ?>api/opensearch.php" title="<?php echo htmlspecialchars($GLOBALS['sitename']) ?>"/>
|
||||||
|
<?php
|
||||||
|
if (isset($rsschannels)) {
|
||||||
|
$size = count($rsschannels);
|
||||||
|
for ($i = 0; $i < $size; $i++) {
|
||||||
|
echo ' <link rel="alternate" type="application/rss+xml" title="'
|
||||||
|
. htmlspecialchars($rsschannels[$i][0]) . '"'
|
||||||
|
. ' href="'. $rsschannels[$i][1] .'" />';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?php if (isset($loadjs)) :?>
|
||||||
|
<?php if (DEBUG_MODE) : ?>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery-1.4.2.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery.jstree.js"></script>
|
||||||
|
<?php else: ?>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery-1.4.2.min.js"></script>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT_JS ?>jquery.jstree.min.js"></script>
|
||||||
|
<?php endif ?>
|
||||||
|
<script type="text/javascript" src="<?php echo ROOT ?>jsScuttle.php"></script>
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$headerstyle = '';
|
||||||
|
if(isset($_GET['popup'])) {
|
||||||
|
$headerstyle = ' class="popup"';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div id="header" <?php echo $headerstyle; ?>>
|
||||||
|
<h1><a href="<?php echo ROOT ?>"><?php echo $GLOBALS['sitename']; ?></a></h1>
|
||||||
|
<?php
|
||||||
|
if(!isset($_GET['popup'])) {
|
||||||
|
$this->includeTemplate('toolbar.inc');
|
||||||
|
}
|
||||||
|
?></div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (isset($subtitle)) {
|
||||||
|
echo '<h2>'. $subtitle ."</h2>\n";
|
||||||
|
}
|
||||||
|
if(DEBUG_MODE) {
|
||||||
|
echo '<p class="error">'. T_('Admins, your installation is in "Debug Mode" ($debugMode = true). To go in "Normal Mode" and hide debugging messages, change $debugMode to false into config.php.') ."</p>\n";
|
||||||
|
}
|
||||||
|
if (isset($error) && $error!='') {
|
||||||
|
echo '<p class="error">'. $error ."</p>\n";
|
||||||
|
}
|
||||||
|
if (isset($msg) && $msg!='') {
|
||||||
|
echo '<p class="success">'. $msg ."</p>\n";
|
||||||
|
}
|
||||||
|
if (isset($tipMsg) && $tipMsg!='') {
|
||||||
|
echo '<p class="tipMsg">'. $tipMsg ."</p>\n";
|
||||||
|
}
|
||||||
|
?>
|
@ -4,8 +4,8 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
|
||||||
<title><?php echo filter($GLOBALS['sitename'] .(isset($pagetitle) ? ' » ' . $pagetitle : '')); ?></title>
|
<title><?php echo filter($GLOBALS['sitename'] .(isset($pagetitle) ? ' » ' . $pagetitle : '')); ?></title>
|
||||||
<link rel="icon" type="image/png" href="<?php echo ROOT ?>icon.png" />
|
<link rel="icon" type="image/png" href="<?php echo $theme->resource('icon.png');?>" />
|
||||||
<link rel="stylesheet" type="text/css" href="<?php echo ROOT ?>scuttle.css" />
|
<link rel="stylesheet" type="text/css" href="<?php echo $theme->resource('scuttle.css');?>" />
|
||||||
<link rel="search" type="application/opensearchdescription+xml" href="<?php echo ROOT ?>api/opensearch.php" title="<?php echo htmlspecialchars($GLOBALS['sitename']) ?>"/>
|
<link rel="search" type="application/opensearchdescription+xml" href="<?php echo ROOT ?>api/opensearch.php" title="<?php echo htmlspecialchars($GLOBALS['sitename']) ?>"/>
|
||||||
<?php
|
<?php
|
||||||
if (isset($rsschannels)) {
|
if (isset($rsschannels)) {
|
||||||
@ -40,7 +40,7 @@ if(isset($_GET['popup'])) {
|
|||||||
?>
|
?>
|
||||||
|
|
||||||
<div id="header" <?php echo $headerstyle; ?>>
|
<div id="header" <?php echo $headerstyle; ?>>
|
||||||
<h1><a href="<?php echo ROOT ?>"><?php echo $GLOBALS['sitename']; ?></a></h1>
|
<h1><a href="<?php echo ROOT ?>">.</a></h1>
|
||||||
<?php
|
<?php
|
||||||
if(!isset($_GET['popup'])) {
|
if(!isset($_GET['popup'])) {
|
||||||
$this->includeTemplate('toolbar.inc');
|
$this->includeTemplate('toolbar.inc');
|
@ -1,23 +1,28 @@
|
|||||||
ChangeLog for SemantiScuttle
|
ChangeLog for SemantiScuttle
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
|
||||||
0.98.0 - 2011-XX-XX
|
0.98.0 - 2011-XX-XX
|
||||||
-------------------
|
-------------------
|
||||||
- Switch to jQuery and drop dojo
|
- Switch to jQuery and drop dojo
|
||||||
- Fix bug #3187177: Wrong URL / Export XML Bookmarks
|
- Fix bug #3187177: Wrong URL / Export XML Bookmarks
|
||||||
- Fix bug in getTagsForBookmarks() that fetched all tags
|
- Fix bug in ``getTagsForBookmarks()`` that fetched all tags
|
||||||
- Fix bug #3097187: Using opensearch with two tags does not work in Firefox
|
- Fix bug #3097187: Using opensearch with two tags does not work in Firefox
|
||||||
- Fix bug #3251877: French translation JavaScript Bug when editing bookmarks
|
- Fix bug #3251877: French translation JavaScript Bug when editing bookmarks
|
||||||
|
- Fix bug #3168521: Title of tag-filtered RSS Feed is broken
|
||||||
|
- Fix bug #2853627: Javascript warning
|
||||||
|
- Implement request #1989987: Theming support
|
||||||
- Implement request #3054906: Show user's full name instead of nickname
|
- Implement request #3054906: Show user's full name instead of nickname
|
||||||
- Implement patch #3059829: update FR_CA translation
|
- Implement patch #3059829: update ``FR_CA`` translation
|
||||||
- Show error message on mysqli connection errors
|
- Show error message on mysqli connection errors
|
||||||
- Update php-gettext library to 1.0.10
|
- Update php-gettext library to 1.0.10
|
||||||
- api/posts/add respects the "replace" parameter now
|
- ``api/posts/add`` respects the "replace" parameter now
|
||||||
- Fix privacy issue when fetching tags of several users
|
- Fix privacy issue when fetching tags of several users
|
||||||
- Fix Google custom search XML
|
- Fix Google custom search XML
|
||||||
- Only URLs with an allowed protocol may be added to the database
|
- Only URLs with an allowed protocol may be added to the database
|
||||||
- Support HTTPS connections when $root is not configured
|
- Support HTTPS connections when ``$root`` is not configured
|
||||||
- SQL schema version table to ease future database upgrades
|
- SQL schema version table to ease future database upgrades
|
||||||
|
- Documentation is written with rST (reStructuredText) now
|
||||||
|
|
||||||
|
|
||||||
0.97.2 - 2011-02-17
|
0.97.2 - 2011-02-17
|
||||||
@ -68,11 +73,13 @@ your SemanticScuttle installations!
|
|||||||
- Fix several SQL injection possibilities
|
- Fix several SQL injection possibilities
|
||||||
- Fix E_NOTICE when calling alltags.php without any parameter
|
- Fix E_NOTICE when calling alltags.php without any parameter
|
||||||
- Implement part of request #2928950:
|
- Implement part of request #2928950:
|
||||||
|
|
||||||
- User adjustable entry count: rss.php?count=20
|
- User adjustable entry count: rss.php?count=20
|
||||||
- Fix HTTP content type header for RSS
|
- Fix HTTP content type header for RSS
|
||||||
- Add config option to allow sorting by bookmark creation date
|
- Add config option to allow sorting by bookmark creation date
|
||||||
instead of modification date
|
instead of modification date
|
||||||
- Implement request #2833793: Export to avahi config files
|
|
||||||
|
- Implement request #2833793: Export to avahi config files
|
||||||
- we support zeroconf networking!
|
- we support zeroconf networking!
|
||||||
- Implement request #2934868: Do not display full redirection URL
|
- Implement request #2934868: Do not display full redirection URL
|
||||||
Patch by fnorder@users.sourceforge.net
|
Patch by fnorder@users.sourceforge.net
|
||||||
@ -181,7 +188,7 @@ your SemanticScuttle installations!
|
|||||||
- Major Refactoring: add a tag cache improving query processing
|
- Major Refactoring: add a tag cache improving query processing
|
||||||
(knowledge inference on tag relations) [DB modified]
|
(knowledge inference on tag relations) [DB modified]
|
||||||
- Interface fix: allows to remove a tag from the selection into
|
- Interface fix: allows to remove a tag from the selection into
|
||||||
subtitle bar thanks to a *.
|
subtitle bar thanks to a \*.
|
||||||
- New Feature: authorizes anchors with brackets into descriptions
|
- New Feature: authorizes anchors with brackets into descriptions
|
||||||
of bookmark. For example: "[city]Paris[/city]".
|
of bookmark. For example: "[city]Paris[/city]".
|
||||||
This text between anchors will be highlighted when the
|
This text between anchors will be highlighted when the
|
||||||
@ -219,6 +226,7 @@ your SemanticScuttle installations!
|
|||||||
0.90 - 2008-06-05
|
0.90 - 2008-06-05
|
||||||
-----------------
|
-----------------
|
||||||
The main improvements of this new version are:
|
The main improvements of this new version are:
|
||||||
|
|
||||||
- menu tags (tags which are included into the "menu" tag and
|
- menu tags (tags which are included into the "menu" tag and
|
||||||
thus which appear on the main page)
|
thus which appear on the main page)
|
||||||
- connexion with Google Custom Search Engine which allows to
|
- connexion with Google Custom Search Engine which allows to
|
||||||
@ -227,6 +235,7 @@ The main improvements of this new version are:
|
|||||||
|
|
||||||
|
|
||||||
All the changes:
|
All the changes:
|
||||||
|
|
||||||
- New feature: add Google Custom Search Engine into
|
- New feature: add Google Custom Search Engine into
|
||||||
gsearch/ folder and looking into all bookmarks [Config modified]
|
gsearch/ folder and looking into all bookmarks [Config modified]
|
||||||
- Interface design: antispam question is hidden when
|
- Interface design: antispam question is hidden when
|
||||||
@ -279,6 +288,7 @@ The main change of this release is the possibility to preview websites
|
|||||||
through thumbnails (thanks to artviper.net).
|
through thumbnails (thanks to artviper.net).
|
||||||
|
|
||||||
All the changes:
|
All the changes:
|
||||||
|
|
||||||
- Interface design: display SemanticScuttle version number
|
- Interface design: display SemanticScuttle version number
|
||||||
on "about" page
|
on "about" page
|
||||||
- Bug fix: allow clean urls thanks to .htaccess
|
- Bug fix: allow clean urls thanks to .htaccess
|
||||||
@ -298,6 +308,7 @@ All the changes:
|
|||||||
0.87 - 2008-02-14
|
0.87 - 2008-02-14
|
||||||
-----------------
|
-----------------
|
||||||
This new version brings two major features to SemanticScuttle:
|
This new version brings two major features to SemanticScuttle:
|
||||||
|
|
||||||
1) You can now create a synonym link between tags.
|
1) You can now create a synonym link between tags.
|
||||||
For example, by linking the tags "monument" and "monuments",
|
For example, by linking the tags "monument" and "monuments",
|
||||||
you can find resources tagged with the first one when you navigate
|
you can find resources tagged with the first one when you navigate
|
||||||
@ -310,6 +321,7 @@ This new version brings two major features to SemanticScuttle:
|
|||||||
ones (more difficult but more powerful).
|
ones (more difficult but more powerful).
|
||||||
|
|
||||||
All the changes:
|
All the changes:
|
||||||
|
|
||||||
- Interface design: allow to access to users' bookmarks from last
|
- Interface design: allow to access to users' bookmarks from last
|
||||||
user sidebox. (Currently, we can just access to their profiles).
|
user sidebox. (Currently, we can just access to their profiles).
|
||||||
- Interface design: hide multiple URLs repeated into history page
|
- Interface design: hide multiple URLs repeated into history page
|
||||||
@ -335,9 +347,11 @@ All the changes:
|
|||||||
-----------------
|
-----------------
|
||||||
- New feature: Add stats (nb children, nb descendants, depth,
|
- New feature: Add stats (nb children, nb descendants, depth,
|
||||||
nb update) to structured tags
|
nb update) to structured tags
|
||||||
|
|
||||||
- Allow to visualize structured tags according to stats
|
- Allow to visualize structured tags according to stats
|
||||||
- Add admin page to update stats from the existing structured
|
- Add admin page to update stats from the existing structured
|
||||||
tags in the database
|
tags in the database
|
||||||
|
|
||||||
- Translation: improve French translation (add missing translations,
|
- Translation: improve French translation (add missing translations,
|
||||||
transform "labels" into "tags")
|
transform "labels" into "tags")
|
||||||
- New feature: List all users in a users page and users block on
|
- New feature: List all users in a users page and users block on
|
||||||
|
@ -1,51 +1,60 @@
|
|||||||
|
============================
|
||||||
SemanticScuttle installation
|
SemanticScuttle installation
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
|
||||||
Prerequisites
|
Prerequisites
|
||||||
-------------
|
=============
|
||||||
To run SemanticScuttle, you need:
|
To run SemanticScuttle, you need:
|
||||||
|
|
||||||
- PHP5 with filter functions enabled
|
- PHP5 with filter functions enabled
|
||||||
- A web server, for example Apache
|
- A web server, for example Apache
|
||||||
|
|
||||||
|
|
||||||
Installation instructions
|
Installation instructions
|
||||||
-------------------------
|
=========================
|
||||||
1. Create a new MySQL database
|
1. Create a new MySQL database
|
||||||
2. Import tables.sql into that database, i.e.
|
2. Import ``data/tables.sql`` into that database, i.e.
|
||||||
run
|
run ::
|
||||||
> mysql -umyusername semanticscuttle < data/tables.sql
|
|
||||||
|
$ mysql -umyusername semanticscuttle < data/tables.sql
|
||||||
|
|
||||||
on the shell ("semanticscuttle" being the database name)
|
on the shell ("semanticscuttle" being the database name)
|
||||||
3. Copy data/config.php.dist to data/config.php and modify it as
|
|
||||||
|
3. Copy ``data/config.php.dist`` to ``data/config.php`` and modify it as
|
||||||
necessary.
|
necessary.
|
||||||
4. Make the cache directory writable by your web server.
|
4. Make the cache directory writable by your web server.
|
||||||
For example, run
|
For example, run ::
|
||||||
> chmod 0777 cache
|
|
||||||
|
$ chmod 0777 cache
|
||||||
|
|
||||||
on the shell.
|
on the shell.
|
||||||
5. Set the www/ directory as document root in your web server,
|
5. Set the ``www/`` directory as document root in your web server,
|
||||||
restart the web server.
|
restart the web server.
|
||||||
|
|
||||||
|
|
||||||
Ugly www directory in URLs
|
Ugly www directory in URLs
|
||||||
--------------------------
|
==========================
|
||||||
In case point 5 of the installation instructions cannot be put into
|
In case point 5 of the installation instructions cannot be put into
|
||||||
practice by you because you are not able to change the web server
|
practice by you because you are not able to change the web server
|
||||||
configuration, you are not lost! There is a way to get rid of
|
configuration, you are not lost! There is a way to get rid of
|
||||||
www/ in your URL!
|
``www/`` in your URL!
|
||||||
|
|
||||||
|
Imagine following directory layout: ::
|
||||||
|
|
||||||
Imagine following directory layout:
|
|
||||||
/home/customer123/
|
/home/customer123/
|
||||||
www/
|
www/
|
||||||
subdomain1/
|
subdomain1/
|
||||||
subdomain2/
|
subdomain2/
|
||||||
subdomain3/
|
subdomain3/
|
||||||
|
|
||||||
Create a SemanticScuttle directory somewhere outside www if possible
|
Create a SemanticScuttle directory somewhere outside ``www`` if possible
|
||||||
and put all directories except www/ in there. Move all files and
|
and put all directories except ``www/`` in there. Move all files and
|
||||||
directories from www/ into your subdomain directory. Then modify
|
directories from ``www/`` into your subdomain directory. Then modify
|
||||||
subdomain/www-header.php to include the correct file path.
|
``subdomain/www-header.php`` to include the correct file path.
|
||||||
|
|
||||||
|
The new directory layout should look that way: ::
|
||||||
|
|
||||||
The new directory layout should look that way:
|
|
||||||
/home/customer123/
|
/home/customer123/
|
||||||
semanticscuttle/
|
semanticscuttle/
|
||||||
doc/
|
doc/
|
||||||
@ -60,8 +69,11 @@ The new directory layout should look that way:
|
|||||||
www-header.php
|
www-header.php
|
||||||
subdomain3/
|
subdomain3/
|
||||||
|
|
||||||
Now open www-header.php and replace
|
Now open www-header.php and replace ::
|
||||||
|
|
||||||
require_once '../src/SemanticScuttle/header.php';
|
require_once '../src/SemanticScuttle/header.php';
|
||||||
with
|
|
||||||
|
with ::
|
||||||
|
|
||||||
require_once '../../semanticscuttle/src/SemanticScuttle/header.php';
|
require_once '../../semanticscuttle/src/SemanticScuttle/header.php';
|
||||||
|
|
||||||
|
67
doc/README.rst
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
====================
|
||||||
|
SemanticScuttle 0.98
|
||||||
|
====================
|
||||||
|
A social bookmarking tool experimenting with new features
|
||||||
|
like structured tags or collaborative descriptions of tags.
|
||||||
|
|
||||||
|
https://sourceforge.net/projects/semanticscuttle/
|
||||||
|
|
||||||
|
Available under the GNU General Public License
|
||||||
|
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
See `INSTALL.rst`__
|
||||||
|
|
||||||
|
|
||||||
|
__ INSTALL.html
|
||||||
|
|
||||||
|
|
||||||
|
Upgrading from a previous version
|
||||||
|
=================================
|
||||||
|
See `UPGRADE.txt`__
|
||||||
|
|
||||||
|
__ UPGRADE.html
|
||||||
|
|
||||||
|
|
||||||
|
Public API
|
||||||
|
==========
|
||||||
|
SemanticScuttle supports most of the `del.icio.us API`__.
|
||||||
|
Almost all of the neat tools made for that system can be modified
|
||||||
|
to work with your SemanticScuttle installation. If you find a tool
|
||||||
|
that won't let you change the API address, ask the creator to add
|
||||||
|
this setting. You never know, they might just do it.
|
||||||
|
|
||||||
|
__ http://del.icio.us/doc/api
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Links
|
||||||
|
-----
|
||||||
|
- `further documentation`__
|
||||||
|
- `support and help questions`__
|
||||||
|
- `development mailing list instructions`__
|
||||||
|
- `suggestions`_ for SemanticScuttle
|
||||||
|
- `bug reports`_
|
||||||
|
- `feature requests`_
|
||||||
|
- `patches`_
|
||||||
|
|
||||||
|
__ http://semanticscuttle.wiki.sourceforge.net/
|
||||||
|
__ http://sourceforge.net/forum/forum.php?forum_id=759510
|
||||||
|
__ https://sourceforge.net/mailarchive/forum.php?forum_name=semanticscuttle-devel
|
||||||
|
.. _suggestions: http://sourceforge.net/forum/forum.php?forum_id=759511
|
||||||
|
.. _bug reports: http://sourceforge.net/tracker/?group_id=211356&atid=1017430
|
||||||
|
.. _feature requests: https://sourceforge.net/tracker/?group_id=211356&atid=1017433
|
||||||
|
.. _patches: https://sourceforge.net/tracker/?group_id=211356&atid=1017432
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Known issues
|
||||||
|
============
|
||||||
|
|
||||||
|
Number of bookmarks always 0: "0 bookmark(s)"
|
||||||
|
---------------------------------------------
|
||||||
|
This issue occurs when debug mode is enabled.
|
||||||
|
Technically, this is because the database layers ``DEBUG_EXTRA`` gets
|
||||||
|
enabled through debug mode.
|
@ -1,91 +0,0 @@
|
|||||||
SemanticScuttle 0.94
|
|
||||||
====================
|
|
||||||
A social bookmarking tool experimenting with new features
|
|
||||||
like structured tags or collaborative descriptions of tags.
|
|
||||||
|
|
||||||
https://sourceforge.net/projects/semanticscuttle/
|
|
||||||
|
|
||||||
Available under the GNU General Public License
|
|
||||||
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
See INSTALL.txt
|
|
||||||
|
|
||||||
|
|
||||||
Upgrading from a previous version
|
|
||||||
---------------------------------
|
|
||||||
See UPGRADE.txt
|
|
||||||
|
|
||||||
|
|
||||||
Public API
|
|
||||||
----------
|
|
||||||
Scuttle supports most of the del.icio.us API [1].
|
|
||||||
Almost all of the neat tools made for that system can be modified
|
|
||||||
to work with your SemanticScuttle installation. If you find a tool
|
|
||||||
that won't let you change the API address, ask the creator to add
|
|
||||||
this setting. You never know, they might just do it.
|
|
||||||
|
|
||||||
[1] http://del.icio.us/doc/api
|
|
||||||
|
|
||||||
|
|
||||||
Translations
|
|
||||||
------------
|
|
||||||
Scuttle is available in the following languages :
|
|
||||||
|
|
||||||
English en-GB 100% (Default)
|
|
||||||
Chinese zh-CN 86%
|
|
||||||
Danish dk-DK 100%
|
|
||||||
Dutch nl-NL 68%
|
|
||||||
French fr-FR 100%
|
|
||||||
German de-DE 100%
|
|
||||||
Hindi hi-IN 100%
|
|
||||||
Italian it-IT 89%
|
|
||||||
Japanese ja-JP 100%
|
|
||||||
Lithuanian lt-LT 100%
|
|
||||||
Portuguese pt-BR 100%
|
|
||||||
Spanish es-ES 94%
|
|
||||||
|
|
||||||
Translations are managed with gettext <includes/php-gettext>.
|
|
||||||
|
|
||||||
To provide additional translations:
|
|
||||||
- execute of of the scripts in <includes/php-gettext/bin/>
|
|
||||||
for example to complete french (France) translation on a
|
|
||||||
GNU/Linux system, type
|
|
||||||
./gettexts.sh fr_FR
|
|
||||||
- then edit the file <locales/fr_FR/LC_MESSAGES/messages.po>
|
|
||||||
with poedit
|
|
||||||
(that will update <locales/fr_FR/LC_MESSAGES/messages.mo>)
|
|
||||||
|
|
||||||
|
|
||||||
Links
|
|
||||||
-----
|
|
||||||
http://semanticscuttle.wiki.sourceforge.net/
|
|
||||||
- further documentation
|
|
||||||
|
|
||||||
http://sourceforge.net/forum/forum.php?forum_id=759510
|
|
||||||
- support and help questions
|
|
||||||
|
|
||||||
https://sourceforge.net/mailarchive/forum.php?forum_name=semanticscuttle-devel
|
|
||||||
- development mailing list instructions
|
|
||||||
|
|
||||||
http://sourceforge.net/forum/forum.php?forum_id=759511
|
|
||||||
- suggestions for SemanticScuttle
|
|
||||||
|
|
||||||
http://sourceforge.net/tracker/?group_id=211356&atid=1017430
|
|
||||||
- bug reports
|
|
||||||
|
|
||||||
https://sourceforge.net/tracker/?group_id=211356&atid=1017433
|
|
||||||
- feature requests
|
|
||||||
|
|
||||||
https://sourceforge.net/tracker/?group_id=211356&atid=1017432
|
|
||||||
- patches
|
|
||||||
|
|
||||||
|
|
||||||
Known issues
|
|
||||||
------------
|
|
||||||
|
|
||||||
Number of bookmarks always 0: "0 bookmark(s)"
|
|
||||||
This issue occurs when debug mode is enabled.
|
|
||||||
Technically, this is because the database layers DEBUG_EXTRA gets
|
|
||||||
enabled through debug mode.
|
|
263
doc/UPGRADE.txt
@ -1,266 +1,165 @@
|
|||||||
|
=================================================
|
||||||
Upgrading SemanticScuttle from a previous version
|
Upgrading SemanticScuttle from a previous version
|
||||||
=================================================
|
=================================================
|
||||||
|
|
||||||
|
|
||||||
From version 0.97 to 0.98
|
From version 0.97 to 0.98
|
||||||
-------------------------
|
=========================
|
||||||
Database updates: Apply data/schema/6.sql or do the following:
|
Database updates
|
||||||
|
----------------
|
||||||
CREATE TABLE `sc_version` (
|
Apply ``data/schema/6.sql``
|
||||||
`schema_version` int(11) NOT NULL
|
|
||||||
) DEFAULT CHARSET=utf8;
|
|
||||||
|
|
||||||
INSERT INTO `sc_version` (`schema_version`) VALUES ('6');
|
|
||||||
|
|
||||||
ALTER TABLE `sc_users` ADD `privateKey` VARCHAR(33) NULL;
|
ALTER TABLE `sc_users` ADD `privateKey` VARCHAR(33) NULL;
|
||||||
CREATE UNIQUE INDEX `privateKey` ON `sc_users` (`privateKey`);
|
CREATE UNIQUE INDEX `privateKey` ON `sc_users` (`privateKey`);
|
||||||
|
|
||||||
|
|
||||||
From version 0.96 to 0.97
|
From version 0.96 to 0.97
|
||||||
-------------------------
|
=========================
|
||||||
No database changes necessary.
|
No database changes necessary.
|
||||||
|
|
||||||
|
|
||||||
From version 0.95 to 0.96
|
From version 0.95 to 0.96
|
||||||
-------------------------
|
=========================
|
||||||
Update your database:
|
Database updates
|
||||||
- ALTER TABLE `sc_bookmarks` ADD `bShort` VARCHAR(16) NULL DEFAULT NULL;
|
----------------
|
||||||
|
Apply ``data/schema/5.sql``
|
||||||
|
|
||||||
API:
|
API
|
||||||
The method signatures of addBookmark() and updateBookmark()
|
---
|
||||||
changed due to the addition of the $short parameter.
|
The method signatures of ``addBookmark()`` and ``updateBookmark()``
|
||||||
|
changed due to the addition of the ``$short`` parameter.
|
||||||
|
|
||||||
We got complaints about the changed file structure, and people told
|
We got complaints about the changed file structure, and people told
|
||||||
us that they just cannot set the document root to www/, because they
|
us that they just cannot set the document root to ``www/``, because they
|
||||||
are not admins on their http server. This is a valid point, and
|
are not admins on their HTTP server. This is a valid point, and
|
||||||
with 0.96.0 you can easily change it. See INSTALL.txt for more information
|
with 0.96.0 you can easily change it. See `INSTALL.txt`_ for more information
|
||||||
about moving www/.
|
about moving ``www/``.
|
||||||
|
|
||||||
|
.. _INSTALL.txt: INSTALL.html
|
||||||
|
|
||||||
|
|
||||||
From version 0.94 to 0.95
|
From version 0.94 to 0.95
|
||||||
--------------------------
|
=========================
|
||||||
The file structure completely changed in 0.95.0 compared
|
The file structure completely changed in 0.95.0 compared
|
||||||
to previous versions. We recommend that you start with a
|
to previous versions. We recommend that you start with a
|
||||||
fresh installation, just copying over your config.php file.
|
fresh installation, just copying over your ``config.php`` file.
|
||||||
Set your web server document root directory to www/.
|
Set your web server document root directory to ``www/``.
|
||||||
|
|
||||||
Yes, we kind of lost the ability to run SemanticScuttle
|
Yes, we kind of lost the ability to run SemanticScuttle
|
||||||
in a subdirectory of a hostname. This functionality will
|
in a subdirectory of a hostname. This functionality will
|
||||||
be back in one of the next releases, but for now, you have
|
be back in one of the next releases, but for now, you have
|
||||||
to live with it.
|
to live with it.
|
||||||
|
|
||||||
Update your database:
|
Update your database
|
||||||
- ALTER TABLE `sc_bookmarks` ADD `bVoting` INT NOT NULL;
|
--------------------
|
||||||
- ALTER TABLE `sc_bookmarks` ADD `bVotes` INT NOT NULL;
|
Apply ``data/schema/4.sql``.
|
||||||
- Add the new votes database table. See data/tables.sql.
|
|
||||||
|
|
||||||
Currently, only MySQL can be used as database backend.
|
Currently, only MySQL can be used as database backend.
|
||||||
All other DBMS (database management systems) have not been
|
All other DBMS (database management systems) have not been
|
||||||
tested except for PostgreSQL, and SemanticScuttle fails there.
|
tested except for PostgreSQL, and SemanticScuttle fails there.
|
||||||
|
|
||||||
The de_AT translation has been re-added. This is because
|
Translation
|
||||||
de_AT provides a rather ugly "official German" style,
|
-----------
|
||||||
while the normal de_DE is friendlier. Choose what you like.
|
The ``de_AT`` translation has been re-added. This is because
|
||||||
|
``de_AT`` provides a rather ugly "official German" style,
|
||||||
|
while the normal ``de_DE`` is friendlier. Choose what you like.
|
||||||
|
|
||||||
|
|
||||||
From version 0.93 to 0.94
|
From version 0.93 to 0.94
|
||||||
-------------------------
|
=========================
|
||||||
|
|
||||||
- Nothing changed except for the default configuration file.
|
- Nothing changed except for the default configuration file.
|
||||||
It is recommended to start with a fresh config file,
|
It is recommended to start with a fresh config file,
|
||||||
but not neccesary. Old config files still work.
|
but not neccesary. Old config files still work.
|
||||||
- If you used translation de_AT, please switch to de_DE.
|
- If you used translation ``de_AT``, please switch to ``de_DE``.
|
||||||
de_AT was moved to de_DE and de_AT has been removed.
|
``de_AT`` was moved to ``de_DE`` and ``de_AT`` has been removed.
|
||||||
|
|
||||||
|
|
||||||
From version 0.92 to 0.93
|
From version 0.92 to 0.93
|
||||||
-------------------------
|
=========================
|
||||||
|
|
||||||
- Backup your database
|
- Backup your database
|
||||||
- Make a copy from your SemanticScuttle Web directory
|
- Make a copy from your SemanticScuttle Web directory
|
||||||
- Upgrade your database by following instructions ONE after ONE (order is important) :
|
- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example`` ::
|
||||||
#NOTHING TO CHANGE IN DB
|
|
||||||
- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
|
$footerMessage = ''; #HTML message appearing at the bottom of the page (just above SemanticScuttle credits)
|
||||||
$footerMessage = ''; #HTML message appearing at the bottom of the page (just above SemanticScuttle credits)
|
$sidebarTopMessage = ''; #HTML message appearing at the top of the sidebar
|
||||||
$sidebarTopMessage = ''; #HTML message appearing at the top of the sidebar
|
$sidebarBottomMessage = ''; #HTML message appearing at the bottom of the sidebar
|
||||||
$sidebarBottomMessage = ''; #HTML message appearing at the bottom of the sidebar
|
$adminsCanModifyBookmarksFromOtherUsers = true; # 'true' if admin users can edit or delete bookmarks belonging to other users. Else 'false'.
|
||||||
$adminsCanModifyBookmarksFromOtherUsers = true; # 'true' if admin users can edit or delete bookmarks belonging to other users. Else 'false'.
|
$adminsAreAdvisedTagsFromOtherAdmins = false; # 'true' if tags from other admins are proposed to each admin (in add/edit a bookmark page). Else 'false'.
|
||||||
$adminsAreAdvisedTagsFromOtherAdmins = false; # 'true' if tags from other admins are proposed to each admin (in add/edit a bookmark page). Else 'false'.
|
$defaultPerPageForAdmins = 20; # default number of bookmarks per page for admins (-1 means no limit)
|
||||||
$defaultPerPageForAdmins = 20; # default number of bookmarks per page for admins (-1 means no limit)
|
|
||||||
|
|
||||||
|
|
||||||
From version 0.91 to 0.92
|
From version 0.91 to 0.92
|
||||||
-------------------------
|
=========================
|
||||||
Message: this version modifies the database to UTF-8 charset. The idea is to convert the content (through BLOB type) and then to change the tables' charsets.
|
Message: this version modifies the database to UTF-8 charset. The idea is to convert the content (through BLOB type) and then to change the tables' charsets.
|
||||||
|
|
||||||
- Backup your database
|
- Backup your database
|
||||||
- Make a copy from your SemanticScuttle Web directory
|
- Make a copy from your SemanticScuttle Web directory
|
||||||
- Upgrade your database by following instructions ONE after ONE (order is important) :
|
- Upgrade your database by applying ``data/schema/3.sql``
|
||||||
|
- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example``
|
||||||
|
|
||||||
/* modify and add fields */
|
- Add variable ::
|
||||||
ALTER TABLE `sc_bookmarks` MODIFY `bAddress` varchar(1500) NOT NULL;
|
|
||||||
ALTER TABLE `sc_bookmarks` MODIFY `bDescription` TEXT default NULL;
|
|
||||||
ALTER TABLE `sc_bookmarks` ADD `bPrivateNote` TEXT NULL AFTER `bDescription` ;
|
|
||||||
ALTER TABLE `sc_tags` MODIFY `tDescription` TEXT default NULL;
|
|
||||||
ALTER TABLE `sc_commondescription` MODIFY `cdDescription` TEXT default NULL;
|
|
||||||
|
|
||||||
/* convert to UTF-8 if your table is ISO-something (through BLOB: tips provided by MYSQL documentation)*/
|
$descriptionAnchors = array("author", "isbn", "address"=>"[address][street][/street][city][/city][/address]"); #add a possible anchor (structured content) for bookmarks' description field
|
||||||
/* first need to remove index keys because of BLOB constraints*/
|
|
||||||
ALTER TABLE `sc_tags` DROP INDEX `sc_tags_tag_uId`;
|
|
||||||
ALTER TABLE `sc_bookmarks2tags` DROP INDEX `sc_bookmarks2tags_tag_bId`;
|
|
||||||
ALTER TABLE `sc_bookmarks2tags` DROP INDEX `sc_bookmarks2tags_bId`;
|
|
||||||
ALTER TABLE `sc_tags2tags` DROP INDEX `sc_tags2tags_tag1_tag2_uId`;
|
|
||||||
ALTER TABLE `sc_commondescription` DROP INDEX `sc_commondescription_tag_datetime`;
|
|
||||||
ALTER TABLE `sc_tagscache` DROP INDEX `sc_tagscache_tag1_tag2_type_uId`;
|
|
||||||
ALTER TABLE `sc_tagsstats` DROP INDEX `sc_tagsstats_tag1_type_uId`;
|
|
||||||
|
|
||||||
/* secondly convert through BLOB type */
|
- Add variable ::
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bTitle` `bTitle` BLOB;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bTitle` `bTitle` varchar(255) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bAddress` `bAddress` BLOB;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bAddress` `bAddress` varchar(1500) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bDescription` `bDescription` BLOB;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bDescription` `bDescription` text CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bPrivateNote` `bPrivateNote` BLOB;
|
|
||||||
ALTER TABLE `sc_bookmarks` CHANGE `bPrivateNote` `bPrivateNote` text CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_tags` CHANGE `tag` `tag` BLOB;
|
$enableCommonTagDescriptionEditedByAll = true; #true mean everybody can edit common description. Else just the admins can do it.
|
||||||
ALTER TABLE `sc_tags` CHANGE `tag` `tag` varchar(100) CHARACTER SET utf8;
|
- Add variable ::
|
||||||
ALTER TABLE `sc_tags` CHANGE `tDescription` `tDescription` BLOB;
|
|
||||||
ALTER TABLE `sc_tags` CHANGE `tDescription` `tDescription` text CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_bookmarks2tags` CHANGE `tag` `tag` BLOB;
|
$googleAnalyticsCode = ''; #Allow GoogleAnalytics tracker https://www.google.com/analytics/
|
||||||
ALTER TABLE `sc_bookmarks2tags` CHANGE `tag` `tag` varchar(100) CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_users` CHANGE `name` `name` BLOB;
|
|
||||||
ALTER TABLE `sc_users` CHANGE `name` `name` varchar(50) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_users` CHANGE `uContent` `uContent` BLOB;
|
|
||||||
ALTER TABLE `sc_users` CHANGE `uContent` `uContent` text CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_tags2tags` CHANGE `tag1` `tag1` BLOB;
|
|
||||||
ALTER TABLE `sc_tags2tags` CHANGE `tag1` `tag1` varchar(100) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_tags2tags` CHANGE `tag2` `tag2` BLOB;
|
|
||||||
ALTER TABLE `sc_tags2tags` CHANGE `tag2` `tag2` varchar(100) CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_tagsstats` CHANGE `tag1` `tag1` BLOB;
|
|
||||||
ALTER TABLE `sc_tagsstats` CHANGE `tag1` `tag1` varchar(100) CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_tagscache` CHANGE `tag1` `tag1` BLOB;
|
|
||||||
ALTER TABLE `sc_tagscache` CHANGE `tag1` `tag1` varchar(100) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_tagscache` CHANGE `tag2` `tag2` BLOB;
|
|
||||||
ALTER TABLE `sc_tagscache` CHANGE `tag2` `tag2` varchar(100) CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_commondescription` CHANGE `tag` `tag` BLOB;
|
|
||||||
ALTER TABLE `sc_commondescription` CHANGE `tag` `tag` varchar(100) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_commondescription` CHANGE `cdTitle` `cdTitle` BLOB;
|
|
||||||
ALTER TABLE `sc_commondescription` CHANGE `cdTitle` `cdTitle` varchar(255) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_commondescription` CHANGE `cdDescription` `cdDescription` BLOB;
|
|
||||||
ALTER TABLE `sc_commondescription` CHANGE `cdDescription` `cdDescription` text CHARACTER SET utf8;
|
|
||||||
|
|
||||||
ALTER TABLE `sc_searchhistory` CHANGE `shTerms` `shTerms` BLOB;
|
|
||||||
ALTER TABLE `sc_searchhistory` CHANGE `shTerms` `shTerms` varchar(255) CHARACTER SET utf8;
|
|
||||||
ALTER TABLE `sc_searchhistory` CHANGE `shRange` `shRange` BLOB;
|
|
||||||
ALTER TABLE `sc_searchhistory` CHANGE `shRange` `shRange` varchar(32) CHARACTER SET utf8;
|
|
||||||
|
|
||||||
/* Thirdly re-add index keys */
|
|
||||||
ALTER TABLE `sc_tags` ADD UNIQUE KEY `sc_tags_tag_uId` (`tag`, `uId`);
|
|
||||||
ALTER TABLE `sc_bookmarks2tags` ADD UNIQUE KEY `sc_bookmarks2tags_tag_bId` (`tag`,`bId`);
|
|
||||||
ALTER TABLE `sc_bookmarks2tags` ADD KEY `sc_bookmarks2tags_bId` (`bId`);
|
|
||||||
ALTER TABLE `sc_tags2tags` ADD UNIQUE KEY `sc_tags2tags_tag1_tag2_uId` (`tag1`,`tag2`,`relationType`,`uId`);
|
|
||||||
ALTER TABLE `sc_commondescription` ADD UNIQUE KEY `sc_commondescription_tag_datetime` (`tag`,`cdDatetime`);
|
|
||||||
ALTER TABLE `sc_tagscache` ADD UNIQUE KEY `sc_tagscache_tag1_tag2_type_uId` (`tag1`,`tag2`,`relationType`,`uId`);
|
|
||||||
ALTER TABLE `sc_tagsstats` ADD UNIQUE KEY `sc_tagsstats_tag1_type_uId` (`tag1`,`relationType`,`uId`);
|
|
||||||
|
|
||||||
/* Change tables to utf-8 charset */
|
|
||||||
ALTER TABLE `sc_bookmarks` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_tags` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_bookmarks2tags` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_users` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_watched` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_tags2tags` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_tagsstats` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_tagscache` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_commondescription` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
ALTER TABLE `sc_searchhistory` CHARACTER SET utf8 COLLATE utf8_general_ci;
|
|
||||||
|
|
||||||
- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
|
|
||||||
* Add variable : $descriptionAnchors = array("author", "isbn", "address"=>"[address][street][/street][city][/city][/address]"); #add a possible anchor (structured content) for bookmarks' description field
|
|
||||||
* Add variable : $enableCommonTagDescriptionEditedByAll = true; #true mean everybody can edit common description. Else just the admins can do it.
|
|
||||||
* Add variable : $googleAnalyticsCode = ''; #Allow GoogleAnalytics tracker https://www.google.com/analytics/
|
|
||||||
|
|
||||||
|
|
||||||
From version 0.90 to 0.91
|
From version 0.90 to 0.91
|
||||||
-------------------------
|
=========================
|
||||||
- Backup you database
|
- Backup you database
|
||||||
- Make a copy from your SemanticScuttle Web directory
|
- Make a copy from your SemanticScuttle Web directory
|
||||||
- Upgrade your database by following instructions ONE after ONE (order is important) :
|
- Upgrade your database by applying ``data/schema/2.sql``
|
||||||
* ALTER TABLE `sc_bookmarks` CHANGE `bDescription` `bDescription` VARCHAR( 1500 )
|
- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example``
|
||||||
* CREATE TABLE `sc_tagscache` (
|
|
||||||
`tcId` int(11) NOT NULL auto_increment,
|
- Delete last line ::
|
||||||
`tag1` varchar(100) NOT NULL default '',
|
|
||||||
`tag2` varchar(100) NOT NULL default '',
|
include_once('debug.inc.php');
|
||||||
`relationType` varchar(32) NOT NULL default '',
|
|
||||||
`uId` int(11) NOT NULL default '0',
|
- Add variable::
|
||||||
PRIMARY KEY (`tcId`),
|
|
||||||
UNIQUE KEY `sc_tagscache_tag1_tag2_type_uId` (`tag1`,`tag2`,`relationType`,`uId`)
|
$menu2Tags = array('example', 'of', 'menu', 'tags');
|
||||||
);
|
|
||||||
- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
|
- Add variable::
|
||||||
* Delete last line : include_once('debug.inc.php');
|
|
||||||
* Add variable: $menu2Tags = array('example', 'of', 'menu', 'tags');
|
$debugMode = true; # if true, show debug messages
|
||||||
* Add variable: $debugMode = true; # if true, show debug messages
|
|
||||||
|
|
||||||
|
|
||||||
From version 0.89 to 0.90
|
From version 0.89 to 0.90
|
||||||
-------------------------
|
=========================
|
||||||
|
|
||||||
- Backup you database
|
- Backup you database
|
||||||
- Make a copy from your SemanticScuttle Web directory
|
- Make a copy from your SemanticScuttle Web directory
|
||||||
|
|
||||||
- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
|
- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
|
||||||
# add these lines under $enableWebsiteThumbnails = false; # enableWebsiteThumbnails {true|false}:
|
|
||||||
$thumbnailsUserId = '';
|
|
||||||
$thumbnailsKey = '';
|
|
||||||
|
|
||||||
|
add these lines under ``$enableWebsiteThumbnails = false; # enableWebsiteThumbnails {true|false}``::
|
||||||
|
|
||||||
|
$thumbnailsUserId = '';
|
||||||
|
$thumbnailsKey = '';
|
||||||
|
|
||||||
|
|
||||||
From version 0.88 to 0.89
|
From version 0.88 to 0.89
|
||||||
-------------------------
|
=========================
|
||||||
|
|
||||||
- Backup you database
|
- Backup you database
|
||||||
- Make a copy from your SemanticScuttle Web directory
|
- Make a copy from your SemanticScuttle Web directory
|
||||||
- Upgrade your database by following instructions ONE after ONE (order is important) :
|
- Upgrade your database by applying ``data/schema/1.sql``
|
||||||
|
- Upgrade your current configuration file (``config.inc.php``) with respect to ``config.inc.php.example``
|
||||||
|
|
||||||
|
- add line::
|
||||||
|
|
||||||
* change the table called 'sc_tags' into 'sc_bookmarks2tags' by executing the following SQL commands (after changing 'yourdatabasename' and adapting its name prefix 'sc_' to your convenience):
|
|
||||||
|
|
||||||
RENAME TABLE `yourdatabasename`.`sc_tags` TO `yourdatabasename`.`sc_bookmarks2tags` ;
|
|
||||||
|
|
||||||
|
|
||||||
* add the following table (adapt its name prefix to your convenience) executing the following SQL commands:
|
|
||||||
|
|
||||||
CREATE TABLE `sc_searchhistory` (
|
|
||||||
`shId` int(11) NOT NULL auto_increment,
|
|
||||||
`shTerms` varchar(255) NOT NULL default '',
|
|
||||||
`shRange` varchar(32) NOT NULL default '',
|
|
||||||
`shDatetime` datetime NOT NULL default '0000-00-00 00:00:00',
|
|
||||||
`shNbResults` int(6) NOT NULL default '0',
|
|
||||||
`uId` int(11) NOT NULL default '0',
|
|
||||||
PRIMARY KEY (`shId`)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE TABLE `sc_tags` (
|
|
||||||
`tId` int(11) NOT NULL auto_increment,
|
|
||||||
`tag` varchar(32) NOT NULL default '',
|
|
||||||
`uId` int(11) NOT NULL default '0',
|
|
||||||
`tDescription` varchar(255) default NULL,
|
|
||||||
PRIMARY KEY (`tId`),
|
|
||||||
UNIQUE KEY `sc_tags_tag_uId` (`tag`, `uId`)
|
|
||||||
);
|
|
||||||
|
|
||||||
- Upgrade your current configuration file (config.inc.php) with respect to config.inc.php.example
|
|
||||||
# add line:
|
|
||||||
$sizeSearchHistory = 10;
|
$sizeSearchHistory = 10;
|
||||||
# add sidebar block index line:
|
|
||||||
|
- add sidebar block index line::
|
||||||
|
|
||||||
$index_sidebar_blocks = array('search','menu','users','popular');
|
$index_sidebar_blocks = array('search','menu','users','popular');
|
||||||
# add line:
|
|
||||||
|
- add line::
|
||||||
$enableGoogleCustomSearch = true;
|
$enableGoogleCustomSearch = true;
|
||||||
|
213
doc/authentication.rst
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
============================================
|
||||||
|
External authentication with SemanticScuttle
|
||||||
|
============================================
|
||||||
|
|
||||||
|
Most times, one piece of software is only a part in the big puzzle
|
||||||
|
that makes the software landscape of a company or organization.
|
||||||
|
SemanticScuttle is not different and should integrate as nicely as
|
||||||
|
possible with all other systems.
|
||||||
|
|
||||||
|
One of the basic tasks of integration is user authentication against
|
||||||
|
a central database - be it a central user database, an LDAP or a
|
||||||
|
active directory server.
|
||||||
|
|
||||||
|
Since version 0.96, SemanticScuttle supports user authentication against
|
||||||
|
external systems. To provide a wide range of supported systems, we chose
|
||||||
|
to utilize PEAR's `Authentication package`__.
|
||||||
|
It does this by providing different "`authentication containers`__",
|
||||||
|
for example Database, IMAP, LDAP, POP3, RADIUS, SAP and SOAP.
|
||||||
|
|
||||||
|
Please be aware of the fact that, after successful authentication, the user
|
||||||
|
and his scrambled password are stored in the SemanticScuttle database.
|
||||||
|
This is required for proper functioning of the software. It does not mean
|
||||||
|
that you will be able to login if your external authentication provider
|
||||||
|
is offline - you won't, execpt you switch it off in the SemanticScuttle
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
|
||||||
|
__ http://pear.php.net/package/Auth
|
||||||
|
__ http://pear.php.net/manual/en/package.authentication.auth.intro-storage.php
|
||||||
|
|
||||||
|
|
||||||
|
Basic configuration
|
||||||
|
===================
|
||||||
|
The default configuration file ``data/config.default.php`` has an own section
|
||||||
|
on auth options and an explanation of the single entries.
|
||||||
|
|
||||||
|
To utilize the external authentication, you need to install the
|
||||||
|
PEAR Auth package: ::
|
||||||
|
|
||||||
|
$ pear install auth
|
||||||
|
|
||||||
|
If you do not have a PEAR installation available, you can try to manually
|
||||||
|
install the files in the src/ directory. If you choose to do that, the
|
||||||
|
src/ directory should look similar to that: ::
|
||||||
|
|
||||||
|
src/
|
||||||
|
Auth.php
|
||||||
|
Auth/
|
||||||
|
Anonymous.php
|
||||||
|
Container.php
|
||||||
|
Container/
|
||||||
|
..
|
||||||
|
SemanticScuttle/
|
||||||
|
header.php
|
||||||
|
..
|
||||||
|
|
||||||
|
After that, modify your ``data/config.php`` file. The most important change
|
||||||
|
is to use ::
|
||||||
|
|
||||||
|
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
||||||
|
|
||||||
|
which tells SemanticScuttle to switch to the special authentication service.
|
||||||
|
|
||||||
|
Now that's done, you can configure the single auth options:
|
||||||
|
|
||||||
|
``$authType = 'MDB2';``
|
||||||
|
selects the authentication container.
|
||||||
|
|
||||||
|
``$authOptions``
|
||||||
|
is an array of options specific to the authentication container. Please
|
||||||
|
consult the PEAR Auth documentation for more information.
|
||||||
|
|
||||||
|
``$authDebug = true;``
|
||||||
|
should be used when setup fails, since it may give important hints
|
||||||
|
where it fails.
|
||||||
|
|
||||||
|
Please note that login will seem to fail with
|
||||||
|
debugging activated. Going back to the main page after that will
|
||||||
|
show that you are logged in.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Authentication examples
|
||||||
|
=======================
|
||||||
|
|
||||||
|
General database authentification
|
||||||
|
---------------------------------
|
||||||
|
Here you also need the PEAR `MDB2 package`_.
|
||||||
|
The "``new_link``" option is important!
|
||||||
|
|
||||||
|
``config.php`` settings: ::
|
||||||
|
|
||||||
|
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
||||||
|
$authType = 'MDB2';
|
||||||
|
$authOptions = array(
|
||||||
|
'dsn' => array(
|
||||||
|
'phptype' => 'mysql',
|
||||||
|
'hostspec' => 'FIXME',
|
||||||
|
'username' => 'FIXME',
|
||||||
|
'password' => 'FIXME',
|
||||||
|
'database' => 'FIXME',
|
||||||
|
'new_link' => true,
|
||||||
|
),
|
||||||
|
'table' => 'usersFIXME',
|
||||||
|
'usernamecol' => 'usernameFIXME',
|
||||||
|
'passwordcol' => 'passwordFIXME',
|
||||||
|
'cryptType' => 'md5',
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
Mantis Bugtracker
|
||||||
|
-----------------
|
||||||
|
Here you also need the PEAR `MDB2 package`_.
|
||||||
|
|
||||||
|
``config.php`` settings: ::
|
||||||
|
|
||||||
|
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
||||||
|
$authType = 'MDB2';
|
||||||
|
$authOptions = array(
|
||||||
|
'dsn' => array(
|
||||||
|
'phptype' => 'mysql',
|
||||||
|
'hostspec' => 'FIXME',
|
||||||
|
'username' => 'FIXME',
|
||||||
|
'password' => 'FIXME',
|
||||||
|
'database' => 'FIXME',
|
||||||
|
'new_link' => true,
|
||||||
|
),
|
||||||
|
'table' => 'mantis_user_table',
|
||||||
|
'usernamecol' => 'username',
|
||||||
|
'passwordcol' => 'password',
|
||||||
|
'cryptType' => 'md5',
|
||||||
|
);
|
||||||
|
|
||||||
|
.. _MDB2 package: http://pear.php.net/package/MDB2
|
||||||
|
|
||||||
|
|
||||||
|
MediaWiki
|
||||||
|
---------
|
||||||
|
Unfortunately, the password column does not contain a simple hashed
|
||||||
|
password - for good reasons as described on
|
||||||
|
http://www.mediawiki.org/wiki/Manual_talk:User_table#user_password_column
|
||||||
|
|
||||||
|
If you configure your MediaWiki_ to use passwords without salt, you
|
||||||
|
can make it work nevertheless:
|
||||||
|
|
||||||
|
MediaWiki ``LocalSettings.php``: ::
|
||||||
|
|
||||||
|
$wgPasswordSalt = false;
|
||||||
|
|
||||||
|
\- after that, users need to change/update their passwords to get them
|
||||||
|
unsalted in the database. You can verify if the passwords are unhashed
|
||||||
|
if you do ::
|
||||||
|
|
||||||
|
SELECT CAST( user_password AS CHAR ) FROM user
|
||||||
|
|
||||||
|
on your MediaWiki database. Passwords prefixed with "``:A:``" can be used.
|
||||||
|
|
||||||
|
Another problem is that mediawiki user names begin with an uppercase letter.
|
||||||
|
You need to modify ``www/login.php`` and remove the "``utf8_strtolower``" function
|
||||||
|
call: ::
|
||||||
|
|
||||||
|
$posteduser = trim(utf8_strtolower(POST_USERNAME));
|
||||||
|
|
||||||
|
becomes ::
|
||||||
|
|
||||||
|
$posteduser = trim(POST_USERNAME);
|
||||||
|
|
||||||
|
|
||||||
|
``config.php`` settings: ::
|
||||||
|
|
||||||
|
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
||||||
|
$authType = 'MDB2';
|
||||||
|
$authOptions = array(
|
||||||
|
'dsn' => array(
|
||||||
|
'phptype' => 'mysql',
|
||||||
|
'hostspec' => 'FIXME',
|
||||||
|
'username' => 'FIXME',
|
||||||
|
'password' => 'FIXME',
|
||||||
|
'database' => 'FIXME',
|
||||||
|
'new_link' => true,
|
||||||
|
),
|
||||||
|
'table' => 'user',
|
||||||
|
'usernamecol' => 'user_name',
|
||||||
|
'passwordcol' => 'user_password',
|
||||||
|
'cryptType' => 'md5_mediawiki',
|
||||||
|
);
|
||||||
|
function md5_mediawiki($password) {
|
||||||
|
return ':A:' . md5($password);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.. _MediaWiki: http://www.mediawiki.org/wiki/MediaWiki
|
||||||
|
|
||||||
|
Active Directory / LDAP
|
||||||
|
-----------------------
|
||||||
|
Here we authenticate against an active directory server.
|
||||||
|
|
||||||
|
``config.php`` settings: ::
|
||||||
|
|
||||||
|
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
||||||
|
$authType = 'LDAP';
|
||||||
|
$authOptions = array(
|
||||||
|
'host' => '192.168.1.4',
|
||||||
|
'version' => 3,
|
||||||
|
'basedn' => 'DC=EXAMPLE,DC=ORG',
|
||||||
|
'binddn' => 'readuser',
|
||||||
|
'bindpw' => 'readuser',
|
||||||
|
'userattr' => 'sAMAccountName',
|
||||||
|
'userfilter' => '(objectClass=user)',
|
||||||
|
'attributes' => array(''),
|
||||||
|
);
|
||||||
|
$authEmailSuffix = '@example.org';
|
||||||
|
|
@ -1,197 +0,0 @@
|
|||||||
External authentication with SemanticScuttle
|
|
||||||
============================================
|
|
||||||
|
|
||||||
Most times, one piece of software is only a part in the big puzzle
|
|
||||||
that makes the software landscape of a company or organization.
|
|
||||||
SemanticScuttle is not different and should integrate as nicely as
|
|
||||||
possible with all other systems.
|
|
||||||
|
|
||||||
One of the basic tasks of integration is user authentication against
|
|
||||||
a central database - be it a central user database, an LDAP or a
|
|
||||||
active directory server.
|
|
||||||
|
|
||||||
Since version 0.96, SemanticScuttle supports user authentication against
|
|
||||||
external systems. To provide a wide range of supported systems, we chose
|
|
||||||
to utilize PEAR's Authentication package [1].
|
|
||||||
It does this by providing different "authentication containers" [2],
|
|
||||||
for example Database, IMAP, LDAP, POP3, RADIUS, SAP and SOAP.
|
|
||||||
|
|
||||||
Please be aware of the fact that, after successful authentication, the user
|
|
||||||
and his scrambled password are stored in the SemanticScuttle database.
|
|
||||||
This is required for proper functioning of the software. It does not mean
|
|
||||||
that you will be able to login if your external authentication provider
|
|
||||||
is offline - you won't, execpt you switch it off in the SemanticScuttle
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
|
|
||||||
[1] http://pear.php.net/package/Auth
|
|
||||||
[2] http://pear.php.net/manual/en/package.authentication.auth.intro-storage.php
|
|
||||||
|
|
||||||
|
|
||||||
Basic configuration
|
|
||||||
===================
|
|
||||||
The default configuration file data/config.default.php has an own section
|
|
||||||
on auth options and an explanation of the single entries.
|
|
||||||
|
|
||||||
To utilize the external authentication, you need to install the
|
|
||||||
PEAR Auth package:
|
|
||||||
$ pear install auth
|
|
||||||
If you do not have a PEAR installation available, you can try to manually
|
|
||||||
install the files in the src/ directory. If you choose to do that, the
|
|
||||||
src/ directory should look similar to that:
|
|
||||||
|
|
||||||
src/
|
|
||||||
Auth.php
|
|
||||||
Auth/
|
|
||||||
Anonymous.php
|
|
||||||
Container.php
|
|
||||||
Container/
|
|
||||||
..
|
|
||||||
SemanticScuttle/
|
|
||||||
header.php
|
|
||||||
..
|
|
||||||
|
|
||||||
After that, modify your data/config.php file. The most important change
|
|
||||||
is to use
|
|
||||||
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
|
||||||
which tells SemanticScuttle to switch to the special authentication service.
|
|
||||||
|
|
||||||
Now that's done, you can configure the single auth options:
|
|
||||||
$authType = 'MDB2';
|
|
||||||
selects the authentication container.
|
|
||||||
|
|
||||||
$authOptions
|
|
||||||
is an array of options specific to the authentication container. Please
|
|
||||||
consult the PEAR Auth documentation for more information.
|
|
||||||
|
|
||||||
$authDebug = true;
|
|
||||||
should be used when setup fails, since it may give important hints
|
|
||||||
where it fails. Please note that login will seem to fail with
|
|
||||||
debugging activated. Going back to the main page after that will
|
|
||||||
show that you are logged in.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Authentication examples
|
|
||||||
=======================
|
|
||||||
|
|
||||||
General database authentification
|
|
||||||
---------------------------------
|
|
||||||
Here you also need the PEAR MDB2 package.
|
|
||||||
The "new_link" option is important!
|
|
||||||
|
|
||||||
config.php settings:
|
|
||||||
-8<------------------
|
|
||||||
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
|
||||||
$authType = 'MDB2';
|
|
||||||
$authOptions = array(
|
|
||||||
'dsn' => array(
|
|
||||||
'phptype' => 'mysql',
|
|
||||||
'hostspec' => 'FIXME',
|
|
||||||
'username' => 'FIXME',
|
|
||||||
'password' => 'FIXME',
|
|
||||||
'database' => 'FIXME',
|
|
||||||
'new_link' => true,
|
|
||||||
),
|
|
||||||
'table' => 'usersFIXME',
|
|
||||||
'usernamecol' => 'usernameFIXME',
|
|
||||||
'passwordcol' => 'passwordFIXME',
|
|
||||||
'cryptType' => 'md5',
|
|
||||||
);
|
|
||||||
-8<------------------
|
|
||||||
|
|
||||||
|
|
||||||
Mantis Bugtracker
|
|
||||||
-----------------
|
|
||||||
Here you also need the PEAR MDB2 package.
|
|
||||||
|
|
||||||
config.php settings:
|
|
||||||
-8<------------------
|
|
||||||
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
|
||||||
$authType = 'MDB2';
|
|
||||||
$authOptions = array(
|
|
||||||
'dsn' => array(
|
|
||||||
'phptype' => 'mysql',
|
|
||||||
'hostspec' => 'FIXME',
|
|
||||||
'username' => 'FIXME',
|
|
||||||
'password' => 'FIXME',
|
|
||||||
'database' => 'FIXME',
|
|
||||||
'new_link' => true,
|
|
||||||
),
|
|
||||||
'table' => 'mantis_user_table',
|
|
||||||
'usernamecol' => 'username',
|
|
||||||
'passwordcol' => 'password',
|
|
||||||
'cryptType' => 'md5',
|
|
||||||
);
|
|
||||||
-8<------------------
|
|
||||||
|
|
||||||
|
|
||||||
MediaWiki
|
|
||||||
---------
|
|
||||||
Unfortunately, the password column does not contain a simple hashed
|
|
||||||
password - for good reasons as described on
|
|
||||||
http://www.mediawiki.org/wiki/Manual_talk:User_table#user_password_column
|
|
||||||
|
|
||||||
If you configure your mediawiki to use passwords without salt, you
|
|
||||||
can make it work nevertheless:
|
|
||||||
|
|
||||||
MediaWiki LocalSettings.php:
|
|
||||||
$wgPasswordSalt = false;
|
|
||||||
- after that, users need to change/update their passwords to get them
|
|
||||||
unsalted in the database. You can verify if the passwords are unhashed
|
|
||||||
if you do
|
|
||||||
SELECT CAST( user_password AS CHAR ) FROM user
|
|
||||||
on your MediaWiki database. Passwords prefixed with ":A:" can be used.
|
|
||||||
|
|
||||||
Another problem is that mediawiki user names begin with an uppercase letter.
|
|
||||||
You need to modify www/login.php and remove the "utf8_strtolower" function
|
|
||||||
call:
|
|
||||||
$posteduser = trim(utf8_strtolower(POST_USERNAME));
|
|
||||||
becomes
|
|
||||||
$posteduser = trim(POST_USERNAME);
|
|
||||||
|
|
||||||
|
|
||||||
config.php settings:
|
|
||||||
-8<------------------
|
|
||||||
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
|
||||||
$authType = 'MDB2';
|
|
||||||
$authOptions = array(
|
|
||||||
'dsn' => array(
|
|
||||||
'phptype' => 'mysql',
|
|
||||||
'hostspec' => 'FIXME',
|
|
||||||
'username' => 'FIXME',
|
|
||||||
'password' => 'FIXME',
|
|
||||||
'database' => 'FIXME',
|
|
||||||
'new_link' => true,
|
|
||||||
),
|
|
||||||
'table' => 'user',
|
|
||||||
'usernamecol' => 'user_name',
|
|
||||||
'passwordcol' => 'user_password',
|
|
||||||
'cryptType' => 'md5_mediawiki',
|
|
||||||
);
|
|
||||||
function md5_mediawiki($password) {
|
|
||||||
return ':A:' . md5($password);
|
|
||||||
}
|
|
||||||
-8<------------------
|
|
||||||
|
|
||||||
|
|
||||||
Active Directory / LDAP
|
|
||||||
-----------------------
|
|
||||||
Here we authenticate against an active directory server.
|
|
||||||
|
|
||||||
config.php settings:
|
|
||||||
-8<------------------
|
|
||||||
$serviceoverrides['User'] = 'SemanticScuttle_Service_AuthUser';
|
|
||||||
$authType = 'LDAP';
|
|
||||||
$authOptions = array(
|
|
||||||
'host' => '192.168.1.4',
|
|
||||||
'version' => 3,
|
|
||||||
'basedn' => 'DC=EXAMPLE,DC=ORG',
|
|
||||||
'binddn' => 'readuser',
|
|
||||||
'bindpw' => 'readuser',
|
|
||||||
'userattr' => 'sAMAccountName',
|
|
||||||
'userfilter' => '(objectClass=user)',
|
|
||||||
'attributes' => array(''),
|
|
||||||
);
|
|
||||||
$authEmailSuffix = '@example.org';
|
|
||||||
-8<------------------
|
|
@ -1,20 +0,0 @@
|
|||||||
How to debug SemanticScuttle
|
|
||||||
============================
|
|
||||||
|
|
||||||
|
|
||||||
Database queries
|
|
||||||
----------------
|
|
||||||
In config.php, enable debugMode.
|
|
||||||
Further, add the following there:
|
|
||||||
-------
|
|
||||||
register_shutdown_function(
|
|
||||||
create_function('', <<<FNC
|
|
||||||
\$GLOBALS['db'] = SemanticScuttle_Service_Factory::getDb();
|
|
||||||
\$GLOBALS['db']->sql_report('display');
|
|
||||||
FNC
|
|
||||||
)
|
|
||||||
);
|
|
||||||
------
|
|
||||||
To see database queries in SemanticScuttle, add
|
|
||||||
> ?explain=1
|
|
||||||
to your URL.
|
|
24
doc/developers/debugging.rst
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
How to debug SemanticScuttle
|
||||||
|
============================
|
||||||
|
|
||||||
|
|
||||||
|
Database queries
|
||||||
|
----------------
|
||||||
|
|
||||||
|
In ``data/config.php``, enable ``debugMode``.
|
||||||
|
Further, add the following afterwards: ::
|
||||||
|
|
||||||
|
register_shutdown_function(
|
||||||
|
create_function('', <<<FNC
|
||||||
|
\$GLOBALS['db'] = SemanticScuttle_Service_Factory::getDb();
|
||||||
|
\$GLOBALS['db']->sql_report('display');
|
||||||
|
FNC
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
To see database queries in SemanticScuttle, add ::
|
||||||
|
|
||||||
|
?explain=1
|
||||||
|
|
||||||
|
to your URL.
|
@ -1,21 +0,0 @@
|
|||||||
Running unit tests
|
|
||||||
==================
|
|
||||||
|
|
||||||
Go to the SemanticScuttle main directory and run
|
|
||||||
$ php tests/AllTests.php
|
|
||||||
or
|
|
||||||
$ phpunit tests/AllTests.php
|
|
||||||
also remember the --verbose parameter to PHPUnit.
|
|
||||||
|
|
||||||
If you want to run a specific test class only:
|
|
||||||
$ phpunit tests/BookmarksTest.php
|
|
||||||
|
|
||||||
If you need to test one method only:
|
|
||||||
$ phpunit --filter BookmarkTest::testUnificationOfBookmarks tests/BookmarkTest.php
|
|
||||||
|
|
||||||
|
|
||||||
Caveats
|
|
||||||
-------
|
|
||||||
Having debugging enabled and database driver "mysql4" activated
|
|
||||||
will lead to failing tests because of FOUND_ROWS() usage, which
|
|
||||||
does not work nicely with database debugging.
|
|
26
doc/developers/running-unit-tests.rst
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Running unit tests
|
||||||
|
==================
|
||||||
|
|
||||||
|
Go to the SemanticScuttle ``tests`` directory and run ``phpunit``::
|
||||||
|
|
||||||
|
$ cd tests
|
||||||
|
$ phpunit .
|
||||||
|
|
||||||
|
also remember the ``--verbose`` parameter to PHPUnit.
|
||||||
|
|
||||||
|
If you want to run a specific test class only: ::
|
||||||
|
|
||||||
|
$ cd tests
|
||||||
|
$ phpunit BookmarksTest.php
|
||||||
|
|
||||||
|
If you need to test one method only: ::
|
||||||
|
|
||||||
|
$ cd tests
|
||||||
|
$ phpunit --filter BookmarkTest::testUnificationOfBookmarks tests/BookmarkTest.php
|
||||||
|
|
||||||
|
|
||||||
|
Caveats
|
||||||
|
-------
|
||||||
|
Having debugging enabled and database driver "``mysql4``" activated
|
||||||
|
will lead to failing tests because of ``FOUND_ROWS()`` usage, which
|
||||||
|
does not work nicely with database debugging.
|
@ -1,40 +0,0 @@
|
|||||||
Translating SemanticScuttle
|
|
||||||
===========================
|
|
||||||
|
|
||||||
SemanticScuttle uses gnu gettext for translation. It does not
|
|
||||||
rely on the php extension but ships with a pure php implementation,
|
|
||||||
php-gettext[1].
|
|
||||||
|
|
||||||
Using gettext from within the code is really easy:
|
|
||||||
Enclose the string you want to translate in a "T_" function call.
|
|
||||||
|
|
||||||
For example, to translate
|
|
||||||
> echo "Vote for";
|
|
||||||
just write
|
|
||||||
> echo T_("Vote for");
|
|
||||||
|
|
||||||
|
|
||||||
Translation basics
|
|
||||||
------------------
|
|
||||||
|
|
||||||
We keep one base translation file, data/locales/messages.po.
|
|
||||||
This file is auto-generated via xgettext from all our php source files.
|
|
||||||
In case you added a new string to the code that needs translation,
|
|
||||||
update the base translation file by running
|
|
||||||
> php scripts/update-translation-base.php
|
|
||||||
|
|
||||||
After that has been done, the changes to the base messages.po file
|
|
||||||
need to be merged into the single language translation files,
|
|
||||||
for example data/locales/de_DE/LC_MESSAGES/messages.po.
|
|
||||||
|
|
||||||
Updating them from the master file is as easy as running
|
|
||||||
> php scripts/update-translation.php de_DE
|
|
||||||
|
|
||||||
When the translation is ready, the .po file needs to be compiled
|
|
||||||
in a machine-readable .mo file. Use
|
|
||||||
> php scripts/compile-translation.php de_DE
|
|
||||||
to achieve that.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[1] https://launchpad.net/php-gettext/
|
|
47
doc/developers/translation.rst
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
===========================
|
||||||
|
Translating SemanticScuttle
|
||||||
|
===========================
|
||||||
|
|
||||||
|
SemanticScuttle uses gnu gettext for translation. It does not
|
||||||
|
rely on the php extension but ships with a pure php implementation,
|
||||||
|
php-gettext_.
|
||||||
|
|
||||||
|
Using gettext from within the code is really easy:
|
||||||
|
Enclose the string you want to translate in a "``T_``" function call.
|
||||||
|
|
||||||
|
For example, to translate::
|
||||||
|
|
||||||
|
echo "Vote for";
|
||||||
|
|
||||||
|
just write ::
|
||||||
|
|
||||||
|
echo T_("Vote for");
|
||||||
|
|
||||||
|
.. _php-gettext: https://launchpad.net/php-gettext/
|
||||||
|
|
||||||
|
Translation basics
|
||||||
|
==================
|
||||||
|
|
||||||
|
We keep one base translation file, ``data/locales/messages.po``.
|
||||||
|
This file is auto-generated via ``xgettext`` from all our php source files.
|
||||||
|
In case you added a new string to the code that needs translation,
|
||||||
|
update the base translation file by running ::
|
||||||
|
|
||||||
|
$ php scripts/update-translation-base.php
|
||||||
|
|
||||||
|
After that has been done, the changes to the base ``messages.po`` file
|
||||||
|
need to be merged into the single language translation files,
|
||||||
|
for example ``data/locales/de_DE/LC_MESSAGES/messages.po``.
|
||||||
|
|
||||||
|
Updating them from the master file is as easy as running::
|
||||||
|
|
||||||
|
$ php scripts/update-translation.php de_DE
|
||||||
|
|
||||||
|
When the translation is ready, the ``.po`` file needs to be compiled
|
||||||
|
in a machine-readable ``.mo`` file. Use ::
|
||||||
|
|
||||||
|
$ php scripts/compile-translation.php de_DE
|
||||||
|
|
||||||
|
to achieve that.
|
||||||
|
|
||||||
|
|
45
doc/index.rst
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
=============================
|
||||||
|
SemanticScuttle documentation
|
||||||
|
=============================
|
||||||
|
|
||||||
|
|
||||||
|
First reads
|
||||||
|
===========
|
||||||
|
- README_
|
||||||
|
- `installation guide`_
|
||||||
|
- `upgrade instructions`_
|
||||||
|
|
||||||
|
.. _README: README.html
|
||||||
|
.. _installation guide: INSTALL.html
|
||||||
|
.. _upgrade instructions: UPGRADE.html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Features
|
||||||
|
========
|
||||||
|
- `Custom user authentication`__
|
||||||
|
- `SSL Client certificates`__
|
||||||
|
- Themes__
|
||||||
|
|
||||||
|
__ authentication.html
|
||||||
|
__ ssl-client-certificates.html
|
||||||
|
__ themes.html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Developer documentation
|
||||||
|
=======================
|
||||||
|
- `General development rules`__
|
||||||
|
- `Delicious API`__
|
||||||
|
- `Debugging HowTo`__
|
||||||
|
- `How to release a new version`__
|
||||||
|
- `Running unit testes`__
|
||||||
|
- `How to translate SemanticScuttle`__
|
||||||
|
|
||||||
|
__ developers/rules.html
|
||||||
|
__ developers/api.html
|
||||||
|
__ developers/debugging.html
|
||||||
|
__ developers/release-new-version.html
|
||||||
|
__ developers/running-unit-tests.html
|
||||||
|
__ developers/translation.html
|
||||||
|
|
48
doc/themes.rst
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
======================
|
||||||
|
SemanticScuttle Themes
|
||||||
|
======================
|
||||||
|
SemanticScuttle may be changed visually by supplying custom "themes" (skins)
|
||||||
|
that modify the visual appearance.
|
||||||
|
|
||||||
|
|
||||||
|
Changing the current theme
|
||||||
|
==========================
|
||||||
|
In ``data/config.php``, set your theme like this: ::
|
||||||
|
|
||||||
|
$theme = 'darkmood';
|
||||||
|
|
||||||
|
The available themes are the folders in ``www/themes/``.
|
||||||
|
By default, SemanticScuttle ships only one usable theme ("default") and one
|
||||||
|
to demonstrate how to create your own theme ("testdummy").
|
||||||
|
|
||||||
|
|
||||||
|
Creating your own theme
|
||||||
|
=======================
|
||||||
|
Have a look at the "testdummy" theme in ``www/themes/testdummy/``.
|
||||||
|
|
||||||
|
CSS and image files
|
||||||
|
-------------------
|
||||||
|
Since both file types need to be accessible via the web server directly,
|
||||||
|
they are located in the ``www/`` folder: ::
|
||||||
|
|
||||||
|
www/themes/$themename/
|
||||||
|
|
||||||
|
The main CSS file that automatically gets included is ::
|
||||||
|
|
||||||
|
www/themes/$themename/scuttle.css
|
||||||
|
|
||||||
|
Several template files in SemanticScuttle include image files. If they do not
|
||||||
|
exist in your theme, the default ones are used automatically.
|
||||||
|
Note that this is not true for images that are specified in the CSS files.
|
||||||
|
|
||||||
|
|
||||||
|
Template files
|
||||||
|
--------------
|
||||||
|
The templates of the default file are located in ::
|
||||||
|
|
||||||
|
data/templates/default/
|
||||||
|
|
||||||
|
You may put your theme template files into ::
|
||||||
|
|
||||||
|
data/templates/$themename/
|
||||||
|
|
@ -76,6 +76,9 @@ class SemanticScuttle_Model_Template
|
|||||||
* Sets variables and includes the template file,
|
* Sets variables and includes the template file,
|
||||||
* causing it to be rendered.
|
* causing it to be rendered.
|
||||||
*
|
*
|
||||||
|
* Does not take care of themes and so.
|
||||||
|
* The include path must be set so the correct theme is used.
|
||||||
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function parse()
|
public function parse()
|
||||||
|
97
src/SemanticScuttle/Model/Theme.php
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* SemanticScuttle - your social bookmark manager.
|
||||||
|
*
|
||||||
|
* PHP version 5.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license AGPL v3 or later http://www.gnu.org/licenses/agpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A theme, the visual representation of SemanticScuttle.
|
||||||
|
*
|
||||||
|
* @category Bookmarking
|
||||||
|
* @package SemanticScuttle
|
||||||
|
* @author Christian Weiske <cweiske@cweiske.de>
|
||||||
|
* @license AGPL v3 or later http://www.gnu.org/licenses/agpl.html
|
||||||
|
* @link http://sourceforge.net/projects/semanticscuttle
|
||||||
|
*/
|
||||||
|
class SemanticScuttle_Model_Theme
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Theme name. Also the path part of template and resource files
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $name = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Local path to the www themes directory.
|
||||||
|
* Needs to have a trailing slash.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $wwwThemeDir = null;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new theme instance.
|
||||||
|
*
|
||||||
|
* @param string $name Theme name "data/templates/(*)/"
|
||||||
|
*/
|
||||||
|
public function __construct($name = 'default')
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
|
$this->wwwThemeDir = $GLOBALS['wwwdir'] . '/themes/';
|
||||||
|
//TODO: implement theme hierarchies with parent fallback
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the URL path to a resource file (www/themes/$name/$file).
|
||||||
|
* Automatically falls back to the parent theme if the file does not exist
|
||||||
|
* in the theme.
|
||||||
|
*
|
||||||
|
* Must always be used when adding i.e. images to the output.
|
||||||
|
*
|
||||||
|
* @param string $file File name to find the path for, i.e. "scuttle.css".
|
||||||
|
*
|
||||||
|
* @return string Full path
|
||||||
|
*/
|
||||||
|
public function resource($file)
|
||||||
|
{
|
||||||
|
$themeFile = $this->wwwThemeDir . $this->name . '/' . $file;
|
||||||
|
if (file_exists($themeFile)) {
|
||||||
|
return ROOT . 'themes/' . $this->name . '/' . $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
$defaultFile = $this->wwwThemeDir . 'default/' . $file;
|
||||||
|
if (file_exists($defaultFile)) {
|
||||||
|
return ROOT . 'themes/default/' . $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
//file does not exist. fall back to the theme file
|
||||||
|
// to guide the theme author a bit.
|
||||||
|
// TODO: logging. in admin mode, there should be a message
|
||||||
|
return ROOT . 'themes/' . $this->name . '/' . $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the theme name.
|
||||||
|
*
|
||||||
|
* @return string Theme name
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
require_once 'SemanticScuttle/Model/Template.php';
|
require_once 'SemanticScuttle/Model/Template.php';
|
||||||
|
require_once 'SemanticScuttle/Model/Theme.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SemanticScuttle template service.
|
* SemanticScuttle template service.
|
||||||
@ -38,6 +39,14 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
|
|||||||
*/
|
*/
|
||||||
protected $basedir;
|
protected $basedir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The template theme to use.
|
||||||
|
* Set in constructor based on $GLOBALS['theme']
|
||||||
|
*
|
||||||
|
* @var SemanticScuttle_Model_Theme
|
||||||
|
*/
|
||||||
|
protected $theme;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -64,6 +73,8 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
|
|||||||
protected function __construct()
|
protected function __construct()
|
||||||
{
|
{
|
||||||
$this->basedir = $GLOBALS['TEMPLATES_DIR'];
|
$this->basedir = $GLOBALS['TEMPLATES_DIR'];
|
||||||
|
$this->theme = new SemanticScuttle_Model_Theme($GLOBALS['theme']);
|
||||||
|
//FIXME: verify the theme exists
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -74,19 +85,33 @@ class SemanticScuttle_Service_Template extends SemanticScuttle_Service
|
|||||||
* @param string $template Template filename relative
|
* @param string $template Template filename relative
|
||||||
* to template dir
|
* to template dir
|
||||||
* @param array $vars Array of template variables.
|
* @param array $vars Array of template variables.
|
||||||
|
* The current theme object will be added
|
||||||
|
* automatically with name "theme".
|
||||||
*
|
*
|
||||||
* @return SemanticScuttle_Model_Template Template object
|
* @return SemanticScuttle_Model_Template Template object
|
||||||
*/
|
*/
|
||||||
function loadTemplate($template, $vars = null)
|
public function loadTemplate($template, $vars = null)
|
||||||
{
|
{
|
||||||
if (substr($template, -4) != '.php') {
|
if (substr($template, -4) != '.php') {
|
||||||
$template .= '.php';
|
$template .= '.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$oldIncPath = get_include_path();
|
||||||
|
set_include_path(
|
||||||
|
$this->basedir . $this->theme->getName()
|
||||||
|
. PATH_SEPARATOR . $this->basedir . 'default'
|
||||||
|
//needed since services are instantiated in templates
|
||||||
|
. PATH_SEPARATOR . $oldIncPath
|
||||||
|
);
|
||||||
|
|
||||||
|
$vars['theme'] = $this->theme;
|
||||||
$tpl = new SemanticScuttle_Model_Template(
|
$tpl = new SemanticScuttle_Model_Template(
|
||||||
$this->basedir .'/'. $template, $vars, $this
|
$template, $vars, $this
|
||||||
);
|
);
|
||||||
$tpl->parse();
|
$tpl->parse();
|
||||||
|
|
||||||
|
set_include_path($oldIncPath);
|
||||||
|
|
||||||
return $tpl;
|
return $tpl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,12 @@
|
|||||||
if ('@data_dir@' == '@' . 'data_dir@') {
|
if ('@data_dir@' == '@' . 'data_dir@') {
|
||||||
//non pear-install
|
//non pear-install
|
||||||
$datadir = dirname(__FILE__) . '/../../data/';
|
$datadir = dirname(__FILE__) . '/../../data/';
|
||||||
|
$wwwdir = dirname(__FILE__) . '/../../www/';
|
||||||
} else {
|
} else {
|
||||||
//pear installation; files are in include path
|
//pear installation; files are in include path
|
||||||
$datadir = '@data_dir@/SemanticScuttle/';
|
$datadir = '@data_dir@/SemanticScuttle/';
|
||||||
|
//FIXME: when you have multiple installations, the www_dir will be wrong
|
||||||
|
$wwwdir = '@www_dir@/SemanticScuttle/';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_exists($datadir . '/config.php')) {
|
if (!file_exists($datadir . '/config.php')) {
|
||||||
|
@ -38,9 +38,12 @@ function getTitle($url) {
|
|||||||
preg_match_all('/<title>(.*)<\/title>/si', $html, $matches);
|
preg_match_all('/<title>(.*)<\/title>/si', $html, $matches);
|
||||||
$title = $matches[1][0];
|
$title = $matches[1][0];
|
||||||
|
|
||||||
|
$encoding = 'utf-8';
|
||||||
// Get encoding from charset attribute
|
// Get encoding from charset attribute
|
||||||
preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
|
preg_match_all('/<meta.*charset=([^;"]*)">/i', $html, $matches);
|
||||||
$encoding = strtoupper($matches[1][0]);
|
if (isset($matches[1][0])) {
|
||||||
|
$encoding = strtoupper($matches[1][0]);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert to UTF-8 from the original encoding
|
// Convert to UTF-8 from the original encoding
|
||||||
if (function_exists("mb_convert_encoding")) {
|
if (function_exists("mb_convert_encoding")) {
|
||||||
|
@ -3,6 +3,7 @@ $GLOBALS['saveInLastUrl'] = false;
|
|||||||
$httpContentType = 'text/javascript';
|
$httpContentType = 'text/javascript';
|
||||||
require_once 'www-header.php';
|
require_once 'www-header.php';
|
||||||
require_once 'SemanticScuttle/functions.php';
|
require_once 'SemanticScuttle/functions.php';
|
||||||
|
$theme = new SemanticScuttle_Model_Theme($GLOBALS['theme']);
|
||||||
$player_root = ROOT .'includes/player/';
|
$player_root = ROOT .'includes/player/';
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ function isAvailable(input, response){
|
|||||||
username = username.trim();
|
username = username.trim();
|
||||||
var availability = document.getElementById("availability");
|
var availability = document.getElementById("availability");
|
||||||
if (username != '') {
|
if (username != '') {
|
||||||
usernameField.style.backgroundImage = 'url(<?php echo ROOT; ?>images/loading.gif)';
|
usernameField.style.backgroundImage = 'url(<?php echo $theme->resource('images/loading.gif'); ?>)';
|
||||||
if (response != '') {
|
if (response != '') {
|
||||||
usernameField.style.backgroundImage = 'none';
|
usernameField.style.backgroundImage = 'none';
|
||||||
if (response == 'true') {
|
if (response == 'true') {
|
||||||
@ -110,7 +111,7 @@ function getNewPrivateKey(input, response){
|
|||||||
function getTitle(input, response){
|
function getTitle(input, response){
|
||||||
var title = document.getElementById('titleField');
|
var title = document.getElementById('titleField');
|
||||||
if (title.value == '') {
|
if (title.value == '') {
|
||||||
title.style.backgroundImage = 'url(<?php echo ROOT; ?>images/loading.gif)';
|
title.style.backgroundImage = 'url(<?php echo $theme->resource('images/loading.gif');?>)';
|
||||||
if (response != null) {
|
if (response != null) {
|
||||||
title.style.backgroundImage = 'none';
|
title.style.backgroundImage = 'none';
|
||||||
title.value = response;
|
title.value = response;
|
||||||
|
Before Width: | Height: | Size: 771 B After Width: | Height: | Size: 771 B |
Before Width: | Height: | Size: 451 B After Width: | Height: | Size: 451 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 873 B After Width: | Height: | Size: 873 B |
Before Width: | Height: | Size: 684 B After Width: | Height: | Size: 684 B |
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 726 B |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 401 B After Width: | Height: | Size: 401 B |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 419 B After Width: | Height: | Size: 419 B |
Before Width: | Height: | Size: 495 B After Width: | Height: | Size: 495 B |
Before Width: | Height: | Size: 415 B After Width: | Height: | Size: 415 B |
Before Width: | Height: | Size: 625 B After Width: | Height: | Size: 625 B |