Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create UserNoteService class #710

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 0 additions & 29 deletions include/layout.inc
Original file line number Diff line number Diff line change
Expand Up @@ -139,21 +139,6 @@ function make_link(string $url, string $linktext = ''): string
return sprintf("<a href=\"%s\">%s</a>", $url, $linktext ?: $url);
}

// make_popup_link()
// return a hyperlink to something, within the site, that pops up a new window
//
function make_popup_link($url, $linktext = false, $target = false, $windowprops = "", $extras = false) {
return sprintf("<a href=\"%s\" target=\"%s\" onclick=\"window.open('%s','%s','%s');return false;\"%s>%s</a>",
htmlspecialchars($url, ENT_QUOTES | ENT_IGNORE),
($target ?: "_new"),
htmlspecialchars($url, ENT_QUOTES | ENT_IGNORE),
($target ?: "_new"),
$windowprops,
($extras ? ' ' . $extras : ''),
($linktext ?: $url),
);
}

// Print a link for a downloadable file (including filesize)
function download_link($file, $title): void
{
Expand Down Expand Up @@ -195,20 +180,6 @@ function clean($var) {
return htmlspecialchars($var, ENT_QUOTES);
}

// Clean out the content of one user note for printing to HTML
function clean_note($text)
{
// Highlight PHP source
$text = highlight_php(trim($text), true);

// Turn urls into links
return preg_replace(
'!((mailto:|(https?|ftp|nntp|news)://).*?)(\s|<|\)|"|\\\\|\'|$)!',
'<a href="\1" rel="nofollow" target="_blank">\1</a>\4',
$text,
);
}

function display_errors($errors): void
{
echo '<div class="errors">';
Expand Down
202 changes: 6 additions & 196 deletions include/shared-manual.inc
Original file line number Diff line number Diff line change
Expand Up @@ -24,178 +24,7 @@ $PGI = []; $SIDEBAR_DATA = '';

require_once __DIR__ . '/../src/autoload.php';

use phpweb\UserNotes\Sorter;
use phpweb\UserNotes\UserNote;

/**
* Print out all user notes for this manual page
*
* @param array<string, UserNote> $notes
*/
function manual_notes($notes):void {
// Get needed values
list($filename) = $GLOBALS['PGI']['this'];

// Drop file extension from the name
if (substr($filename, -4) == '.php') {
$filename = substr($filename, 0, -4);
}

$sorter = new Sorter();
$sorter->sort($notes);

// Link target to add a note to the current manual page,
// and it's extended form with a [+] image
$addnotelink = '/manual/add-note.php?sect=' . $filename .
'&amp;redirect=' . $_SERVER['BASE_HREF'];
$addnotesnippet = make_link(
$addnotelink,
"+<small>add a note</small>",
);

$num_notes = count($notes);
$noteCountHtml = '';
if ($num_notes) {
$noteCountHtml = "<span class=\"count\">$num_notes note" . ($num_notes == 1 ? '' : 's') . "</span>";
}

echo <<<END_USERNOTE_HEADER
<section id="usernotes">
<div class="head">
<span class="action">{$addnotesnippet}</span>
<h3 class="title">User Contributed Notes {$noteCountHtml}</h3>
</div>
END_USERNOTE_HEADER;

// If we have no notes, then inform the user
if ($num_notes === 0) {
echo "\n <div class=\"note\">There are no user contributed notes for this page.</div>";
} else {
// If we have notes, print them out
echo '<div id="allnotes">';
foreach ($notes as $note) {
manual_note_display($note);
}
echo "</div>\n";
echo "<div class=\"foot\">$addnotesnippet</div>\n";
}
echo "</section>";
}

/**
* Get user notes from the appropriate text dump
*
* @return array<string, UserNote>
*/
function manual_notes_load(string $id): array
{
$hash = substr(md5($id), 0, 16);
$notes_file = $_SERVER['DOCUMENT_ROOT'] . "/backend/notes/" .
substr($hash, 0, 2) . "/$hash";

// Open the note file for reading and get the data (12KB)
// ..if it exists
if (!file_exists($notes_file)) {
return [];
}
$notes = [];
if ($fp = @fopen($notes_file, "r")) {
while (!feof($fp)) {
$line = chop(fgets($fp, 12288));
if ($line == "") { continue; }
@list($id, $sect, $rate, $ts, $user, $note, $up, $down) = explode("|", $line);
$notes[$id] = new UserNote($id, $sect, $rate, $ts, $user, base64_decode($note, true), (int) $up, (int) $down);
}
fclose($fp);
}
return $notes;
}

// Print out one user note entry
function manual_note_display(UserNote $note, $voteOption = true): void
{
if ($note->user) {
$name = "\n <strong class=\"user\"><em>" . htmlspecialchars($note->user) . "</em></strong>";
} else {
$name = "<strong class=\"user\"><em>Anonymous</em></strong>";
}
$name = ($note->id ? "\n <a href=\"#{$note->id}\" class=\"name\">$name</a><a class=\"genanchor\" href=\"#{$note->id}\"> &para;</a>" : "\n $name");

// New date style will be relative time
$date = new DateTime("@{$note->ts}");
$datestr = relTime($date);
$fdatestr = $date->format("Y-m-d h:i");
$text = clean_note($note->text);

// Calculate note rating by up/down votes
$vote = $note->upvotes - $note->downvotes;
$p = floor(($note->upvotes / (($note->upvotes + $note->downvotes) ?: 1)) * 100);
$rate = !$p && !($note->upvotes + $note->downvotes) ? "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{$note->id}">
<a href="/manual/vote-note.php?id={$note->id}&amp;page={$rredir_filename}&amp;vote=up" title="Vote up!" class="usernotes-voteu">up</a>
</div>
<div id="Vd{$note->id}">
<a href="/manual/vote-note.php?id={$note->id}&amp;page={$rredir_filename}&amp;vote=down" title="Vote down!" class="usernotes-voted">down</a>
</div>
<div class="tally" id="V{$note->id}" title="{$rate}">
{$vote}
</div>
</div>
VOTEDIV;
} else {
$votediv = null;
}

// If the viewer is logged in, show admin options
if (isset($_COOKIE['IS_DEV']) && $note->id) {

$admin = "\n <span class=\"admin\">\n " .

make_popup_link(
'https://main.php.net/manage/user-notes.php?action=edit+' . $note->id,
'<img src="/images/notes-edit@2x.png" height="12" width="12" alt="edit note">',
'admin',
'scrollbars=yes,width=650,height=400',
) . "\n " .

make_popup_link(
'https://main.php.net/manage/user-notes.php?action=reject+' . $note->id,
'<img src="/images/notes-reject@2x.png" height="12" width="12" alt="reject note">',
'admin',
'scrollbars=no,width=300,height=200',
) . "\n " .

make_popup_link(
'https://main.php.net/manage/user-notes.php?action=delete+' . $note->id,
'<img src="/images/notes-delete@2x.png" height="12" width="12" alt="delete note">',
'admin',
'scrollbars=no,width=300,height=200',
) . "\n </span>";

} else {
$admin = '';
}

echo <<<USER_NOTE_TEXT

<div class="note" id="{$note->id}">{$votediv}{$name}{$admin}<div class="date" title="$fdatestr"><strong>{$datestr}</strong></div>
<div class="text" id="Hcom{$note->id}">
{$text}
</div>
</div>
USER_NOTE_TEXT;

}
use phpweb\UserNotes\UserNoteService;

function manual_navigation_breadcrumbs(array $setup) {
$menu = [];
Expand Down Expand Up @@ -293,7 +122,9 @@ function manual_setup($setup): void {
if (substr($filename, -4) == '.php') {
$filename = substr($filename, 0, -4);
}
$USERNOTES = manual_notes_load($filename);

$userNoteService = new UserNoteService();
$USERNOTES = $userNoteService->load($filename);
if ($USERNOTES) {
$note = current($USERNOTES);
$timestamps[] = $note->ts;
Expand Down Expand Up @@ -384,31 +215,10 @@ CHANGE_LANG;
function manual_footer(): void {
global $USERNOTES, $__RELATED;

manual_notes($USERNOTES);
$userNoteService = new UserNoteService();
$userNoteService->display($USERNOTES);
site_footer([
'related_menu' => $__RELATED['toc'],
'related_menu_deprecated' => $__RELATED['toc_deprecated'],
]);
}

// 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 = ["year" => $diff->format("%y"),
"month" => $diff->format("%m"),
"day" => $diff->format("%d"),
"hour" => $diff->format("%h"),
"minute" => $diff->format("%i"),
"second" => $diff->format("%s"),
];
$out = "just now...";
foreach ($units as $unit => $amount) {
if (empty($amount)) {
continue;
}
$out = $amount . " " . ($amount == 1 ? $unit : $unit . "s") . " ago";
break;
}
return $out;
}
4 changes: 3 additions & 1 deletion manual/add-note.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
include __DIR__ . '/spam_challenge.php';

use phpweb\UserNotes\UserNote;
use phpweb\UserNotes\UserNoteService;

site_header("Add Manual Note", ['css' => 'add-note.css']);

Expand Down Expand Up @@ -139,9 +140,10 @@
if ($error) { echo "<p class=\"formerror\">$error</p>\n"; }

// Print out preview of note
$userNoteService = new UserNoteService();
echo '<p>This is what your entry will look like, roughly:</p>';
echo '<div id="usernotes">';
manual_note_display(new UserNote('', '', '', time(), $user, $note));
$userNoteService->displaySingle(new UserNote('', '', '', time(), $user, $note));
echo '</div><br><br>';
}

Expand Down
14 changes: 9 additions & 5 deletions manual/vote-note.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<?php

use phpweb\UserNotes\UserNoteService;

$_SERVER['BASE_PAGE'] = 'manual/vote-note.php';
include_once __DIR__ . '/../include/prepend.inc';
include_once __DIR__ . '/../include/posttohost.inc';
Expand All @@ -13,9 +16,10 @@
$BACKid = htmlspecialchars($_REQUEST['id'] ?? '');
$link = "/{$BACKpage}#{$BACKid}";
$master_url = "https://main.php.net/entry/user-notes-vote.php";
$notes = new UserNoteService();

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')) {
if (isset($_SERVER['HTTP_X_JSON']) && $_SERVER['HTTP_X_JSON'] == 'On' && !empty($_REQUEST['id']) && !empty($_REQUEST['page']) && ($N = $notes->load($_REQUEST['page'])) && array_key_exists($_REQUEST['id'], $N) && !empty($_REQUEST['vote']) && ($_REQUEST['vote'] === 'up' || $_REQUEST['vote'] === 'down')) {
$response = [];
$hash = substr(md5($_REQUEST['page']), 0, 16);
$notes_file = $_SERVER['DOCUMENT_ROOT'] . "/backend/notes/" . substr($hash, 0, 2) . "/$hash";
Expand Down Expand Up @@ -51,7 +55,7 @@
echo json_encode($response);
exit;
}
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')) {
if (!empty($_REQUEST['id']) && !empty($_REQUEST['page']) && ($N = $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.";
Expand Down Expand Up @@ -102,7 +106,7 @@
site_header("Vote On User Notes");
$headerset = true;

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')) {
if (!empty($_REQUEST['id']) && !empty($_REQUEST['page']) && ($N = $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>
Expand All @@ -124,7 +128,7 @@
<?php
$backID = htmlspecialchars($_REQUEST['id']);
$backPAGE = htmlspecialchars($_REQUEST['page']);
manual_note_display($N[$_REQUEST['id']], false);
$notes->displaySingle($N[$_REQUEST['id']], false);
?>
</div>
<div style="width: 90%; margin: auto;"><p><a href="<?php echo "/{$backPAGE}#{$backID}"; ?>">&lt;&lt; Back to user notes page</a></p></div>
Expand Down Expand Up @@ -177,7 +181,7 @@
<?php
$backID = htmlspecialchars($_REQUEST['id']);
$backPAGE = htmlspecialchars($_REQUEST['page']);
manual_note_display($N[$_REQUEST['id']], false);
$notes->displaySingle($N[$_REQUEST['id']], false);
?>
</div>
<div style="width: 90%; margin: auto;"><p><a href="<?php echo "/{$backPAGE}#{$backID}"; ?>">&lt;&lt; Back to user notes page</a></p></div>
Expand Down
Loading