From 207588f1c22363887385434957b74d48d1b7c564 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Tue, 18 May 2004 19:58:35 +0000 Subject: [PATCH] Articles page with search. Add format_text() function to convert from plain text to HTML. Drop FAQ page, the articles page will do it. --- www/articles.php | 284 ++++++++++++++++++++++++++++++++++------- www/data/make-form.php | 77 ++++++++--- www/data/makedb | 11 +- www/faq.php | 20 --- www/phplib/common.php | 183 +++++++++++++++++++++++++- www/phplib/html.php | 3 +- www/str.php | 34 +++-- 7 files changed, 509 insertions(+), 103 deletions(-) delete mode 100644 www/faq.php diff --git a/www/articles.php b/www/articles.php index 1efa07c..c6b9ff9 100644 --- a/www/articles.php +++ b/www/articles.php @@ -1,6 +1,6 @@ Command '$op' requires a login!\n"); + html_footer(); + exit(); + } + if ($op == 'N' && $id) { html_header("Article Error"); @@ -55,6 +77,35 @@ if ($argc) html_footer(); exit(); } + + for ($i = 1; $i < $argc; $i ++) + { + $option = substr($argv[$i], 1); + + switch ($argv[$i][0]) + { + case 'Q' : // Set search text + $search = $option; + $i ++; + while ($i < $argc) + { + $search .= " $argv[$i]"; + $i ++; + } + break; + case 'I' : // Set first STR + $index = (int)$option; + if ($index < 0) + $index = 0; + break; + default : + html_header("Article Error"); + print("

Bad option '$argv[$i]'!

\n"); + html_footer(); + exit(); + break; + } + } } else { @@ -62,6 +113,14 @@ else $id = 0; } +if ($REQUEST_METHOD == "POST") +{ + if (array_key_exists("SEARCH", $_POST)) + $search = $_POST["SEARCH"]; +} + +$options = "+I$index+Q" . urlencode($search); + switch ($op) { case 'D' : // Delete Article @@ -69,7 +128,7 @@ switch ($op) { db_query("DELETE FROM article WHERE id = $id"); - header("Location: $PHP_SELF?L"); + header("Location: $PHP_SELF?L$options"); } else { @@ -86,9 +145,9 @@ switch ($op) html_header("Delete Article #$id"); html_start_links(1); - html_link("Return to Article List", "$PHP_SELF?L"); - html_link("View Article #$id", "$PHP_SELF?L$id"); - html_link("Modify Article #$id", "$PHP_SELF?M$id"); + html_link("Return to Articles", "$PHP_SELF?L$options"); + html_link("View Article #$id", "$PHP_SELF?L$id$options"); + html_link("Modify Article #$id", "$PHP_SELF?M$id$options"); html_end_links(); print("

Delete Article #$id

\n"); @@ -132,9 +191,12 @@ switch ($op) $row = db_next($result); html_start_links(1); - html_link("Return to Article List", "$PHP_SELF?L"); - html_link("Modify Article", "$PHP_SELF?M$id"); - html_link("Delete Article #$id", "$PHP_SELF?D$id"); + html_link("Return to Articles", "$PHP_SELF?L$options"); + if ($LOGIN_USER) + { + html_link("Modify Article", "$PHP_SELF?M$id$options"); + html_link("Delete Article #$id", "$PHP_SELF?D$id$options"); + } html_end_links(); print("

Article #$id

\n"); @@ -146,29 +208,98 @@ switch ($op) ."currently hidden from public view.\n"); $temp = htmlspecialchars($row['title']); - print("Title:$temp\n"); + print("Title:$temp\n"); $temp = htmlspecialchars($row['abstract']); - print("Abstract:$temp\n"); + print("Abstract:$temp\n"); - $temp = htmlspecialchars($row['contents']); - print("Contents:$temp\n"); + $temp = format_text($row['contents']); + print("Contents:$temp\n"); print("

\n"); db_free($result); } else { - html_header("Article List"); + html_header("Articles"); html_start_links(1); - html_link("New Article", "$PHP_SELF?N"); + html_link("Post New Article", "$PHP_SELF?N$options"); html_end_links(); - $result = db_query("SELECT * FROM article"); + print("

