package Journal;
use feature "say";
use FindBin;
use File::Spec;
use Tie::Cfg;
use Data::Dumper;
use File::Copy;
use POSIX qw /strftime/;
sub load_configuration
{
FindBin->again;
my $path = File::Spec->catfile($FindBin::RealBin, "../config");
tie my %config, "Tie::Cfg", READ=>$path, SEP=>"=";
\%config;
}
sub get_root
{
File::Spec->catfile($FindBin::RealBin, "..", shift);
}
sub get_greatest_index
{
my $max = 0;
my ($index, $name);
for (@{(shift)})
{
if (/^[^.]/)
{
($index, $name) = get_fields($_);
if (int $index > $max)
{
$max = int $index;
}
}
}
$max;
}
sub get_fields
{
shift =~ /^(0*\d+)(.*)/;
}
sub repad_paths
{
my ($max, $paths, $root) = @_;
my $length = length($max);
my ($index, $name);
for (@{$paths})
{
if (/^[^.]/)
{
($index, $name) = get_fields($_);
if (length($index) != $length)
{
move(File::Spec->catfile($root, $_),
File::Spec->catfile($root,
sprintf("%0${length}d%s", int $index,
$name)));
}
}
}
}
sub get_formatted_time
{
strftime "%A, %B " . get_formatted_day() . ", %Y %H:%M %z", localtime;
}
sub get_formatted_day
{
my $day = strftime "%e", localtime;
$day =~ s/\s+//;
my $suffix;
if (($day >= 4 && $day <=20) || ($day >= 24 && $day <= 30))
{
$suffix = "th";
}
else
{
$suffix = ["st", "nd", "rd"]->[$day % 10 - 1]
}
$day . $suffix;
}
1;
<?php
function print_link_tag($path, $rel, $type=null)
{
$path = resolve_uri_path($path);
$tag = "<link rel=\"$rel\" ";
if ($type)
{
$tag .= "type=\"$type\" ";
}
print_l($tag . "href=\"$path\"/>");
}
function resolve_uri_path($path)
{
$path = str_replace($GLOBALS["system_root"] . "/", "/", $path);
return join_paths($GLOBALS["uri_root"], $path);
}
function join_paths()
{
return implode(DIRECTORY_SEPARATOR, func_get_args());
}
function print_l($string, $break=true)
{
$end = $break ? "\n" : "";
echo $string . $end;
}
function print_script_tag()
{
$path = resolve_uri_path("src/A_O.js");
print_l("<script src=\"$path\" type=\"text/javascript\"></script>");
}
function include_syntax()
{
include choose_file("resource/syntax/index/*.html");
}
function choose_file($pattern)
{
return random_element(glob(resolve_system_path($pattern)));
}
function resolve_system_path($path)
{
return join_paths($GLOBALS["system_root"], $path);
}
function print_follow_buttons()
{
echo "<a href=\"/feed.rss\">";
print_image_tag("img/badges/rss.png", "", "rss", false);
print_l("</a>");
echo "<a href=\"http://twitter.com/Dometoerio/\">";
print_image_tag("img/badges/twitter.png", "", "twitter", false);
print_l("</a>");
}
function print_image_tag($path, $class="", $id="", $break=true, $style="",
$resolve=true, $alt="")
{
if ($resolve)
{
$path = resolve_uri_path($path);
}
print_l("<img src=\"$path\" class=\"$class\" id=\"$id\" style=\"$style\" " .
"alt=\"$alt\" />", $break);
}
function print_scanner_animation()
{
$animation = resolve_uri_path(choose_file("img/scanner/animations/*.gif"));
echo "<div style=\"background: url('$animation')\"> </div>\n";
}
function random_element($list)
{
return $list[rand(0, count($list) - 1)];
}
function build_random_ip_address()
{
return rand(101, 199) . "." . rand(0, 255) . "." . rand(0, 255) . "." .
rand(0, 255);
}
function get_visitors_ip_address()
{
return $_SERVER["REMOTE_ADDR"];
}
function print_structures()
{
$paths = glob(resolve_system_path("img/structures/*.png"));
$visible = rand(0, count($paths) - 1);
foreach ($paths as $ii => $path)
{
$style = ($ii == $visible) ? "" : "display: none";
print_image_tag($path, "", "", true, $style);
}
}
function print_divider()
{
$animation = choose_file("img/scrollers/animations/192.gif");
$path = resolve_uri_path($animation);
echo "<div id=\"divider\" style=\"background: url('$path')\">" .
" </div>\n";
}
function print_articles()
{
$paths = get_article_paths();
$journal_config = parse_ini_file(
resolve_system_path("resource/journal/config"), true, INI_SCANNER_RAW);
$date_field = $journal_config["header"]["date_field"];
foreach ($paths as $path)
{
$printed_body_line = false;
print_l("<div class=\"entry\">");
print_l("<div class=\"info\">");
foreach (file($path) as $line)
{
if (preg_match("/^<!--/", $line))
{
if (preg_match("/^<!--[[:space:]]*$date_field/", $line))
{
print_l("<span class=\"time\">" . get_date($line) .
"</span><span class=\"permalink\"><a href=\"/" .
get_article_id_from_path($path) .
"\">♦</a></span>");
}
}
else
{
if (!$printed_body_line)
{
print_l("</div>");
print_l("<div class=\"body\">");
$printed_body_line = true;
}
echo $line;
}
}
print_l("</div>\n</div>");
}
}
function get_article_paths()
{
preg_match("/^(\/v)*(\/draft)*\/([0-9]+)\/*$/", $_SERVER["REQUEST_URI"],
$matches);
$expression = ".*\.html";
if (count($matches) > 2 and $matches[2])
{
$root = resolve_system_path("resource/journal/draft/");
}
else
{
$root = resolve_system_path("resource/journal/entries/");
}
if (count($matches) > 3 and ($id = $matches[3]))
{
$pattern = "/^0*${id}/";
}
else
{
$pattern = "/$expression/";
}
$paths = array();
$directory = opendir($root);
while (($path = readdir($directory)) !== false)
{
if (preg_match($pattern, $path))
{
$paths[] = $root . $path;
}
}
closedir($directory);
if (!$paths)
{
$paths = glob($root . "*.html");
}
rsort($paths);
return $paths;
}
function get_date($line)
{
preg_match("/^<!--\s*\S+:\s*(.*)\s*-->/", trim($line), $matches);
return date("M. d, Y, g a", strtotime($matches[1]));
}
function get_article_id_from_path($path)
{
preg_match("/\/([0-9]+)_[^\/]*$/", $path, $matches);
return intval($matches[1]);
}
function print_rss_button_images()
{
$paths = glob(resolve_system_path("img/stale-mile/*.png"));
for ($ii = 0; $ii < 6; $ii++)
{
$index = rand(0, count($paths) - 1);
print_image_tag($paths[$index], "", "", false);
array_splice($paths, $index, 1);
if ($ii == 2)
{
print_l("<br />", false);
}
}
}
?>