Commit: 07fee124ab8f8382ab6762d01d7cb35b095f4540
Author: Sherif Ramadan <[email protected]> Wed, 12 Dec 2012 10:14:37
-0500
Parents: 1a8bd5f582d4d60344c00063151f0f9e6da6ae0d
Branches: master
Link:
http://git.php.net/?p=web/php.git;a=commitdiff;h=07fee124ab8f8382ab6762d01d7cb35b095f4540
Log:
Added new user notes voting features. This provides users to vote on user
contributed notes in the manual throughout php.net.
Changed paths:
A images/notes-features.png
A images/working.gif
M include/header.inc
M include/shared-manual.inc
A js/usernotes.js
A manual/vote-note.php
M styles/site.css
M styles/theme.css
diff --git a/images/notes-features.png b/images/notes-features.png
new file mode 100644
index 0000000..b001637
Binary files /dev/null and b/images/notes-features.png differ
diff --git a/images/working.gif b/images/working.gif
new file mode 100644
index 0000000..b65747d
Binary files /dev/null and b/images/working.gif differ
diff --git a/include/header.inc b/include/header.inc
index 4656a69..1a230e5 100644
--- a/include/header.inc
+++ b/include/header.inc
@@ -66,15 +66,16 @@ if (isset($shortname) && $shortname) {
<script type="text/javascript" src="<?php echo $STATIC_ROOT
?>js/ext/html5.js<?php echo $v?>"></script>
<![endif]-->
- <script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
+ <script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
- document.write('<script type="text/javascript" src="<?php echo
$STATIC_ROOT ?>js/ext/jquery-1.4.4.min.js"><' + '/script>');
+ document.write('<script type="text/javascript" src="<?php echo
$STATIC_ROOT ?>js/ext/jquery-1.7.2.min.js"><' + '/script>');
document.write('<script type="text/javascript" src="<?php echo
$STATIC_ROOT ?>js/ext/jquery-ui-1.8.7.min.js"><' + '/script>');
}
</script>
<script type="text/javascript" src="<?php echo $STATIC_ROOT
?>js/common.js<?php echo $v?>"></script>
+ <script type="text/javascript" src="<?php echo $STATIC_ROOT
?>js/usernotes.js"></script>
<?php if (!empty($_SERVER["BASE_HREF"])): ?>
<base href="<?php echo $_SERVER["BASE_HREF"] ?>" />
<?php endif ?>
diff --git a/include/shared-manual.inc b/include/shared-manual.inc
index ed19766..76bed6b 100644
--- a/include/shared-manual.inc
+++ b/include/shared-manual.inc
@@ -114,7 +114,7 @@ function manual_header()
),
"headtags" => array(
'<meta http-equiv="Content-language" content="' . $lang . '" />
- <script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
+ <script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
@@ -157,6 +157,7 @@ $(document).ready(function() {
});
});
</script>
+<script type="text/javascript" src="/js/usernotes.js"></script>
',
@@ -326,6 +327,7 @@ function manual_notes()
// Load user note for this page
$notes = manual_notes_load($filename);
+ uasort($notes, "manual_notes_sort");
// If there are few comments, provide the quick 'prevous'/'next' navigation
// above the comments
@@ -342,6 +344,14 @@ function manual_notes()
' <small>' .
make_link($addnotelink, 'add a note') .
'</small>';
+
+ $num_notes = count($notes);
+
+ // note snippet
+ list($redir_filename) = $GLOBALS['PGI']['this'];
+ if (substr($redir_filename, -4) == '.php') {
+ $redir_filename = substr($redir_filename, 0, -4);
+ }
echo <<<END_USERNOTE_HEADER
@@ -349,7 +359,7 @@ function manual_notes()
<div class="head">
<span class="action">{$addnotesnippet}</span>
<small>User Contributed Notes</small>
- <strong>{$title}</strong>
+ <strong>{$title}</strong> - [<em>{$num_notes}</em> notes]
</div>
END_USERNOTE_HEADER;
@@ -364,7 +374,7 @@ END_USERNOTE_HEADER;
foreach($notes as $note) {
manual_note_display(
- $note['xwhen'], $note['user'], $note['note'], $note['id']
+ $note['xwhen'], $note['user'], $note['note'], $note['id'],
$note['votes']
);
}
echo "</div>\n";
@@ -444,14 +454,15 @@ function manual_notes_load($id)
while (!feof($fp)) {
$line = chop(fgets($fp, 12288));
if ($line == "") { continue; }
- list($id, $sect, $rate, $ts, $user, $note) = explode("|", $line);
+ @list($id, $sect, $rate, $ts, $user, $note, $up, $down) =
explode("|", $line);
$notes[$id] = array(
"id" => $id,
"sect" => $sect,
"rate" => $rate,
"xwhen" => $ts,
"user" => $user,
- "note" => base64_decode($note)
+ "note" => base64_decode($note),
+ "votes" => array("up"=> (int)$up, "down"=> (int)$down)
);
}
fclose($fp);
@@ -460,13 +471,48 @@ function manual_notes_load($id)
}
// Print out one user note entry
-function manual_note_display($date, $name, $text, $id)
+function manual_note_display($date, $name, $text, $id, $votes =
array('up'=>0,'down'=>0), $voteOption = true)
{
- if ($name) { $name = "\n <strong class='user'>" . htmlspecialchars($name)
. "</strong>"; }
- $datestr = date("d-M-Y h:i", $date);
- $datestr = ($id ? "\n <a href=\"#$id\" class=\"date\">$datestr</a>" : "\n
$datestr");
- $anchor = ($id ? "<a name=\"$id\"></a>\n " : "");
+ if ($name) {
+ $name = "\n <strong class=\"user\"><em>" . htmlspecialchars($name) .
"</em></strong>";
+ } else {
+ $name = "<strong class=\"user\"><em>Anonymous</em></strong>";
+ }
+ $name = ($id ? "\n <a href=\"#$id\" class=\"date\">$name</a>" : "\n
$name");
+
+ // New date style will be relative time
+ $datestr = relTime(new DateTime("@{$date}"));
+ $fdatestr = date("Y-m-d h:i", $date);
$text = clean_note($text);
+
+ // Calculate note rating by up/down votes
+ $vote = $votes['up'] - $votes['down'];
+ $p = floor(($votes['up'] / (($votes['up'] + $votes['down']) ? $votes['up']
+ $votes['down'] : 1)) * 100);
+ $rate = !$p && !($votes['up'] + $votes['down']) ? "no votes..." : "$p%
like this...";
+
+ // Vote User Notes Div
+ if ($voteOption) {
+ list($redir_filename) = $GLOBALS['PGI']['this'];
+ if (substr($redir_filename, -4) == '.php') {
+ $redir_filename = substr($redir_filename, 0, -4);
+ }
+ $rredir_filename = urlencode($redir_filename);
+ $votediv = <<<VOTEDIV
+ <div class="votes">
+ <div id="Vu{$id}" style="float: left;">
+ <a href="/manual/vote-note.php?id={$id}&page={$rredir_filename}&vote=up"
title="Vote up!" class="usernotes-voteu">up</a>
+ </div>
+ <div id="Vd{$id}" style="float: left;">
+ <a href="/manual/vote-note.php?id={$id}&page={$rredir_filename}&vote=down"
title="Vote down!" class="usernotes-voted">down</a>
+ </div>
+ <div id="V{$id}" style="float: left; padding: 4px; color: #323232;
font-weight: strong; font-size: 19px; margin-top: -6px;" title="{$rate}">
+ {$vote}
+ </div>
+ </div>
+VOTEDIV;
+ } else {
+ $votediv = null;
+ }
// If the viewer is logged in, show admin options
if (isset($_COOKIE['IS_DEV']) && $id) {
@@ -494,12 +540,14 @@ function manual_note_display($date, $name, $text, $id)
'scrollbars=no,width=300,height=200'
) . "\n </span>";
- } else { $admin = ''; }
+ } else {
+ $admin = '';
+ }
echo <<<USER_NOTE_TEXT
- {$anchor}<div class="note">{$name}{$datestr}{$admin}
- <div class="text">
+ <a name="$id"></a><div class="note">{$votediv}{$name}{$admin}<div
style="float: right; right-padding: 4px; color: #999997;"
title="$fdatestr"><strong>{$datestr}</strong></div>
+ <div class="text" id="Hcom{$id}">
{$text}
</div>
</div>
@@ -600,3 +648,70 @@ function manual_footer_beta() {
site_footer(array('elephpants' => true));
}
+// This function takes a DateTime object and returns a formated string of the
time difference relative to now
+function relTime(DateTime $date) {
+ $current = new DateTime;
+ $diff = $current->diff($date);
+ $units = array("year" => $diff->format("%y"),
+ "month" => $diff->format("%m"),
+ "day" => $diff->format("%m"),
+ "hour" => $diff->format("%m"),
+ "minute" => $diff->format("%m"),
+ "second" => $diff->format("%m"),
+ );
+ $out = "just now...";
+ foreach ($units as $unit => $amount) {
+ if (empty($amount)) {
+ continue;
+ }
+ $out = $amount . " " . ($amount == 1 ? $unit : $unit . "s") . " ago";
+ break;
+ }
+ return $out;
+}
+
+// Sort notes by rating and group by date
+function manual_notes_sort($a, $b)
+{
+ if ($a['votes']['up'] + $a['votes']['down'] < 1) {
+ $c = 1;
+ } else {
+ $c = $a['votes']['up'] + $a['votes']['down'];
+ }
+ if ($b['votes']['up'] + $b['votes']['down'] < 1) {
+ $d = 1;
+ } else {
+ $d = $b['votes']['up'] + $b['votes']['down'];
+ }
+ $voteA = $a['votes']['up'] / $c;
+ $voteB = $b['votes']['up'] / $d;
+ // Lower voted notes go to the bottom regardless of date
+ if ($voteA > $voteB) {
+ // Exception to the rule for today's notes
+ if ($b['xwhen'] >= mktime(0,0,0,date('n'),date('j'),date('Y'))
&& $voteB > -1) return 1;
+ // Another exception for notes with no votes compared to notes
with more than 4 votes and 30% or less rating
+ if ($voteB === 0 && $d === 1 && $voteA <= 0.30 && $c >= 4)
return 1;
+ return -1;
+ }
+ // Higher voted notes go to the top regardless of date
+ elseif ($voteA < $voteB) {
+ // Exception to the rule for today's notes
+ if ($a['xwhen'] >= mktime(0,0,0,date('n'),date('j'),date('Y'))
&& $voteA > -1) return -1;
+ // Another exception for notes with no votes compared to notes
with more than 4 votes and 30% or less rating
+ if ($voteA === 0 && $c === 1 && $voteB <= 0.30 && $d >= 4)
return -1;
+ return 1;
+ }
+ // Votes of equal amounts are sorted in descending order by date
+ else {
+ if ($a['xwhen'] > $b['xwhen']) {
+ return -1;
+ }
+ elseif ($a['xwhen'] < $b['xwhen']) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+}
+
diff --git a/js/usernotes.js b/js/usernotes.js
new file mode 100644
index 0000000..d1d03dd
--- /dev/null
+++ b/js/usernotes.js
@@ -0,0 +1,49 @@
+$(document).ready(function() {
+ $("a").each(
+ function () {
+ if ($(this).is("a:.usernotes-voteu") ||
$(this).is("a:.usernotes-voted")) $(this).click(
+ function (event) {
+ event.preventDefault();
+ var url = $(this).attr("href");
+ var id = url.match(/\?id=(\d+)/)[1];
+ var request = $.ajax({
+ type: "POST",
+ url: url,
+ dataType: "json",
+ headers: {"X-Json": "On" },
+ beforeSend: function() {
+ $("#Vu"+id).hide();
+ $("#Vd"+id).hide();
+ $("#V"+id).html("<img src=\"/images/working.gif\"
alt=\"Working...\" border=\"0\" title=\"Working...\" />");
+ }
+ });
+ request.done(function(data) {
+ if(data.success != null && data.success == true) {
+ $("#V"+id).html("<div style=\"float: left; width: 16px; height:
16px; background-image: url(/images/notes-features.png);
background-position:-32px 16px; margin-right: 8px; overflow: hidden;\"
border=\"0\" alt=\"success\" title=\"Thank you for voting!\"></div>" +
data.update);
+ }
+ else {
+ var responsedata = "Error :(";
+ if (data.message != null) {
+ responsedata = data.message;
+ }
+ $("#V"+id).html("<div style=\"float: left; width: 16px; height:
16px; background-image: url(/images/notes-features.png);
background-position:-32px 0px; margin-right: 8px; overflow: hidden;\"
border=\"0\" alt=\"fail\" title=\"" + responsedata + "\"></div>");
+ }
+ });
+ request.fail(function(jqXHR, textStatus) {
+ $("#Vu"+id).show();
+ $("#Vd"+id).show();
+ $("#V"+id).html("<div style=\"float: left; width: 16px; height:
16px; background-image: url(/images/notes-features.png);
background-position:-32px 0px; margin-right: 8px; overflow: hidden;\"
border=\"0\" alt=\"fail\" title=\"Error :(\"></div>");
+ });
+ request.always(function(data) {
+ $("#V"+id).fadeIn(500, "linear");
+ });
+ }
+ );
+ }
+ );
+ if (window.location.href.match(/#\d+$/)) {
+ var highlightId = window.location.href.match(/#(\d+)$/);
+ highlightId = highlightId[1];
+ $("#Hcom"+highlightId).effect("highlight", {}, 3000);
+ }
+});
diff --git a/manual/vote-note.php b/manual/vote-note.php
new file mode 100644
index 0000000..74ec804
--- /dev/null
+++ b/manual/vote-note.php
@@ -0,0 +1,203 @@
+<?php
+// $Id$
+
+$_SERVER['BASE_PAGE'] = 'manual/vote-note.php';
+include_once $_SERVER['DOCUMENT_ROOT'] . '/include/prepend.inc';
+include_once $_SERVER['DOCUMENT_ROOT'] . '/include/posttohost.inc';
+include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
+include $_SERVER['DOCUMENT_ROOT'] . '/manual/spam_challenge.php';
+
+// Initialize global variables
+$error = false;
+$thankyou = false;
+$BACKpage = htmlspecialchars(isset($_REQUEST['page']) ? $_REQUEST['page'] :
'');
+$BACKid = htmlspecialchars(isset($_REQUEST['id']) ? $_REQUEST['id'] : '');
+$link = "/{$BACKpage}#{$BACKid}";
+$master_url = "http://master.php.net/entry/user-notes-vote.php";
+
+
+if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ if (isset($_SERVER['HTTP_X_JSON']) && $_SERVER['HTTP_X_JSON'] == 'On' &&
!empty($_REQUEST['id']) && !empty($_REQUEST['page']) && ($N =
manual_notes_load($_REQUEST['page'])) && array_key_exists($_REQUEST['id'], $N)
&& !empty($_REQUEST['vote']) && ($_REQUEST['vote'] === 'up' ||
$_REQUEST['vote'] === 'down')) {
+ $response = array();
+ $update = $N[$_REQUEST['id']]['votes']['up'] -
$N[$_REQUEST['id']]['votes']['down'];
+ $hash = substr(md5($_REQUEST['page']), 0, 16);
+ $notes_file = $_SERVER['DOCUMENT_ROOT'] . "/backend/notes/" .
+ substr($hash, 0, 2) . "/$hash";
+ if (!file_exists($notes_file)) {
+ $response["success"] = false;
+ $response["msg"] = "Invalid request.";
+ }
+ else {
+ $data = array(
+ "noteid" => $_REQUEST['id'],
+ "sect" => $_REQUEST['page'],
+ "vote" => $_REQUEST['vote'],
+ "ip" => $_SERVER['REMOTE_ADDR']
+ );
+ if (($r = posttohost($master_url, $data)) === null || strpos($r,"failed
to open socket to") !== false) {
+ $response["success"] = false;
+ $response["msg"] = "Invalid request.";
+ }
+ else {
+ $r = json_decode($r);
+ if (json_last_error() == JSON_ERROR_NONE && isset($r->status) &&
$r->status && isset($r->votes)) {
+ $response["success"] = true;
+ $response["update"] = (int)$r->votes;
+ } else {
+ $response["success"] = false;
+ $response["msg"] = "Response unrecognized.";
+ }
+ }
+ }
+ echo json_encode($response);
+ exit;
+ }
+ elseif (!empty($_REQUEST['id']) && !empty($_REQUEST['page']) && ($N =
manual_notes_load($_REQUEST['page'])) && array_key_exists($_REQUEST['id'], $N)
&& !empty($_REQUEST['vote']) && ($_REQUEST['vote'] === 'up' ||
$_REQUEST['vote'] === 'down')) {
+ if (!empty($_POST['challenge']) && !empty($_POST['func']) ||
empty($_POST['arga']) || empty($_POST['argb'])) {
+ if (!test_answer($_POST['func'], $_POST['arga'], $_POST['argb'],
$_POST['challenge'])) {
+ $error = "Incorrect answer! Please try again.";
+ }
+ else {
+ if ($_REQUEST['vote'] == 'up') {
+ $N[$_REQUEST['id']]['votes']['up']++;
+ }
+ elseif ($_REQUEST['vote'] == 'down') {
+ $N[$_REQUEST['id']]['votes']['down']++;
+ }
+ $update = $N[$_REQUEST['id']]['votes']['up'] -
$N[$_REQUEST['id']]['votes']['down'];
+ $hash = substr(md5($_REQUEST['page']), 0, 16);
+ $notes_file = $_SERVER['DOCUMENT_ROOT'] . "/backend/notes/" .
+ substr($hash, 0, 2) . "/$hash";
+ if (file_exists($notes_file)) {
+ $data = array(
+ "noteid" => $_REQUEST['id'],
+ "sect" => $_REQUEST['page'],
+ "vote" => $_REQUEST['vote'],
+ "ip" => $_SERVER['REMOTE_ADDR'],
+ );
+ if (($r = posttohost($master_url, $data)) !== null &&
strpos($r,"failed to open socket to") === false) {
+ $r = json_decode($r);
+ if (json_last_error() == JSON_ERROR_NONE && isset($r->status) &&
$r->status && isset($r->votes)) {
+ $thankyou = true;
+ } else {
+ $error = "Invalid request.";
+ }
+ }
+ else {
+ $error = "Invalid request.";
+ }
+ }
+ else {
+ $error = "Invalid request.";
+ }
+ }
+ }
+ else {
+ $error = "You did not answer the spam challenge question.";
+ }
+ }
+ else {
+ $error = "Invalid request.3";
+ }
+}
+else {
+ // Site header
+ site_header("Vote On User Notes");
+
+ if (!empty($_REQUEST['id']) && !empty($_REQUEST['page']) && ($N =
manual_notes_load($_REQUEST['page'])) && array_key_exists($_REQUEST['id'], $N)
&& !empty($_REQUEST['vote']) && ($_REQUEST['vote'] === 'up' ||
$_REQUEST['vote'] === 'down')) {
+?>
+ <div class="container" id="notes-dialog" style="width: 100%; padding-bottom:
15px; margin: auto;">
+ <div style="width: 100%; margin: auto;"><h1>Voting</h1></div>
+ <div style="background-color: #f5f5ff; border: 1px solid black; padding:
15px; width: 90%; margin: auto;">
+ <form action="" method="post">
+ <div>
+ <p>Please answer this simple SPAM challenge: <strong><?php $c =
gen_challenge(); echo $c[3]; ?></strong>?<br/>
+ <input type="text" name="challenge" maxlength="10" /> (Example: nine)</p>
+ <p><input type="submit" value="Vote" name="votenote" /></p>
+ </div>
+ <input type="hidden" name="func" value="<?php echo $c[0]; ?>" />
+ <input type="hidden" name="arga" value="<?php echo $c[1]; ?>" />
+ <input type="hidden" name="argb" value="<?php echo $c[2]; ?>" />
+ </form>
+ </div>
+ </div>
+ <div style="width: 100%; margin: auto;"><h1>The Note You're Voting
On</h1></div>
+ <div style="width: 90%; margin: auto; padding: 15px; background-color:
lightgray; border: 1px dashed gray;">
+<?php
+ $backID = htmlspecialchars($_REQUEST['id']);
+ $backPAGE = htmlspecialchars($_REQUEST['page']);
+ manual_note_display(
+ $N[$_REQUEST['id']]['xwhen'], $N[$_REQUEST['id']]['user'],
$N[$_REQUEST['id']]['note'], $N[$_REQUEST['id']]['id'],
+ $N[$_REQUEST['id']]['votes'], false
+ );
+?>
+ </div>
+ <div style="width: 90%; margin: auto;"><p><a href="<?php echo
"/{$backPAGE}#{$backID}"; ?>"><< Back to user notes page</a></p></div>
+<?php
+ }
+ else {
+ $error = "Invalid request.";
+ }
+}
+if ($error) {
+ $error_div = <<<EOL
+ <div style="width: 90%; padding: 15px; margin: auto; border: 1px dotted
red; background-color: #9999cc; color: white;">
+ <div style="float: left; padding: 15px;">
+ <img src="/images/docs-warning.png"/>
+ </div>
+ <p>
+ <strong>There was an error with your request!</strong>
+ </p>
+ </p>
+ $error
+ </p>
+ </div>
+EOL;
+if (!headers_sent()) site_header("Error - Voting");
+?>
+ <div class="container" id="notes-dialog" style="width: 100%; padding-bottom:
15px; margin: auto;">
+ <div style="width: 100%; margin: auto;"><h1>Voting</h1></div>
+ <div style="background-color: #f5f5ff; border: 1px solid black; padding:
15px; width: 90%; margin: auto;">
+ <form action="" method="post">
+ <div>
+ <p>Please answer this simple SPAM challenge: <strong><?php $c =
gen_challenge(); echo $c[3]; ?></strong>?<br/>
+ <input type="text" name="challenge" maxlength="10" /> (Example: nine)</p>
+ <p><input type="submit" value="Vote" name="votenote" /></p>
+ </div>
+ <input type="hidden" name="func" value="<?php echo $c[0]; ?>" />
+ <input type="hidden" name="arga" value="<?php echo $c[1]; ?>" />
+ <input type="hidden" name="argb" value="<?php echo $c[2]; ?>" />
+ </form>
+ <?php echo $error_div; ?>
+ </div>
+ </div>
+<?php
+ if ($error != "Invalid request.") {
+?>
+ <div style="width: 100%; margin: auto;"><h1>The Note You're Voting
On</h1></div>
+ <div style="width: 90%; margin: auto; padding: 15px; background-color:
lightgray; border: 1px dashed gray;">
+<?php
+ $backID = htmlspecialchars($_REQUEST['id']);
+ $backPAGE = htmlspecialchars($_REQUEST['page']);
+ manual_note_display(
+ $N[$_REQUEST['id']]['xwhen'], $N[$_REQUEST['id']]['user'],
$N[$_REQUEST['id']]['note'], $N[$_REQUEST['id']]['id'],
+ $N[$_REQUEST['id']]['votes'], false
+ );
+?>
+ </div>
+ <div style="width: 90%; margin: auto;"><p><a href="<?php echo
"/{$backPAGE}#{$backID}"; ?>"><< Back to user notes page</a></p></div>
+<?php
+ }
+}
+if ($thankyou) {
+ site_header("Thank you for voting!");
+?>
+ <div class="container" id="notes-dialog" style="width: 100%; padding: 15px;
margin: auto;">
+ <h1>Thanks for voting!</h1>
+ <p>To go back to the user notes page <a href="<?php echo $link; ?>">click
here</a>.</p>
+ </div>
+<?php
+}
+
+// Print out common footer
+site_footer();
diff --git a/styles/site.css b/styles/site.css
index dc066a0..7640af4 100644
--- a/styles/site.css
+++ b/styles/site.css
@@ -647,6 +647,84 @@ div#usernotes div.text {
margin-top: 4px;
}
+/* User notes on manual pages --------------------------------------------- */
+div#usernotes {
+ background-color: #e0e0e0;
+ color: inherit;
+}
+div#usernotes div.head, div#usernotes div.foot {
+ background-color: #d0d0d0;
+ color: inherit;
+ padding: 4px;
+}
+div#usernotes div.foot {
+ text-align: right;
+}
+div#usernotes div.foot a, div#usernotes div.head a {
+ color: black;
+ background-color: transparent;
+}
+div#usernotes span.action {
+ float: right;
+}
+div#usernotes div.note {
+ padding: 4px;
+}
+div#usernotes div.text {
+ background-color: #f0f0f0;
+ color: inherit;
+ padding: 2px;
+ margin-top: 4px;
+}
+/* User notes new features */
+div#usernotes a {
+ text-decoration: none;
+ color: #222222;
+}
+div#usernotes a:hover {
+ text-decoration: underline;
+ color: #111111;
+}
+div#usernotes div.features {
+ padding-right: 8px;
+ float: left;
+}
+div#usernotes div.votes {
+ float: left;
+ font-size: 16px;
+ text-align: center;
+ vertical-align: middle;
+ padding-right: 8px;
+}
+div#usernotes a.usernotes-voteu {
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(/images/notes-features.png);
+ background-position:0px 0px;
+ text-indent: -99999px;
+}
+div#usernotes a.usernotes-voted {
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(/images/notes-features.png);
+ background-position:0px 16px;
+ text-indent: -99999px;
+}
+div#usernotes a.usernotes-voteu:hover {
+ background-image: url(/images/notes-features.png);
+ background-position:-16px 0px;
+}
+div#usernotes a.usernotes-voted:hover {
+ background-image: url(/images/notes-features.png);
+ background-position:-16px 16px;
+}
+div#usernotes div.features {
+ float: left;
+ display: block;
+}
+
/* Left sidebar TOC on manual pages --------------------------------------- */
ul.toc {
margin: 0px 5px 5px 5px;
diff --git a/styles/theme.css b/styles/theme.css
index b5e3a86..b97d6a6 100755
--- a/styles/theme.css
+++ b/styles/theme.css
@@ -408,6 +408,55 @@ hr {
padding-top:1.5em;
}
+/* User notes new features */
+#usernotes a {
+ text-decoration: none;
+ color: #222222;
+}
+#usernotes a:hover {
+ text-decoration: underline;
+ color: #111111;
+}
+#usernotes div.features {
+ padding-right: 8px;
+ float: left;
+}
+#usernotes div.votes {
+ float: left;
+ font-size: 16px;
+ text-align: center;
+ vertical-align: middle;
+ padding-right: 8px;
+}
+#usernotes a.usernotes-voteu {
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(/images/notes-features.png);
+ background-position:0px 0px;
+ text-indent: -99999px;
+}
+#usernotes a.usernotes-voted {
+ display: block;
+ width: 16px;
+ height: 16px;
+ background-image: url(/images/notes-features.png);
+ background-position:0px 16px;
+ text-indent: -99999px;
+}
+#usernotes a.usernotes-voteu:hover {
+ background-image: url(/images/notes-features.png);
+ background-position:-16px 0px;
+}
+#usernotes a.usernotes-voted:hover {
+ background-image: url(/images/notes-features.png);
+ background-position:-16px 16px;
+}
+#usernotes div.features {
+ float: left;
+ display: block;
+}
+
#usernotes .date, #usernotes .admin {
float:right;
text-align: right;--
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php