Articles

\n"); + + print("

" + ."Search Words:  " + ."

\n"); + + print("
\n"); + + $query = ""; + $prefix = "WHERE "; + + if (!$LOGIN_USER) + { + $query .= "${prefix}is_published = 1"; + $prefix = " AND "; + } + + if ($search) + { + $search_string = str_replace("'", " ", $search); + $search_string = str_replace("\"", " ", $search_string); + $search_string = str_replace("\\", " ", $search_string); + $search_string = str_replace("%20", " ", $search_string); + $search_string = str_replace("%27", " ", $search_string); + $search_string = str_replace(" ", " ", $search_string); + $search_words = explode(' ', $search_string); + + // Loop through the array of words, adding them to the + $query .= "${prefix}("; + $prefix = ""; + $next = " OR"; + $logic = ""; + + reset($search_words); + while ($keyword = current($search_words)) + { + next($search_words); + $keyword = db_escape(ltrim(rtrim($keyword))); + + if (strcasecmp($keyword, 'or') == 0) + { + $next = ' OR'; + if ($prefix != '') + $prefix = ' OR'; + } + else if (strcasecmp($keyword, 'and') == 0) + { + $next = ' AND'; + if ($prefix != '') + $prefix = ' AND'; + } + else if (strcasecmp($keyword, 'not') == 0) + { + $logic = ' NOT'; + } + else + { + $query .= "$prefix$logic (title LIKE \"%$keyword%\"" + ." OR abstract LIKE \"%$keyword%\"" + ." OR contents LIKE \"%$keyword%\")"; + $prefix = $next; + $logic = ''; + } + } + + $query .= ")"; + } + + $result = db_query("SELECT * FROM article $query " + ."ORDER BY modify_date"); $count = db_count($result); - print("

Article List

\n"); if ($count == 0) { print("

No Articles found.

\n"); @@ -177,33 +308,95 @@ switch ($op) exit(); } - html_start_table(array("Title","Abstract","Contents")); + if ($index >= $count) + $index = $count - ($count % $ARTICLE_PAGE_MAX); + if ($index < 0) + $index = 0; + + $start = $index + 1; + $end = $index + $ARTICLE_PAGE_MAX; + if ($end > $count) + $end = $count; + + $prev = $index - $ARTICLE_PAGE_MAX; + if ($prev < 0) + $prev = 0; + $next = $index + $ARTICLE_PAGE_MAX; - while ($row = db_next($result)) + print("

$count article(s) found, showing $start to $end:

\n"); + + if ($count > $ARTICLE_PAGE_MAX) + { + print("

\n"); + + print("\n"); + print("
"); + if ($index > 0) + print("[ Previous $ARTICLE_PAGE_MAX ]"); + print(""); + if ($end < $count) + { + $next_count = min($ARTICLE_PAGE_MAX, $count - $end); + print("[ Next $next_count ]"); + } + print("

\n"); + } + + html_start_table(array("ID","Title","Last Modified")); + + db_seek($result, $index); + for ($i = 0; $i < $ARTICLE_PAGE_MAX && $row = db_next($result); $i ++) { html_start_row(); $id = $row['id']; - $temp = htmlspecialchars($row['title']); - print("" - ."$temp"); + ."$id"); - $temp = htmlspecialchars($row['abstract']); - print("" ."$temp"); - $temp = htmlspecialchars($row['contents']); - print("" ."$temp"); html_end_row(); + + html_start_row(); + $temp = htmlspecialchars($row['abstract']); + print("$temp"); + html_end_row(); } html_end_table(); + + if ($count > $ARTICLE_PAGE_MAX) + { + print("

\n"); + + print("\n"); + print("
"); + if ($index > 0) + print("[ Previous $ARTICLE_PAGE_MAX ]"); + print(""); + if ($end < $count) + { + $next_count = min($ARTICLE_PAGE_MAX, $count - $end); + print("[ Next $next_count ]"); + } + print("

