Archived
1
0
Disbranĉigi 0

Way too much for a single commit...

This commit is contained in:
Jenga Phoenix 2019-02-18 23:24:07 -06:00
parent 4060b1c913
commit 6f37abd11c
24 changed files with 751 additions and 95 deletions

View File

@ -10,10 +10,11 @@
$depth = "";
$title = "About";
$mark = "about";
include "res/lib/load.php";
// ------------------------------------
display_page("about.twig.html", $depth, $title);
display_page($mark, $depth, $title);
?>

View File

@ -10,10 +10,12 @@
$title = "Control Panel";
$depth = "../";
$mark = "admin_index";
include "../res/lib/load.php";
// --------------------------------------
display_page("admin_index.twig.html", $depth, $title);
display_page($mark, $depth, $title);
echo profanity_sharpie("fuck you bitch ass shit");
?>

View File

@ -11,42 +11,34 @@
$depth = "../../";
include "../../res/lib/load.php";
$auth_user = $_POST['auth_user'];
$auth_pass = $_POST['auth_pass'];
$auth_user_id = user_name_to_id($auth_user);
$auth_user = scrub($_POST['auth_user']);
$auth_pass = scrub($_POST['auth_pass']);
$auth_id = user_name_to_id($auth_user);
$id = intval($_POST['id']);
$name = $_POST['name'];
$full_name = $_POST['full_name'];
$bio = $_POST['bio'];
$email = $_POST['email'];
$url = $_POST['url'];
$password = $_POST['password'];
$login = $_POST['login'];
$password = password_hash($password, PASSWORD_BCRYPT, array('cost' => 11));
$name = scrub($_POST['name']);
$full = scrub($_POST['full_name']);
$bio = scrub($_POST['bio']);
$email = scrub($_POST['email']);
$url = scrub($_POST['url']);
$pass = scrub($_POST['password']);
$login = scrub($_POST['login']);
// -------------------------------------
auth_enforce($auth_user_id, $auth_pass,
auth_enforce($auth_id, $auth_pass,
array("wizard", "archmage"), "make accounts");
$invalid = input_enforce(array($id, $name, $full_name, $bio, $email, $url,
$password, $login),
array("ID", "Username", "Full name", "Biography", "E-mail",
input_enforce(array($name, $full, $bio, $email, $url, $pass,
$login),
array("Username", "Full name", "Biography", "E-mail",
"URL", "Password", "Login class"),
array("free_user_id", "free_user_name", "string", "string",
array("free_user_name", "string", "string",
"email", "url", "ne_string",
array("spectator", "wizard", "archmage",
"contributor")));
if (!empty($invalid)) {
input_error("Some input is invalid: " . comma_sep($invalid));
}
array("spectator", "wizard", "archmage", "contributor")));
// -------------------------------------
user_create($id, $name, $password, $login,
$full_name, $email, $url, $bio);
user_create($name, $pass, $login, $full, $email, $url, $bio);
root_redirect("user.php?name=" . $name);

View File

@ -22,11 +22,7 @@ $id = intval($_POST['id']);
auth_enforce($auth_user_id, $auth_pass,
array("wizard", "archmage"), "destroy users");
$invalid = input_enforce(array($id), array("ID"), array("user_id"));
if (!empty($invalid)) {
input_error("Some input is invalid: " . comma_sep($invalid));
}
input_enforce(array($id), array("ID"), array("user_id"));
// -------------------------------------

View File

@ -10,10 +10,11 @@
$depth = "";
$title = "";
$mark = "index";
include "res/lib/load.php";
// -------------------------------------
display_page("index.twig.html", $depth, $title);
display_page($mark, $depth, $title);
?>

20
new/post/index.php Normal file
View File

@ -0,0 +1,20 @@
<?php
/* This file is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU Affero General Public
License as published by the Free Software Foundation.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. */
$title = "New Post";
$mark = "new_post_index";
$depth = "../../";
include "../../res/lib/load.php";
// --------------------------------------
display_page($mark, $depth, $title);
?>

View File

@ -0,0 +1,38 @@
<?php
/* This file is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU Affero General Public
License as published by the Free Software Foundation.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. */
$depth = "../../../";
include "../../../res/lib/load.php";
$auth_user = scrub($_POST['auth_user']);
$auth_pass = scrub($_POST['auth_pass']);
$auth_id = user_name_to_id($auth_user);
$title = scrub($_POST['title']);
$desc = scrub($_POST['desc']);
$text = scrub($_POST['text']);
// -------------------------------------
auth_enforce($auth_id, $auth_pass,
array("contributor", "wizard", "archmage"), "make posts");
input_enforce(array($title, $desc, $text),
array("Title", "Summary", "Text"),
array("title", "tweet", "ne_string"));
// -------------------------------------
echo $auth_user . $auth_user_id;
post_create($title, $auth_id, $desc, $text);
root_redirect("post.php?name=" . $title);
?>

View File

@ -10,20 +10,31 @@
$depth = "";
$title = "";
$mark = "post";
include "res/lib/load.php";
// -------------------------------------
$id = $_GET['id'];
$text = post_text($id);
$author = post_author($id);
$date = post_data($id);
$id = $_GET['id'] ?? post_name_to_id($_GET['name']);
$name = post_title($id);
$local_exports = array('id' => $id, 'text' => $text, 'author' => $author,
'data' => $data);
// --------------------------------------
$text = markdown(post_text($id));
$date = post_date($id);
$data = post_data($id);
$user_id = post_author($id);
$username = user_name($user_id);
$full_name = user_full_name($user_id);
$local_exports = array('id' => $id, 'text' => $text, 'username' => $username,
'user_id' => $user_id, 'full_name' => $full_name,
'data' => $data, 'title' => $name,
'date' => $date);
// -------------------------------------
display_page("post.twig.html", $depth, $title, $local_exports);
display_page($mark, $depth, $title, $local_exports);
?>

View File

@ -33,9 +33,10 @@ function comma_sep($array, $seperator=", ") {
// STRING STRING [ARRAY] --> ARRAY
// Return exports for Twig-- with the required global & local exports,
// along with any optional local ones.
function make_exports($depth, $title, $local = array()) {
function make_exports($depth, $title, $mark, $local = array()) {
$exports = $GLOBALS['twig_exports'];
$exports['mark'] = $mark;
$exports['depth'] = $depth;
$exports['title'] = $title;

View File

@ -12,12 +12,15 @@
// STRING STRING STRING [ARRAY] --> BOOLEAN
// Render and display a page, based on it's template-path, title, relative
// depth, and an optional array of more Twig variable exports.
function display_page($template, $depth, $title, $local_exports=array()) {
function display_page($mark, $depth, $title, $local_exports=array()) {
echo $GLOBALS['twig']->render("head.twig.html",
make_exports($depth, $title, $local_exports));
echo $GLOBALS['twig']->render($template,
make_exports($depth, $title, $local_exports));
make_exports($depth, $title, $mark,
$local_exports));
echo $GLOBALS['twig']->render($mark . ".twig.html",
make_exports($depth, $title, $mark,
$local_exports));
echo $GLOBALS['twig']->render("foot.twig.html",
make_exports($depth, $title, $local_exports));
make_exports($depth, $title, $mark,
$local_exports));
return true;
}

View File

@ -1,7 +1,7 @@
<?php
/* This file is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU Affero General Public License as published by the Free Software Foundation.
it under the terms of version 3 of the GNU Affero General Public
License as published by the Free Software Foundation.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@ -31,12 +31,20 @@ if (!db_table_existant("lusers")) {
array("id int primary key","username varchar(20)",
"biography longtext","email varchar(50)","website varchar(50)",
"hash char(60)","full_name varchar(50)",
"class varchar(20)")); }
"class varchar(20)"));
user_create("root", "password", "archmage", "Sorĉistino Root",
"jadedctrl@teknik.io",
"https://git.eunichx.us/blagoblag.git",
"Use my account (password is `password`) to create your
own archmage account-- then DELETE ME. I am a security
risk that should be destroyed ASAP.");
}
if (!db_table_existant("posts")) {
db_create_table("posts",
array("id int primary key","title varchar(200)","date datetime",
"user int","text longtext")); }
array("id int primary key","title varchar(50)","date datetime",
"description varchar(250)", "user int","text longtext")); }
if (!db_table_existant("comments")) {
db_create_table("comments",
@ -64,8 +72,26 @@ function db_cmd($query) {
// STRING STRING --> ARRAY
// Return all values of a specific column
function db_get_columns($table, $column) {
$result = db_cmd("select " . $column . " from " . $table);
function db_get_columns($table, $column,
$order = null, $ordered = null, $max = null) {
$command = "select " . $column . " from " . $table;
if (is_string($ordered)) {
$command = $command . " order by " . $ordered . " " . $order;
} else {
$command = $command . " order by " . $column . " " . $order;
}
if (is_int($max)) {
$command = $command . " limit 0," . $max;
}
$command = $command . ";";
// -----------------
$result = db_cmd($command);
$result_nest = function($array) {
return $array[0];
@ -92,6 +118,21 @@ function db_get_cell($table, $identifier, $value, $cell) {
return db_get_rows($table, $identifier, $value)[0][$cell];
}
// !!!
// !!! ['id'] is used instead of $cell !!!
// STRING STRING VARYING STRING --> ARRAY
// Return the value of a specific column in a given row, identified by an
// 'identifier' column set to the given value
function db_get_cells($table, $identifier, $value, $cell) {
$id_pop = function ($row, $cell) {
return $row['id'];
};
$rows = db_get_rows($table, $identifier, $value);
return array_map($id_pop, $rows, $cell);
}
// --------------------------------------
// STRING STRING VARYING STRING VARYING --> NIL
@ -107,14 +148,42 @@ function db_set_cell($table, $identifier, $value, $cell, $new_value) {
// -------------------------------------
// STRING STRING --> VARYING
// Return the 'biggest' value in a column, as dictated by 'desc' ordering
function db_get_biggest($table, $column) {
return db_get_columns($table, $column, "desc")[0];
}
// STRING STRING --> VARYING
// Return the 'smallest' value in a column, as dictated by 'asc' ordering
function db_get_smallest($table, $column) {
return db_get_columns($table, $column, "asc")[0];
}
// -------------------------------------
// STRING STRING --> INTEGER
// When passed a column of numbers, it'll increment the biggest number. Good
// for creating IDs. If there aren't any numbers in the column, it'll choose 1.
function db_new_id($table, $column) {
$biggest = db_get_biggest($table, $column);
if (is_nan($biggest)) {
return 1;
} else {
return $biggest + 1;
}
}
// -------------------------------------
// STRING ARRAY ARRAY --> BOOLEAN
// Create a table with given values to given columns.
// First array is a list of columns (as would be provided to SQL), and the
// second is the list of values (as would follow " values " in SQL)
function db_insert_row($table, $variables, $values) {
$variables = comma_sep($variables);
$values = comma_sep(strings_wrap($values));
$variables = comma_sep($variables, ", ");
$values = comma_sep(strings_wrap($values), ", ");
return db_cmd("insert into " . $table
. " (". $variables .")"

View File

@ -28,11 +28,12 @@ include(root("res/lib/error.php"));
include(root("res/lib/sterilize.php"));
include(root("res/lib/db.php"));
include(root("res/lib/url.php"));
include(root("res/lib/post.php"));
include(root("res/lib/blagoblag.php"));
$loader= new Twig_Loader_Filesystem(root("res/themes/default/html"));
$twig = new Twig_Environment($loader, ['cache' =>
root('cache/')]);
root('cache/'), 'autoescape' => false]);
@ -49,17 +50,17 @@ $push_user_data = function($user_id) {
array_map($push_user_data, $users);
// global $posts; $posts = post_ids();
// global $post; $post = array();
// $post = array_map(post_data, $posts);
global $posts; $posts = post_ids_recent();
global $post; $post = array();
$post = array_map("post_data", $posts);
// -----------------
global $twig_exports;
$twig_exports = array('theme' => $GLOBALS['theme'],
'users' => $GLOBALS['users'],
'user' => $GLOBALS['user']);
//'posts' => $GLOBALS['posts'],
//'post' => $GLOBALS['post']);
'user' => $GLOBALS['user'],
'posts' => $GLOBALS['posts'],
'post' => $GLOBALS['post']);
?>

122
res/lib/post.php Normal file
View File

@ -0,0 +1,122 @@
<?php
/* This file is free software: you can redistribute it and/or modify
it under the terms of version 3 of the GNU Affero General Public
License as published by the Free Software Foundation.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details. */
// -------------------------------------
// NUMBER STRING --> VARYING
// Return the value of a given user's row
function post_get($id, $variable) {
return db_get_cell("posts", "id", $id, $variable);
}
// NUMBER STRING VARYING --> NIL
// Set the value of a given user's cell
function post_set($id, $variable, $new_value) {
return db_set_cell("posts", "id", $id, $variable, $new_value);
}
// -------------------------------------
// NUMBER STRING STRING [STRING STRING STRING STRING STRING] --> BOOLEAN
// Create a user of the given specification.
function post_create($title, $author, $desc, $text) {
$id = db_new_id("posts", "id");
return db_insert_row("posts",
array("id", "user", "description", "date",
"text", "title"),
array($id, $author, $desc,
date("Y-m-d H:i:s"), $text, $title));
}
// NUMBER --> BOOLEAN
// Delete a user by their ID.
function post_delete($id) {
return db_cmd("delete from posts where id = " . $id);
}
// -------------------------------------
function post_name_to_id($name) {
return db_get_cell("posts", "title", string_wrap($name), "id");
}
// NUMBER --> STRING
// Return a post's title from ID
function post_title($id) {
return post_get($id, "title");
}
// NUMBER --> STRING
// Return a post's description from ID
function post_description($id) {
return post_get($id, "description");
}
// NUMBER --> STRING
// Return a post's date from ID
function post_date($id) {
return post_get($id, "date");
}
// NUMBER --> STRING
// Return the author's user ID from post ID
function post_author($id) {
return post_get($id, "user");
}
// NUMBER --> STRING
// Return the post's text from post ID
function post_text($id) {
return post_get($id, "text");
}
// -------------------------------------
// NUMBER --> ARRAY
// Fetch an array of a post's IDs
function post_ids() {
return db_get_columns("posts", "id", "desc", "date");
}
// -------------------------------------
// NUMBER --> ARRAY
// Fetch an array of a post's IDs
function post_ids_recent() {
return db_get_columns("posts", "id", "desc", "date", 25);
}
// -------------------------------------
// NUMBER --> ARRAY
// Return an array filled with all of a user's relevant data.
function post_data($id) {
return array('title' => post_title($id),
'date' => post_date($id),
'author' => post_author($id),
'text' => post_text($id),
'desc' => post_description($id));
}
?>

View File

@ -69,8 +69,11 @@ function input_enforce($values, $names, $types) {
$i++;
}
if (!empty($stack)) {
input_error("Some input is invalid: " . comma_sep($stack));
}
return $stack;
return true;
}
@ -89,6 +92,22 @@ function is_url($string) {
return filter_var($string, FILTER_VALIDATE_URL);
}
// STRING --> BOOLEAN
// Return whether or not a string is a tweet (<250 chars)
function is_tweet($string) {
if (strlen($string) <= 250 && !empty($string)) {
return true;
} else {return false; }
}
// STRING --> BOOLEAN
// Return whether or not a string is a title (<50 chars)
function is_title($string) {
if (strlen($string) <= 50 && !empty($string)) {
return true;
} else {return false; }
}
// VARYING --> BOOLEAN
// Return whether or not a given value is a non-empty string
function is_ne_string($value) {
@ -138,7 +157,74 @@ function is_free_user_id($id) {
}
function bleep_word($word, $replacement) {
$word = str_replace("a", $replacement, $word);
$word = str_replace("e", $replacement, $word);
$word = str_replace("i", $replacement, $word);
$word = str_replace("o", $replacement, $word);
$word = str_replace("u", $replacement, $word);
$word = str_replace("y", $replacement, $word);
return $word;
}
// STRING --> STRING
// you know how people'll write nasty stuff on bathroom stalls?
// this is like taking a sharpie and bleeping all that out
function profanity_sharpie($string) {
$string = str_ireplace(" ass ", bleep_word(" ass ", "&#9829;"),
$string);
$string = str_ireplace(" asses ", bleep_word(" asses ", "&#9829;"),
$string);
$string = str_ireplace("fuck", bleep_word("fuck", "&#9829;"), $string);
$string = str_ireplace("bitch", bleep_word("bitch", "&#9829;"),
$string);
$string = str_ireplace("dick", bleep_word("dick", "&#9829;"), $string);
$string = str_ireplace("cunt", bleep_word("cunt", "&#9829;"), $string);
$string = str_ireplace("shit", bleep_word("shit", "&#9734;"), $string);
$string = str_ireplace("bitch", bleep_word("bitch", "&#9734;"),
$string);
$string = \ConsoleTVs\Profanity\Builder::blocker($string)->filter();
return $string;
}
// -------------------------------------
// STRING --> STRING
// Agressively sanitize a string -- alias for rub_a_dub_dub()
function scrub($string) {
return rub_a_dub_dub($string);
}
// STRING --> STRING
// don't forget your rubber duck <3
function rub_a_dub_dub($string) {
$string = htmlentities($string, ENT_QUOTES, "UTF-8", false);
$string = profanity_sharpie($string);
return $string;
}
// STRING --> STRING
// Agressively sanitize a string -- alias for rub_a_dub_dub()
function unscrub($string) {
return html_entity_decode($string, ENT_QUOTES);
}
// -------------------------------------
function markdown($string) {
$parsedown = new Parsedown();
return $parsedown->text($string);
}
function markdown_inline($string) {
$parsedown = new Parsedown();
return $parsedown->line($string);
}
?>

View File

@ -28,9 +28,13 @@ function user_set($id, $variable, $new_value) {
// NUMBER STRING STRING [STRING STRING STRING STRING STRING] --> BOOLEAN
// Create a user of the given specification.
function user_create($id, $name, $password, $class="Spectator",
function user_create($name, $password, $class="spectator",
$full_name=NULL, $email=NULL, $url=NULL, $bio=NULL) {
$id = db_new_id("lusers", "id");
$password = password_hash($password, PASSWORD_BCRYPT,
array('cost' => 11));
return db_insert_row("lusers",
array("id", "username", "hash", "class",
"full_name", "email", "website", "biography"),
@ -116,7 +120,7 @@ function user_ids() {
// NUMBER --> ARRAY
// Fetch an array of a user's posts (by ID)
function user_posts($id) {
return db_get_cell("posts", "user", $id, "id");
return db_get_cells("posts", "user", $id, array('id'));
}

View File

@ -0,0 +1,213 @@
/*PEN STYLES*/
* {
box-sizing: border-box;
}
.postbox {
height: 500px;
}
body {
background: #f1f1f1;
margin: 2rem;
}
$color_white: #fff;
$color_prime: #5ad67d;
$color_grey: #e2e2e2;
$color_grey_dark: #a2a2a2;
.blog-card {
display: flex;
flex-direction: column;
margin: 1rem auto;
box-shadow: 0 3px 7px -1px rgba(#000, .1);
margin-bottom: 1.6%;
background: $color_white;
line-height: 1.4;
font-family: sans-serif;
border-radius: 5px;
overflow: hidden;
z-index: 0;
a {
color: inherit;
&:hover {
color: $color_prime;
}
}
&:hover {
.photo {
transform: scale(1.3) rotate(3deg);
}
}
.meta {
position: relative;
z-index: 0;
height: 200px;
}
.photo {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-size: cover;
background-position: center;
transition: transform .2s;
}
.details,
.details ul {
margin: auto;
padding: 0;
list-style: none;
}
.details {
position: absolute;
top: 0;
bottom: 0;
left: -100%;
margin: auto;
transition: left .2s;
background: rgba(#000, .6);
color: $color_white;
padding: 10px;
width: 100%;
font-size: .9rem;
a {
text-decoration: dotted underline
}
ul li {
display: inline-block;
}
.author:before {
font-family: FontAwesome;
margin-right: 10px;
content: "\f007";
}
.date:before {
font-family: FontAwesome;
margin-right: 10px;
content: "\f133";
}
.tags {
ul:before {
font-family: FontAwesome;
content: "\f02b";
margin-right: 10px;
}
li {
margin-right: 2px;
&:first-child {
margin-left: -4px;
}
}
}
}
.description {
padding: 1rem;
background: $color_white;
position: relative;
z-index: 1;
h1,
h2 {
font-family: Poppins, sans-serif;
}
h1 {
line-height: 1;
margin: 0;
font-size: 1.7rem;
}
h2 {
font-size: 1rem;
font-weight: 300;
text-transform: uppercase;
color: $color_grey_dark;
margin-top: 5px;
}
.read-more {
text-align: right;
a {
color: $color_prime;
display: inline-block;
position: relative;
&:after {
content: "\f061";
font-family: FontAwesome;
margin-left: -10px;
opacity: 0;
vertical-align: middle;
transition: margin .3s, opacity .3s;
}
&:hover:after {
margin-left: 5px;
opacity: 1;
}
}
}
}
p {
position: relative;
margin: 1rem 0 0;
&:first-of-type {
margin-top: 1.25rem;
&:before {
content: "";
position: absolute;
height: 5px;
background: $color_prime;
width: 35px;
top: -0.75rem;
border-radius: 3px;
}
}
}
&:hover {
.details {
left: 0%;
}
}
@media (min-width: 640px) {
flex-direction: row;
max-width: 700px;
.meta {
flex-basis: 40%;
height: auto;
}
.description {
flex-basis: 60%;
&:before {
transform: skewX(-3deg);
content: "";
background: #fff;
width: 30px;
position: absolute;
left: -10px;
top: 0;
bottom: 0;
z-index: -1;
}
}
&.alt {
flex-direction: row-reverse;
.description {
&:before {
left: inherit;
right: -10px;
transform: skew(3deg)
}
}
.details {
padding-left: 25px;
}
}
}
}

View File

@ -6,13 +6,12 @@
<input name="auth_user" type="text" />
</p>
<p><label>Your Password</label>
<input name="auth_pass" type="text">
<input name="auth_pass" type="password">
</p>
<hr />
<section id="user_details">
<p><label>User ID</label><input name="id" type="number" /></p>
<p><label>Full Name</label><input name="full_name" type="text"/>
</p>
<p><label>Biography</label><input name="bio" type="text" />

View File

@ -1,11 +1,29 @@
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="{{ depth }}res/{{ theme }}/css/global.css">
<link rel="stylesheet" type="text/css" href="{{ depth }}res/{{ theme }}/css/{{ page }}.css">
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css"
href="{{ depth }}res/themes/{{ theme }}/css/global.css">
<link rel="stylesheet" type="text/css"
href="{{ depth }}res/themes/{{ theme }}/css/{{ mark }}.css">
<title>Index</title>
</head>
<body>
<!-- Powered by blagoblag, which is Free Software under the GNU AGPLv3.
Git your sources here: <https://git.eunichx.us/blagoblag.git> -->
<!--
Powered by blagoblag, which is Free Software under the GNU AGPLv3.
Git your sources here: <https://git.eunichx.us/blagoblag.git>
_______________________________________
/ what do you call a cow with no legs? \
| ground beef! |
\_______________________________________/
\ ^__^
\ (oo)\_______
(__)\ )\/\
||____ |
|| w||
|| ||
-->

View File

@ -1 +1,12 @@
<p>{{ animal }}s are SUPER RAD.</p>
{% for post_id in posts %}
{% set post_author = post[post_id]['author'] %}
{% set post_username = user[post_author]['name'] %}
{% set post_full_name = user[post_author]['full_name'] %}
{% set post_title = post[post_id]['title'] %}
{% set post_date = post[post_id]['date'] %}
{% set post_desc = post[post_id]['desc'] %}
{{ include('meta_post_card.html') }}
{% endfor %}

View File

@ -0,0 +1,10 @@
<div class="post_card">
<a href="{{ depth }}post.php?id={{ post_id }}">
<h1>{{ post_title }}</h1>
</a>
<a href="{{ depth }}user.php?name={{ post_username }}">
<h3>{{ post_full_name }}</h3>
</a>
<h3>{{ post_date }}</h3>
<p>{{ post_desc }}</p>
</div>

View File

@ -0,0 +1,28 @@
<section id="creation">
<form id="post_creation" action="private/post_create.php" method="post">
<section class="authentication">
<p><label>Username</label>
<input name="auth_user" type="text" />
</p>
<p><label>Password</label>
<input name="auth_pass" type="password">
</p>
</section>
<hr />
<section class="post_metadata">
<p><label>Title</label><input name="title" type="text" /></p>
<p><label>Desc</label><input name="desc" type="text" /></p>
</section>
<section class="post_data">
<p><label>Text</label><br />
<textarea name="text" rows="20" cols="80"></textarea>
</section>
<p><input type="submit" /></p>
</form>
</section>

View File

@ -1,10 +1,9 @@
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href="res/default/css/global.css">
<link rel="stylesheet" type="text/css" href="res/default/css/post.css">
<title>Index</title>
</head>
<body>
</body>
</html
<h1>{{ title }}</h1>
<h2>By
<a href="{{ depth }}user.php?name={{ username }}">
{{ full_name }}
</a>
</h2>
<h3>{{ date }}</h3>
<p>{{ text }}</p>

View File

@ -1,7 +1,17 @@
<h1>{{ full_name }}</h1>
<h2>{{ username }}</h2>
<h3>{{ email }}</h3>
<h3>{{ url }}</h3>
<h3>{{ website }} &lt;{{ email }}&gt;</h3>
<h3>({{ name }})</h3>
<p>{{ bio }}</p>
<ul>
</ul>
{% for post_id in user_posts %}
{% set post_id = post_id %}
{% set post_username = name %}
{% set post_user_id = id %}
{% set post_full_name = full_name %}
{% set post_title = user_post[post_id]['title'] %}
{% set post_date = user_post[post_id]['date'] %}
{% set post_desc = user_post[post_id]['desc'] %}
{{ include('meta_post_card.html') }}
{% endfor %}

View File

@ -10,6 +10,8 @@
$depth = "";
$mark = "user";
$title = "Death";
include "res/lib/load.php";
// -------------------------------------
@ -26,14 +28,33 @@ if (empty($name)) {
general_error("It looks like that isn't a real user...");
}
// ------------------------------------
// -------------------------------------
$local_exports = array('full_name' => user_full_name($id), 'name' => $name,
'bio' => user_biography($id), 'email' =>
user_email($id), 'website' => user_website($id));
global $user_posts; $user_posts = user_posts($id);
global $user_post; $user_post = array();
// this is used to make associative array for a user's posts, based on
// both post ID and post title
$push_post_data = function($post_id) {
$title = post_title($post_id);
$GLOBALS['user_post'][$post_id] = post_data($post_id);
$GLOBALS['user_post'][$title] = post_data($post_id);
};
array_map($push_post_data, $user_posts);
// -----------------
$local_exports = array('id' => $id, 'full_name' => unscrub(user_full_name($id)),
'name' => $name,
'bio' => unscrub(user_biography($id)),
'email' => user_email($id),
'website' => user_website($id),
'user_posts' => $user_posts,
'user_post' => $user_post);
// -------------------------------------
display_page("user.twig.html", $depth, $title, $local_exports);
display_page($mark, $depth, $title, $local_exports);
?>