\n"); + } } html_footer(); @@ -227,15 +420,15 @@ switch ($op) ."modify_user = '$LOGIN_USER' " ."WHERE id = $id"); - header("Location: $PHP_SELF?L$id"); + header("Location: $PHP_SELF?L$id$options"); } else { html_header("Modify Article #$id"); html_start_links(1); - html_link("Return to Article List", "$PHP_SELF?L"); - html_link("Article #$id", "$PHP_SELF?L$id"); + html_link("Return to Articles", "$PHP_SELF?L$options"); + html_link("Article #$id", "$PHP_SELF?L$id$options"); html_end_links(); print("

Modify Article #$id

\n"); @@ -249,7 +442,7 @@ switch ($op) $row = db_next($result); - print("
" + print("" ."

\n"); print("" - ."" - ."" - ."" - ."" - ."" - .""); + print("$link$row[id]" + ."" + ."" + ."" + ."" + ."" + .""); if ($row['manager_email'] != "") $email = sanitize_email($row['manager_email']); else $email = "Unassigned"; - print(""); + print(""); html_end_row(); @@ -911,10 +914,13 @@ switch ($op) ."'>Previous $STR_PAGE_MAX ]"); print("\n"); print("
Published:"); @@ -298,23 +491,28 @@ switch ($op) $id = db_insert_id(); - header("Location: $PHP_SELF?L$id"); + header("Location: $PHP_SELF?L$id$options"); break; } - html_header("New Article"); + html_header("Post New Article"); html_start_links(1); - html_link("Return to Article List", "$PHP_SELF?L"); + html_link("Return to Articles", "$PHP_SELF?L$options"); html_end_links(); - print("

New Article

\n"); - print("" + print("

Post New Article

\n"); + print("" ."

\n"); - print("\n"); + if ($LOGIN_USER != "") + { + print("\n"); + } + else + print("\n"); print("" ."" + if ($row['type'] == "TEXT") + print(" \$temp = format_text(\$row['$row[name]']);\n"); + else + print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n"); + print(" print(\"" ."\\n\");\n"); print("\n"); break; @@ -245,30 +256,32 @@ print(" html_footer();\n"); print(" exit();\n"); print(" }\n"); print("\n"); -print(" html_start_table(array("); +print(" html_start_table(array(\"ID\""); sqlite_seek($result, 0); -$firsttime = 1; + +$list_columns = 0; while ($row = sqlite_fetch_array($result)) switch ($row['name']) { case "id" : case "create_date" : case "create_user" : - case "modify_date" : case "modify_user" : case "is_published" : + case "abstract" : + case "contents" : + break; + + case "modify_date" : + print(",\"Last Modified\""); + $list_columns ++; break; default : $name = ucwords(str_replace('_', ' ', $row['name'])); - if ($firsttime) - { - print("\"$name\""); - $firsttime = 0; - } - else - print(",\"$name\""); + print(",\"$name\""); + $list_columns ++; break; } @@ -285,18 +298,31 @@ while ($row = sqlite_fetch_array($result)) { case "id" : print(" \$id = \$row['id'];\n\n"); + print(" print(\"\");\n"); + print("\n"); + break; + + case "modify_date" : + print(" \$temp = date(\"M d, Y\", \$row['modify_date']);\n"); + print(" print(\"\");\n"); + print("\n"); break; case "create_date" : case "create_user" : - case "modify_date" : case "modify_user" : case "is_published" : + case "contents" : + case "abstract" : break; default : print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n"); - print(" print(\"\");\n"); print("\n"); @@ -304,6 +330,18 @@ while ($row = sqlite_fetch_array($result)) } print(" html_end_row();\n"); + +sqlite_seek($result, 0); +while ($row = sqlite_fetch_array($result)) + if ($row['name'] == "abstract") + { + print("\n"); + print(" html_start_row();\n"); + print(" \$temp = htmlspecialchars(\$row['abstract']);\n"); + print(" print(\"\");\n"); + print(" html_end_row();\n"); + } + print(" }\n"); print("\n"); print(" html_end_table();\n"); @@ -499,9 +537,14 @@ print(" print(\"

New $tname

\\n\");\n"); print(" print(\"\"\n"); print(" .\"

Published:"); - select_is_published(); - print("
Published:"); + select_is_published(); + print("
Title: diff --git a/www/data/make-form.php b/www/data/make-form.php index a3f5be7..dfd10bc 100755 --- a/www/data/make-form.php +++ b/www/data/make-form.php @@ -83,6 +83,14 @@ print(" html_footer();\n"); print(" exit();\n"); print(" }\n"); print("\n"); +print(" if ((\$op == 'D' || \$op == 'M') && \$LOGIN_USER == \"\")\n"); +print(" {\n"); +print(" html_header(\"$tname Error\");\n"); +print(" print(\"

Command '\$op' requires a login!\\n\");\n"); +print(" html_footer();\n"); +print(" exit();\n"); +print(" }\n"); +print("\n"); print(" if (\$op == 'N' && \$id)\n"); print(" {\n"); print(" html_header(\"$tname Error\");\n"); @@ -214,8 +222,11 @@ while ($row = sqlite_fetch_array($result)) default : $name = ucwords(str_replace('_', ' ', $row['name'])); - print(" \$temp = htmlspecialchars(\$row['$row[name]']);\n"); - print(" print(\"

$name:
$name:\$temp
\"\n"); + print(" .\"\$id\"\n"); + print(" .\"\$temp\"\n"); print(" .\"\$temp\$temp
\\n\");\n"); print("\n"); -print(" print(\"\\n\");\n"); +print(" if (\$LOGIN_USER != \"\")\n"); +print(" {\n"); +print(" print(\"\\n\");\n"); +print(" }\n"); +print(" else\n"); +print(" print(\"\\n\");\n"); print("\n"); sqlite_seek($result, 0); diff --git a/www/data/makedb b/www/data/makedb index e8ea443..c8ed87b 100755 --- a/www/data/makedb +++ b/www/data/makedb @@ -1,5 +1,12 @@ #!/bin/sh +if test -f mxml.db; then + rm -f mxml.db.old + mv mxml.db mxml.db.old +fi + sqlite mxml.db diff --git a/www/phplib/common.php b/www/phplib/common.php index 928bdb8..c971670 100644 --- a/www/phplib/common.php +++ b/www/phplib/common.php @@ -1,11 +1,13 @@ "; + + for ($i = 0; $i < $len; $i ++) + { + switch ($text[$i]) + { + case '<' : + $col ++; + $ftext .= "<"; + break; + + case '>' : + $col ++; + $ftext .= ">"; + break; + + case '&' : + $col ++; + $ftext .= "&"; + break; + + case "\n" : + if (($i + 1) < $len && + ($text[$i + 1] == "\n" || $text[$i + 1] == "\r")) + { + while (($i + 1) < $len && + ($text[$i + 1] == "\n" || $text[$i + 1] == "\r")) + $i ++; + + if ($pre) + { + $ftext .= ""; + $pre = 0; + } + + if (($i + 1) < $len && $text[$i + 1] != '-' && $list) + { + $ftext .= "\n\n

"; + $list = 0; + } + else + $ftext .= "\n

"; + } + else if (($i + 1) < $len && + ($text[$i + 1] == " " || $text[$i + 1] == "\t")) + { + if ($pre) + { + $ftext .= ""; + $pre = 0; + } + else + $ftext .= "
\n"; + } + + $col = 0; + break; + + case "\r" : + break; + + case "\t" : + if ($col == 0) + $ftext .= "        "; + else + $ftext .= " "; + break; + + case " " : + if ($col == 0 && !pre) + { + for ($j = $i + 1; $j < $len; $j ++) + if ($text[$j] != " " && $text[$j] != "\t") + break; + + if ($j < $len && $text[$j] == "%") + { + $ftext .= "\n

";
+	      $pre   = 1;
+	    }
+
+	    $ftext .= " ";
+	  }
+	  else if ($text[$i + 1] == " ")
+	    $ftext .= " ";
+	  else
+            $ftext .= " ";
+
+          if ($col > 0)
+	    $col ++;
+	  break;
+
+      case '*' :
+          if ($bold)
+	    $ftext .= "";
+	  else
+	    $ftext .= "";
+
+	  $bold = 1 - $bold;
+	  break;
+
+      case '-' :
+          // Possible list...
+	  if ($col == 0)
+	  {
+	    if (!$list)
+	    {
+	      $ftext .= "\n
    "; + $list = 1; + } + + $ftext .= "\n
  • "; + + while (($i + 1) < $len && $text[$i + 1] == "-") + $i ++; + break; + } + + $col ++; + $ftext .= $text[$i]; + break; + + case 'f' : + case 'h' : + if (substr($text, $i, 7) == "http://" || + substr($text, $i, 8) == "https://" || + substr($text, $i, 6) == "ftp://") + { + // Extract the URL and make this a link... + for ($j = $i; $j < $len; $j ++) + if ($text[$j] == " " || $text[$j] == "\n" || $text[$j] == "\r" || + $text[$j] == "\t" || $text[$j] == "\'" || $text[$j] == "'") + break; + + $count = $j - $i; + $url = substr($text, $i, $count); + $ftext .= "$url"; + $col += $count; + $i = $j - 1; + break; + } + + default : + $col ++; + $ftext .= $text[$i]; + break; + } + } + + if ($bold) + $ftext .= ""; + + if ($list) + $ftext .= "
"; + + return ($ftext); +} + + // // 'quote_text()' - Quote a string... // @@ -169,7 +342,7 @@ quote_text($text, // I - Original string } } - return $qtext; + return ($qtext); } @@ -216,7 +389,7 @@ sanitize_email($email, // I - Email address } } - return trim($nemail); + return (trim($nemail)); } @@ -286,7 +459,7 @@ sanitize_text($text) // I - Original text else $qtext .= quote_text($word); - return $qtext; + return ($qtext); } @@ -313,6 +486,6 @@ select_is_published($is_published = 1) // I - Default state // -// End of "$Id: common.php,v 1.3 2004/05/18 12:02:02 mike Exp $". +// End of "$Id: common.php,v 1.4 2004/05/18 19:58:35 mike Exp $". // ?> diff --git a/www/phplib/html.php b/www/phplib/html.php index eb4371c..e50c979 100644 --- a/www/phplib/html.php +++ b/www/phplib/html.php @@ -1,6 +1,6 @@ Articles | " ."Documentation | " ."Download | " - ."FAQ | " ."Support ]" ."
\n"); print("
Published:\");\n"); -print(" select_is_published();\n"); -print(" print(\"
Published:\");\n"); +print(" select_is_published();\n"); +print(" print(\"
[ "); diff --git a/www/str.php b/www/str.php index 4ce4f6b..f1b5e29 100644 --- a/www/str.php +++ b/www/str.php @@ -1,6 +1,6 @@ Previous $STR_PAGE_MAX ]"); print(""); if ($end < $count) + { + $next_count = min($STR_PAGE_MAX, $count - $end); print("[ Next $STR_PAGE_MAX ]"); + ."'>Next $next_count ]"); + } print("

\n"); } @@ -801,28 +804,28 @@ switch ($op) $prtext = $priority_text[$row['priority']]; $sttext = $status_text[$row['status']]; $sctext = $scope_text[$row['scope']]; + $link = ""; html_start_row(); print("
"); if ($LOGIN_USER) print(""); - print("" - ."$row[id]$prtext$sttext$sctext$summabbr$row[str_version]$date$link$prtext$link$sttext$link$sctext$link$summabbr$link$row[str_version]$link$date$email$link$email"); if ($end < $count) + { + $next_count = min($STR_PAGE_MAX, $count - $end); print("[ Next $STR_PAGE_MAX ]"); + ."'>Next $next_count ]"); + } print("

\n"); } @@ -1842,6 +1848,6 @@ switch ($op) } // -// End of "$Id: str.php,v 1.5 2004/05/18 01:39:00 mike Exp $". +// End of "$Id: str.php,v 1.6 2004/05/18 19:58:34 mike Exp $". // ?>