Remove speedie.site wiki

This commit is contained in:
speedie 2023-06-12 01:55:25 +02:00
parent 50143c7db1
commit 0b7df0c778
43 changed files with 14 additions and 6639 deletions

21
LICENSE
View file

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2013 Steven Frank
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -1,60 +0,0 @@
# W2 wiki
W2 wiki is a web-based, wiki-like notepad that you can host yourself.
## Notable features:
- Elegant text markup:
- Uses [Markdown Syntax](https://github.com/codeling/w2wiki/blob/master/pages/MarkdownSyntax.md).
- It supports double-brackets [[like this]] to link to another page in the wiki by title
- It supports double-braces {{like this}} to link to an uploaded image
- Minimalistic but functional interface:
- Fits to screen nicely when viewed on iPhone, with custom icon for adding to home screen
- HTML5 compliant output
- Title & content search
- Filesystem storage (no database required) in plain Markdown text files.
- Rudimentary git integration to commit & push each page edit
- Localization support (currently en/ja translations available)
- Image uploading support
- Optionally password-protected
- Unlike cloud / hosted solutions, you retain control of your data
- Written in PHP for portability and hackability
- Extremely compact (only a few .php files and a .css file)
## Installation & Configuration
See [Installation instructions](https://github.com/codeling/w2wiki/blob/master/INSTALL.md).
## Security Notice
In its current form, W2 wiki is not security-hardened; it's recommended to only run on an additionally secured server (e.g. in a small, private network for one user only; and secured behind a VPN and/or HTTPS with basic authentication).
## License
W2 is licensed under the [MIT license](https://github.com/codeling/w2wiki/blob/master/LICENSE).
## Acknowledgements
Originally written by [Steven Frank](https://github.com/panicsteve/w2wiki) and others, with modifications by
- [44uk](https://github.com/44uk/w2wiki)
- [knee-cola](https://github.com/knee-cola/w2wiki)
- [namvan](https://github.com/namvan/w2wiki)
- [nickodell](https://github.com/nickodell/w2wiki)
- [pilem](https://github.com/pilem/w2)
W2 wiki uses [PHP Markdown](https://github.com/michelf/php-markdown) by Michel Fortin for rendering Markdown to HTML.
The [Markdown syntax](https://github.com/codeling/w2wiki/blob/master/pages/MarkdownSyntax.md) description is taken from [daringfireball.net](https://daringfireball.net/projects/markdown/syntax).
Maintainer of this fork is [codeling](https://github.com/codeling/w2wiki).
## Reporting Bugs
Please report bugs in [the github issue tracker](https://github.com/codeling/w2wiki/issues) of this fork.

View file

@ -1,216 +0,0 @@
<?php if (!defined('W2APP')){ die('No direct access.'); }
/*
* W2
*
* Copyright (C) 2007-2009 Steven Frank <http://stevenf.com/>
* Code may be re-used as long as the above copyright notice is retained.
* See README.md for full details.
*
* Written with Coda: <http://panic.com/coda/>
*
*/
// --------------------
// Site layout settings
// --------------------
// PAGES_PATH
//
// The path to the raw text documents maintained by W2
// You should not use a trailing slash.
define('PAGES_PATH', dirname(__FILE__). '/pages');
// UPLOAD_FOLDER
//
// The subfolder in PAGES_PATH that uploads get stored to
define('UPLOAD_FOLDER', 'images');
// PAGES_EXT
//
// The extension of the Markdown files in the PAGES_PATH
// folder which are displayed by W2
define('PAGES_EXT', 'md');
// BASE_URI
//
// The base URI for this W2 installation. You only need to change this if we guess wrong.
// You should not use a trailing slash.
define('BASE_URI', str_replace('/index.php', '', $_SERVER['SCRIPT_NAME']));
// SELF
//
// The path component of the URL to the main script, such as: /w2/index.php
define('SELF', $_SERVER['SCRIPT_NAME']);
// VIEW
//
// Needed only if your web server spawns PHP as a CGI instead of an internal module.
// For example: define('VIEW', '?action=view&page=');
define('VIEW', '');
// DEFAULT_PAGE
//
// The name of the page to show as the "Home" page.
// Value is a string, the title of a page (case-sensitive!)
define('DEFAULT_PAGE', 'Home');
// CSS_FILE
//
// The CSS file to load to style the wiki, relative to BASE_URI
define('CSS_FILE', 'index.css');
// SIDEBAR_FILE
//
// The name of the page to be shown as sidebar (leave empty to disable sidebar feature)
define ('SIDEBAR_PAGE', '_sidebar');
// PAGE_TITLE
//
// A title prepended to the title head tag of all pages of the wiki
define ('PAGE_TITLE', 'Wiki: ');
// --------------------
// File upload settings
// --------------------
// DISABLE_UPLOADS
//
// Globally enable/disable file uploads
define('DISABLE_UPLOADS', false);
// VALID_UPLOAD_TYPES
//
// Acceptable file types for file uploads. This is a good idea for security.
// Value is a comma-separated string of MIME types.
define('VALID_UPLOAD_TYPES', 'image/jpeg,image/pjpeg,image/png,image/gif,application/pdf');
// VALID_UPLOAD_EXTS
//
// Acceptable filename extensions for file uploads
// Value is a comma-separated string of filename extensions (case-sensitive!)
define('VALID_UPLOAD_EXTS', 'jpg,jpeg,png,gif,pdf');
// ------------------
// Interface settings
// ------------------
// TITLE_DATE
//
// The format to use when displaying page modification times.
// See the manual for the PHP 'date()' function for the specification:
// http://php.net/manual/en/function.date.php
// Note that these settings are overridden by the
// date_format/date_format_no_time in the used locale!
define('TITLE_DATE', 'j-M-Y g:i A');
define('TITLE_DATE_NO_TIME', 'j-M-Y');
// EDIT_ROWS
//
// Default size of the text editing area in text rows.
define('EDIT_ROWS', 18);
// AUTOLINK_PAGE_TITLES
//
// Automatically converts any page titles appearing in text into links
// to the named page. This might degrade performance if you have many
// thousands of pages.
define('AUTOLINK_PAGE_TITLES', false);
// -----------------------------
// Security and session settings
// -----------------------------
// REQUIRE_PASSWORD
//
// Is a password required to access this wiki?
define('REQUIRE_PASSWORD', false);
// W2_PASSWORD
//
// The password for the wiki, if REQUIRE_PASSWORD is true
// Replace 'secret' with your password to set your password.
define('W2_PASSWORD', 'secret');
// W2_PASSWORD_HASH
//
// Alternate (more secure) password storage.
// To use a hashed password, Comment out the W2_PASSWORD definition above and uncomment
// this one, using the result of sha1('your_password') as the value.
//
// In Mac OS X, you can do this from the Terminal:
// echo -n 'your_password' | openssl sha1
//
// define('W2_PASSWORD_HASH', 'e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4');
define('W2_PASSWORD_HASH', '');
// allowedIPs
//
// A whitelist of IP addresses that are allowed access to the wiki.
// If empty, all IPs are allowed.
$allowedIPs = array();
// W2_SESSION_LIFETIME
//
// How long before a login session expires? Default is 30 days
define('W2_SESSION_LIFETIME', 60 * 60 * 24 * 30);
// W2_SESSION_NAME
//
// Name for session (used in the cookie)
define('W2_SESSION_NAME', 'W2');
// -----------------------------
// Git Integration
// -----------------------------
// GIT_COMMIT_ENABLED
//
// Enable/Disable committing changes in page folder to local git repository
define('GIT_COMMIT_ENABLED', false);
// GIT_PUSH_ENABLED
//
// Enable/Disable pushing changes in page folder to a remote git repository
define('GIT_PUSH_ENABLED', false);
// -----------------------------
// Locale and encoding settings
// -----------------------------
// W2_CHARSET
//
// Value for meta charset.
define('W2_CHARSET', 'UTF-8');
// W2_LOCALE
//
// Name for locale.
define('W2_LOCALE', 'en');

View file

@ -1,12 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#232629;
}
.ColorScheme-NegativeText {
color:#da4453;
}</style>
</defs>
<path class="ColorScheme-Text" d="m2 2v12h12v-12h-12m1 2h10v9h-10v-9" fill="#0f0f0f"/>
<path class="ColorScheme-NegativeText" d="m6.2 6l-.707.707 1.793 1.793-1.793 1.793.707.707 1.793-1.793 1.793 1.793.707-.707-1.793-1.793 1.793-1.793-.707-.707-1.793 1.793" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 556 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-NegativeText {
color:#da4453;
}</style>
</defs>
<path class="ColorScheme-NegativeText" d="m5 2v2h1v-1h4v1h1v-2h-5zm-3 3v1h2v8h8v-8h2v-1zm3 1h6v7h-6z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 342 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-NegativeText {
color:#da4453;
}</style>
</defs>
<path class="ColorScheme-NegativeText" d="m5 2v2h1v-1h4v1h1v-2h-5zm-3 3v1h2v8h8v-8h2v-1zm3 1h6v7h-6z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 342 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m10.4 2-8.398 8.398v3.602h3.602l8.398-8.398-3.602-3.602zm-2.049 3.49 2.16 2.16-3.174 3.176v-0.6758l-1.014 0.02148h-1.035v-1.035-0.5859l1.441-1.439 1.621-1.621zm-4.076 4.074v1.621h1.035 0.9922l0.02148 0.6523-1.08 1.082h-1.441l-0.7207-0.7207v-1.441l1.193-1.193z" fill="#0f0f0f"/>
</svg>

Before

Width:  |  Height:  |  Size: 522 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m10.4 2-8.398 8.398v3.602h3.602l8.398-8.398-3.602-3.602zm-2.049 3.49 2.16 2.16-3.174 3.176v-0.6758l-1.014 0.02148h-1.035v-1.035-0.5859l1.441-1.439 1.621-1.621zm-4.076 4.074v1.621h1.035 0.9922l0.02148 0.6523-1.08 1.082h-1.441l-0.7207-0.7207v-1.441l1.193-1.193z" fill="#f0f0f0"/>
</svg>

Before

Width:  |  Height:  |  Size: 522 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m2.375 2c-0.1285 0-0.2515 0.01355-0.375 0.03125v0.9688c0.5523 0 1 0.4477 1 1v8c0 0.5523-0.4477 1-1 1v0.9688c0.1235 0.018 0.2465 0.03125 0.375 0.03125h7.875c2.078 0 3.75-1.672 3.75-3.75 0-1.654-1.082-3.03-2.562-3.531 0.6331-0.4784 1.062-1.236 1.062-2.094 0-1.454-1.171-2.625-2.625-2.625h-7.5zm3.625 1h3c0.5523 0 1 0.8954 1 2s-0.4477 2-1 2h-3v-4zm0 5h3c0.05347 0 0.1038 0.0261 0.1562 0.03125 1.03 0.1012 1.844 1.155 1.844 2.469 0 1.381-0.8954 2.5-2 2.5h-3v-5z" fill="#f0f0f0"/>
</svg>

Before

Width:  |  Height:  |  Size: 720 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m9.09 2-3.146 11.74 0.9668 0.2598 3.146-11.74-0.9668-0.2598zm-3.805 2-2.961 3.145-0.3242 0.3477 0.3242 0.3457 2.943 3.162 0.7148-0.6953-2.621-2.812 2.639-2.797-0.7148-0.6953zm5.43 0-0.7148 0.6953 2.639 2.797-2.621 2.812 0.7148 0.6953 2.943-3.162 0.3242-0.3457-0.3242-0.3477-2.961-3.145z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 554 B

View file

@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#eff0f1;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 5 2 L 5 3 L 6 3 L 9 3 L 4.71875 13 L 2 13 L 2 14 L 4.28125 14 L 6.28125 14 L 10 14 L 11 14 L 11 13 L 10 13 L 7 13 L 11.28125 3 L 14 3 L 14 2 L 11.71875 2 L 9.71875 2 L 6 2 L 5 2 z "
class="ColorScheme-Text"
/>
</svg>

Before

Width:  |  Height:  |  Size: 533 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m8 2-0.707 0.6992 0.003906 0.003906-5.297 5.295v0.001953 1h1.008v4h-0.007812v1h10v-1-4h1v-1-0.001953l-1.143-1.143-0.7012 0.7012 0.4434 0.4434h-0.5996v5h-3v-3h-2v3h-3v-4-1h-0.5996l4.598-4.596 0.001953 0.001953 0.001953-0.001953 1.441 1.439 0.7012-0.7012-1.441-1.439 0.003906-0.003906-0.707-0.6992zm3 1v3h1.008v-3h-1.008z" fill="#f0f0f0"/>
</svg>

Before

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 886 B

View file

@ -1,10 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<g transform="translate(-3 -1033)">
<path class="ColorScheme-Text" transform="translate(0 1030)" d="m4 7c-0.554 0-1 0.446-1 1v6c0 0.554 0.446 1 1 1h5c0.554 0 1-0.446 1-1v-1h2v1c0 0.554 0.446 1 1 1h5c0.554 0 1-0.446 1-1v-6c0-0.554-0.446-1-1-1h-5c-0.554 0-1 0.446-1 1v1h-2v-1c0-0.554-0.446-1-1-1zm0 1h5v1c-0.554 0-1 0.446-1 1v2c0 0.554 0.446 1 1 1v1h-5zm9 0h5v6h-5v-1c0.554 0 1-0.446 1-1v-2c0-0.554-0.446-1-1-1zm-4 2h4v2h-4z" fill="#0f0f0f"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 659 B

View file

@ -1,10 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<g transform="translate(-3 -1033)">
<path class="ColorScheme-Text" transform="translate(0 1030)" d="m4 7c-0.554 0-1 0.446-1 1v6c0 0.554 0.446 1 1 1h5c0.554 0 1-0.446 1-1v-1h2v1c0 0.554 0.446 1 1 1h5c0.554 0 1-0.446 1-1v-6c0-0.554-0.446-1-1-1h-5c-0.554 0-1 0.446-1 1v1h-2v-1c0-0.554-0.446-1-1-1zm0 1h3 2v1c-0.554 0-1 0.446-1 1v2c0 0.554 0.446 1 1 1v1h-2-3zm9 0h3 2v6h-2-3v-1c0.554 0 1-0.446 1-1v-2c0-0.554-0.446-1-1-1zm-4 2h4v2h-4z" fill="#f0f0f0"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 667 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m2 2v12h12v-12zm1 1h10v10h-10zm1 1v1h8v-1zm0 3v1h8v-1zm0 3v1h8v-1z" fill="#f0f0f0"/>
</svg>

Before

Width:  |  Height:  |  Size: 329 B

View file

@ -1,13 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#eff0f1;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 3 2 L 3 14 L 8 14 L 8 13 L 4 13 L 4 3 L 9 3 L 9 6 L 12 6 L 12 9 L 13 9 L 13 6 L 13 5 L 10 2 L 9 2 L 3 2 z M 10 9 L 10 11 L 8 11 L 8 12 L 10 12 L 10 14 L 11 14 L 11 12 L 13 12 L 13 11 L 11 11 L 11 9 L 10 9 z "
class="ColorScheme-Text"
/>
</svg>

Before

Width:  |  Height:  |  Size: 559 B

View file

@ -1,17 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<g fill="none" stroke="#0f0f0f">
<path d="m4.5 5v6" stroke-width="1px"/>
<g stroke-width="1px">
<path d="m3 4.5h3"/>
<path d="m3 11.5h3"/>
<path d="m8 11.5h2"/>
<path d="m11 11.5h2"/>
</g>
<rect x="1.5" y="2.5" width="13" height="11" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 519 B

View file

@ -1,17 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<g fill="none" stroke="#f0f0f0">
<path d="m4.5 5v6" stroke-width="1px"/>
<g stroke-width="1px">
<path d="m3 4.5h3"/>
<path d="m3 11.5h3"/>
<path d="m8 11.5h2"/>
<path d="m11 11.5h2"/>
</g>
<rect x="1.5" y="2.5" width="13" height="11" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 519 B

View file

@ -1,8 +0,0 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#eff0f1;
}</style>
</defs>
<path class="ColorScheme-Text" d="m2 2v11.28 0.7188h12v-1-1-1-1-3h-1v2l-2-2-3.344 3.344-1.344-1.344h-0.03125l-3.281 3.281v-9.281h6v-1h-7zm9 5h1v-3.086l2 2v-1.414l-2.5-2.5-2.5 2.5v1.414l2-2v3.086zm-5-3c-1.105 0-2 0.8954-2 2s0.8954 2 2 2 2-0.8954 2-2-0.8954-2-2-2z" fill="#f0f0f0"/>
</svg>

Before

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

4
images/.gitignore vendored
View file

@ -1,4 +0,0 @@
# Ignore everything
*
# except this file
!.gitignore

410
index.css
View file

@ -1,410 +0,0 @@
/*
* W2
*
* Copyright (C) 2007-2011 Steven Frank <http://stevenf.com/>
*
* Code may be re-used as long as the above copyright notice is retained.
* See README.txt for full details.
*
* Written with Coda: <http://panic.com/coda/>
*
* colors icons:
* 240,240,240
* dark: 15, 15, 15
*/
* {
font-family: Monospace;
font-size: 11px;
margin: 0;
padding: 0;
}
body {
background-color: #363636;
}
blockquote {
background-color: #0f070f;
margin: 4px 4px 12px 20px;
padding: 4px 10px 4px 10px;
}
form {
display: inline;
}
li {
line-height: 1.5em;
}
h1 {
font-size: 2em;
font-weight: bold;
margin-bottom: 4px;
/*margin-top: .6em;*/
}
h2 {
font-size: 1.2em;
font-weight: bold;
margin-bottom: 4px;
margin-top: .5em;
}
h3 {
font-size: 1.2em;
font-weight: bold;
}
h3, h4, h5, h6 {
margin-top: .4em;
margin-bottom: 4px;
}
hr {
border-top: 1px solid #363636;
border-bottom: 0;
border-left: 0;
border-right: 0;
margin-top: 12px;
margin-bottom: 12px;
}
ul,
ol {
margin-top: .5em;
margin-left: 1em;
padding-left: 1em;
list-style-position: outside;
}
ul li, ol li {
padding-left: .5em;
}
li > ul, li > ol
{
margin-top: 0;
}
p {
margin-top: 1.5em;
margin-bottom: 1.5em;
}
pre {
font-family: Monospace;
margin-left: 0;
margin-bottom: .5em;
margin-top: .5em;
/* stroke each browser so that they wrap lines in the pre tag */
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
background: #212121;
border: 1px dotted gray;
padding: .2em .2em .2em .4em;
}
code {
font-family: Monospace;
background: #212121;
color: #bbbbbb;
padding: .1em .1em .1em .2em;
}
table {
border-collapse: collapse;
padding: .2em;
max-width: 99%;
background-color: #212121;
color: #dddddd;
}
th {
text-align: left;
}
td, th {
padding: .1em 1em .1em .1em;
word-break: break-all;
background: #212121;
}
thead {
border-bottom: 1px solid black;
font-weight: bold;
}
thead td a {
text-decoration:none;
}
thead td span.sortBy:after {
content: "\25BC";
}
tr:nth-child(even) {
background: #e4e4e4;
}
tr:nth-child(odd) {
background: #eeeeee;
}
.pageActions {
padding-left: 8px;
padding-right: 8px;
}
textarea {
font-family: Monospace;
width: 75%;
background-color: #212121;
color: #f0eee4;
}
@media (max-width: 600px), (orientation: portrait) {
textarea {
width: 99%;
}
}
input[type="text"],
textarea {
padding: 2px;
}
input {
font-family: Monospace;
}
input#gitmsg
{
width: 60%;
}
.main {
padding: .3em .3em .3em 1em;
background-color: #212121;
color: #f0eee4;
}
.main a {
color: #89bfff;
text-decoration: none;
transition: 0.1s;
}
.main a:hover {
color: #ccccff;
text-decoration: underline;
}
/* the globe */
.main a[href^="http"]::after {
/*content: url('/icons/internet.png');*/
}
.main a.literalMatch {
font-weight: bold;
color: #6666ff;
}
.main a.noexist {
color: #f34000 !important;
}
.login {
margin: 40px auto;
max-width: 650px;
line-height: 1.4;
}
.note {
background-color: #212121;
padding: 4px;
margin: .5em 0 .5em 0;
color: #6666ff;
border: solid 1px #6666ff;
width: 75%;
}
@media (max-width: 600px), (orientation: portrait) {
.note {
width: 99%;
}
}
.titlebar {
background-color: #262626;
color: #89bfff;
padding: 2px;
}
.titlebar span.title {
font-size: 10px;
font-weight: bold;
margin: 5px;
}
.titledate {
font-size: 0.90em;
color: #777777;
margin-left: 1em;
margin-right: 1em;
}
.toolbar {
background-color: #363636;
position: sticky;
top: 0;
font-size: 2px;
}
.toolbar > a, .titlebar > a {
font-size: 0.90em;
margin-right: 1em;
color: #eeeeee;
text-decoration: none;
font-weight: normal;
}
.toolbar > a:hover, .titlebar > a:hover {
text-decoration: underline;
}
.sidebar {
float: right;
}
.sidebar, .linkshere {
margin-right: 5px;
margin-top: 5px;
padding: 4px;
border: solid 1px #666644;
}
.sidebar ul {
margin-top: 0;
margin-left: 4px;
}
.linkshere {
width: 50%;
margin-left: 5px;
}
@media (max-width: 600px), (orientation: portrait) {
.sidebar, .linkshere {
margin-left: 5px;
float: none;
width: auto;
}
}
input.search {
/* font-size: 0.95em;*/
color: #212121;
width: 5em;
padding: .1em;
}
input.search:focus {
width: 15em;
}
input.pagename {
width: 20em;
}
/* buttons (non-colors) */
input[type="button"],
input[type="submit"] {
border:none;
border-radius: 3px;
padding: .5em 1em;
cursor: pointer;
margin-right: .5em;
}
#maxsizelabel {
margin-right: 1em;
}
/* buttons (such as for the edit page) */
input[type="submit"] {
background-color: #f0eee4;
color: black;
}
input[type="button"] {
background-color: #363636;
color: white;
}
input[type="submit"]:hover {
background-color: #f0eee4;
color: black;
}
input[type="button"]:hover {
background-color: #363636;
color: white;
}
img {
max-width: 50%;
height: auto;
}
#drawer {
display: inline-block;
position: absolute;
width: 300px;
background-color: rgb(240, 240, 240);
opacity: 0.5;
border: 1px solid black;
border-radius: 5px;
padding: 0;
cursor: move;
}
#drawer h5 {
border-bottom: 1px solid black;
padding: 4px;
}
#drawer div {
padding: 4px;
}
#drawer:hover {
opacity: 1.0;
}
.inactive {
display: none !important;
}
img.icon {
width: 1.5em;
vertical-align: middle;
}
a > img.icon:hover, a > span.icongroup:hover {
outline: 1px outset white;
}
a > img.icon:active, a > span.icongroup:active {
outline: 1px inset white;
}
.rightaligned
{
float: right;
}
input.search {
border-color: #363636;
border-width: 0px;
background-color: #363636;
color: #f0eee4;
width: 165px
}
.sidebar {
color: #aaaaaa;
border-color: #aaaaaa;
background-color: #262626;
}
.sidebar a {
color: #19bfff;
text-decoration: none;
transition: 0.1s;
}
.sidebar a:hover {
color: #bbbbff;
text-decoration: underline;
}

View file

@ -1,362 +0,0 @@
/*
* W2
*
* Copyright (C) 2007-2011 Steven Frank <http://stevenf.com/>
*
* Code may be re-used as long as the above copyright notice is retained.
* See README.txt for full details.
*
* Written with Coda: <http://panic.com/coda/>
*
* colors icons:
* 240,240,240
* dark: 15, 15, 15
*/
* {
font-family: Monospace;
margin: 0;
padding: 0;
font-size: 11px;
}
body {
background-color: #eeeeee;
}
blockquote {
background-color: #0f070f;
margin: 4px 4px 12px 20px;
padding: 4px 10px 4px 10px;
}
form {
display: inline;
}
li {
line-height: 1.5em;
}
h1 {
font-size: 2em;
font-weight: bold;
margin-bottom: 4px;
margin-top: .6em;
}
h2 {
font-size: 1.6em;
font-weight: bold;
margin-bottom: 4px;
margin-top: .5em;
}
h3 {
font-size: 1.2em;
font-weight: bold;
}
h3, h4, h5, h6 {
margin-top: .4em;
margin-bottom: 4px;
}
hr {
border-top: 1px solid #222222;
border-bottom: 0;
border-left: 0;
border-right: 0;
margin-top: 12px;
margin-bottom: 12px;
}
ul,
ol {
margin-top: .5em;
margin-left: 1em;
padding-left: 1em;
list-style-position: outside;
}
ul li, ol li {
padding-left: .5em;
}
li > ul, li > ol
{
margin-top: 0;
}
p {
margin-top: .5em;
}
pre {
font-family: Monospace;
margin-left: 0;
margin-bottom: .5em;
margin-top: .5em;
/* stroke each browser so that they wrap lines in the pre tag */
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
background: #ffc;
border: 1px dotted gray;
padding: .2em .2em .2em .4em;
}
code {
font-family: Monospace;
background: #ffc;
padding: .1em .1em 0 .2em;
}
table {
border-collapse: collapse;
padding: .2em;
max-width: 99%;
background-color: #000000;
color: #ffffff;
}
th {
text-align: left;
}
td, th {
padding: .1em 1em .1em .1em;
word-break: break-all;
}
thead {
border-bottom: 1px solid black;
font-weight: bold;
}
thead td a {
text-decoration:none;
}
thead td span.sortBy:after {
content: "\25BC";
}
tr:nth-child(even) {
background: #e4e4e4;
}
tr:nth-child(odd) {
background: #eeeeee;
}
.pageActions {
padding-left: 8px;
padding-right: 8px;
}
textarea {
font-family: Monospace;
width: 75%;
background-color: #000011;
color: #ffffff;
}
@media (max-width: 600px), (orientation: portrait) {
textarea {
width: 99%;
}
}
input[type="text"],
textarea {
padding: 2px;
}
input#gitmsg
{
width: 60%;
}
.main {
padding: .3em .3em .3em 1em;
background-color: #000000;
color: #ffffff;
}
.main a[href^="http"]::after {
content: url('/icons/internet.png');
}
.main a.literalMatch {
font-weight: bold;
color: #00f;
}
.main a.noexist {
color: #b00 !important;
}
.login {
margin: 40px auto;
max-width: 650px;
line-height: 1.4;
}
.note {
background-color: #000011;
padding: 4px;
margin: .5em 0 .5em 0;
color: #9999bb;
border: solid 1px #9999bb;
width: 75%;
}
@media (max-width: 600px), (orientation: portrait) {
.note {
width: 99%;
}
}
.titlebar {
background-color: #111111;
color: #ffffff;
}
.titlebar span.title {
font-size: 10px;
font-weight: bold;
}
.titledate {
font-size: 0.90em;
color: #777777;
margin-left: 1em;
margin-right: 1em;
}
.toolbar {
background-color: #222222;
position: sticky;
top: 0;
font-size: 8px;
}
.toolbar > a, .titlebar > a {
font-size: 0.90em;
margin-right: 1em;
color: #eeeeee;
text-decoration: none;
font-weight: normal;
}
.toolbar > a:hover, .titlebar > a:hover {
text-decoration: underline;
}
.sidebar {
float: right;
}
.sidebar, .linkshere {
margin-right: 5px;
margin-top: 5px;
padding: 4px;
border: solid 1px #666644;
}
.sidebar ul {
margin-top: 0;
margin-left: 4px;
}
.linkshere {
width: 50%;
margin-left: 5px;
}
@media (max-width: 600px), (orientation: portrait) {
.sidebar, .linkshere {
margin-left: 5px;
float: none;
width: auto;
}
}
input.search {
/* font-size: 0.95em;*/
color: #000000;
width: 5em;
padding: .1em;
}
input.search:focus {
width: 15em;
}
input.pagename {
width: 20em;
}
input[type="button"],
input[type="submit"] {
border:none;
border-radius: 3px;
padding: .5em 1em;
cursor: pointer;
margin-right: .5em;
}
#maxsizelabel {
margin-right: 1em;
}
input[type="submit"] {
background-color: rgb(30, 101, 201);
color: white;
}
input[type="button"] {
background-color: rgb(220, 220, 220);
}
input[type="submit"]:hover {
background-color: rgb(69, 135, 226);
}
input[type="button"]:hover {
background-color: rgb(200, 200, 200);
}
img {
max-width: 100%;
height: auto;
}
#drawer {
display: inline-block;
position: absolute;
width: 300px;
background-color: rgb(240, 240, 240);
opacity: 0.5;
border: 1px solid black;
border-radius: 5px;
padding: 0;
cursor: move;
}
#drawer h5 {
border-bottom: 1px solid black;
padding: 4px;
}
#drawer div {
padding: 4px;
}
#drawer:hover {
opacity: 1.0;
}
.inactive {
display: none !important;
}
img.icon {
width: 1.5em;
vertical-align: middle;
}
a > img.icon:hover, a > span.icongroup:hover {
outline: 1px outset white;
}
a > img.icon:active, a > span.icongroup:active {
outline: 1px inset white;
}
a.missing-link {
color: #ba0000;
}
.rightaligned
{
float: right;
}

14
index.html Normal file
View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Wiki</title>
<meta charset="UTF-8">
<meta name="description" content="speedie.site wiki">
<meta name="author" content="speedie">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<meta http-equiv="refresh" content="0;https://speedie.site" />
</body>
</html>

944
index.php
View file

@ -1,944 +0,0 @@
<?php
define('W2APP', true);
/*
* W2
*
* Copyright (C) 2007-2011 Steven Frank <http://stevenf.com/>
*
* Code may be re-used as long as the above copyright notice is retained.
* See README.txt for full details.
*
* Written with Coda: <http://panic.com/coda/>
*
*/
// Install PSR-4-compatible class autoloader
spl_autoload_register(function($class){
require str_replace('\\', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
});
// Get Markdown class
use md\MarkdownExtra;
// User configurable options:
require_once "config.php";
// Load configured localization:
require_once 'locales/' . W2_LOCALE . '.php';
/**
* Get translated word
*
* String $label Key for locale word
* String $alt_word Alternative word
* return String
*/
function __( $label, $alt_word = null )
{
global $w2_word_set;
if( empty($w2_word_set[$label]) )
{
return is_null($alt_word) ? $label : $alt_word;
}
return htmlspecialchars($w2_word_set[$label], ENT_QUOTES);
}
if ( REQUIRE_PASSWORD )
{
ini_set('session.gc_maxlifetime', W2_SESSION_LIFETIME);
session_set_cookie_params(W2_SESSION_LIFETIME);
}
session_name(W2_SESSION_NAME);
session_start();
if ( count($allowedIPs) > 0 )
{
$ip = $_SERVER['REMOTE_ADDR'];
$accepted = false;
foreach ( $allowedIPs as $allowed )
{
if ( strncmp($allowed, $ip, strlen($allowed)) == 0 )
{
$accepted = true;
break;
}
}
if ( !$accepted )
{
print "<html><body>Access from IP address $ip is not allowed</body></html>";
exit;
}
}
function printHeader($title, $action, $bodyclass="")
{
print "<!doctype html>\n";
print "<html lang=\"" . W2_LOCALE . "\">\n";
print " <head>\n";
print " <meta charset=\"" . W2_CHARSET . "\">\n";
print " <link rel=\"icon\" href=\"/icons/w2-icon.png\"/>\n";
print " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n";
print " <link type=\"text/css\" rel=\"stylesheet\" href=\"" . BASE_URI . "/" . CSS_FILE ."\" />\n";
print " <title>".PAGE_TITLE."$title</title>\n";
print " </head>\n";
print " <body".($bodyclass != "" ? " class=\"$bodyclass\"":"").">\n";
}
function printFooter()
{
print " </body>\n";
print "</html>";
}
function printDrawer()
{
print " <div id=\"drawer\" class=\"inactive\">\n".
" <a href=\"\" onclick=\"toggleDrawer(); return false;\"><img src=\"/icons/close.svg\" alt=\"".__('Close')."\" title=\"".__('Close')."\" class=\"icon rightaligned\"/></a>\n".
" <h5>".__('Markdown Syntax Helper')."</h5>\n".
" <div>\n".
"# ".__('Header')." 1<br/>".
"## ".__('Header')." 2<br/>".
"### ".__('Header')." 3<br/>".
"#### ".__('Header')." 4<br/>".
"##### ".__('Header')." 5<br/>".
"###### ".__('Header')." 6<br/>".
"<br/>".
"*".__('Emphasize')."* - <em>".__('Emphasize')."</em><br/>".
"_".__('Emphasize')."* - <em>".__('Emphasize')."</em><br/>".
"**".__('Bold')."** - <strong>".__('Bold')."</strong><br/>".
"__".__('Bold')."__ - <strong>".__('Bold')."</strong><br/>".
"<br/>".
"[[Link to page]]<br/>".
"&lt;http://example.com/&gt;<br/>".
"[link text](http://url)<br/><br/>".
"{{image.jpg}}<br/>".
"![Alt text](/images/image.jpg)<br/>".
"![Alt text](/images/image.jpg \"Optional title\")<br/>".
"<br/>".
"- Unordered list<br/>".
"+ Unordered list<br/>".
"* Unordered list<br/>".
"1. Ordered list<br/>".
"<br/>".
"> Blockquote<br/>".// <blockquote>Blockquotes</blockquote>\n".
"```Code```<br/>". //<pre>Code</pre>\n\n".
"`inline-code`<br/><br/>".
"*** Horizontal rule<br/>".
"--- Horizontal rule<br/>\n".
" </div>\n".
" </div>\n".
" <a id=\"drawer-control\" href=\"\" onclick=\"toggleDrawer(); return false;\">\n".
" <span class=\"icongroup\">\n".
" <img src=\"/icons/format-text-bold.svg\" alt=\"".__('Formatting help')."\" title=\"".__('Formatting help')."\" class=\"icon\"/>\n".
" <img src=\"/icons/format-text-italic.svg\" alt=\"".__('Formatting help')."\" title=\"".__('Formatting help')."\" class=\"icon\"/>\n".
" <img src=\"/icons/format-text-code.svg\" alt=\"".__('Formatting help')."\" title=\"".__('Formatting help')."\" class=\"icon\"/>\n".
" </span>\n".
" </a>\n";
}
if ( REQUIRE_PASSWORD && !isset($_SESSION['password']) )
{
if ( !defined('W2_PASSWORD_HASH') || W2_PASSWORD_HASH == '' )
define('W2_PASSWORD_HASH', sha1(W2_PASSWORD));
if ( (isset($_POST['p'])) && (sha1($_POST['p']) == W2_PASSWORD_HASH) )
$_SESSION['password'] = W2_PASSWORD_HASH;
else
{
printHeader( __('Log In'), '', "login");
print " <h1>" . __('Log In') . "</h1>\n";
print " <form method=\"post\">\n";
print " ".__('Password') . ": <input type=\"password\" name=\"p\">\n";
print " <input type=\"submit\" value=\"" . __('Log In') . "\">\n";
print " </form>\n";
printFooter();
exit;
}
}
// Support functions
function descLengthSort($val_1, $val_2)
{
$firstVal = strlen($val_1);
$secondVal = strlen($val_2);
return ( $firstVal > $secondVal ) ?
-1 : ( ( $firstVal < $secondVal ) ? 1 : 0);
}
function getAllPageNames($path = "")
{
$filenames = array();
$dir = opendir(PAGES_PATH . "/$path" );
while ( $filename = readdir($dir) )
{
if ( $filename[0] == "." )
{
continue;
}
if ( is_dir( PAGES_PATH . "/$path/$filename" ) )
{
array_push($filenames, ...getAllPageNames( "$path/$filename" ) );
continue;
}
if ( preg_match("/".PAGES_EXT."$/", $filename) != 1)
{
continue;
}
$filename = substr($filename, 0, -(strlen(PAGES_EXT)+1) );
$filenames[] = substr("$path/$filename", 1);
}
closedir($dir);
return $filenames;
}
function fileNameForPage($page)
{
return PAGES_PATH . "/$page." . PAGES_EXT;
}
function imageLinkText($imgName)
{
return "![".__("Image Description")."](/".UPLOAD_FOLDER."/$imgName)";
}
function sanitizeFilename($inFileName)
{
return str_replace(array('~', '..', '\\', ':', '|', '&'), '-', $inFileName);
}
function pageURL($page)
{
return SELF . VIEW . "/".str_replace("%2F", "/", str_replace("%23", "#", urlencode(sanitizeFilename($page))));
}
function pageLink($page, $title, $attributes="")
{
return "<a href=\"" . pageURL($page) ."\"$attributes>$title</a>";
/* wip
$link_page = $match[1];
$link_filename = PAGES_PATH . "/$link_page.txt";
$link_page_exists = file_exists($link_filename);
if ($link_page_exists)
return "<a href=\"" . pageURL($page) ."\"$attributes>$title</a>";
else
//return "<a href=\"" . SELF . VIEW . "/" . htmlentities($link_page) . "\" class=\"missing-link\">" . htmlentities($link_page) . "</a>";
return "<a href=\"" . pageURL($page) ."\" class=\"missing-link\" . $attributes>$title</a>";
*/
}
function redirectWithMessage($page, $msg)
{
$_SESSION["msg"] = $msg;
header("HTTP/1.1 303 See Other");
header("Location: " . pageURL($page) );
exit;
}
function checkedExecute(&$msg, $cmd)
{
$returnValue = 0;
$output = '';
exec($cmd, $output, $returnValue);
if ($returnValue != 0)
{
$msg .= "<br/>Error executing command ".$cmd." (return value: ".$returnValue."): ".implode(" ", $output);
}
return ($returnValue == 0);
}
function gitChangeHandler($commitmsg, &$msg)
{
if (!GIT_COMMIT_ENABLED)
{
return;
}
if (checkedExecute($msg, "cd ".PAGES_PATH." && git add -A && git commit -m ".escapeshellarg($commitmsg)))
{
if (!GIT_PUSH_ENABLED)
{
return;
}
checkedExecute($msg, "cd ".PAGES_PATH." && git push");
}
}
function toHTMLID($noid)
{ // in HTML5, only spaces aren't allowed
return str_replace(" ", "-", $noid);
}
function toHTML($inText)
{
$parser = new MarkdownExtra;
$parser->no_markup = true;
$outHTML = $parser->transform($inText);
if ( AUTOLINK_PAGE_TITLES )
{
$pagenames = getAllPageNames();
uasort($pagenames, "descLengthSort");
foreach ( $pagenames as $pageName )
{
// match pageName, but only if it isn't inside another word or inside braces (as in "[$pageName]").
$outHTML = preg_replace("/(?<![\[a-zA-Z])$pageName(?![\]a-zA-Z])/i", "[[$pageName]]", $outHTML);
}
}
preg_match_all(
"/\[\[(.*?)\]\]/",
$outHTML,
$matches,
PREG_PATTERN_ORDER
);
for ($i = 0; $i < count($matches[0]); $i++)
{
$fullLinkText = $matches[1][$i];
$linkTitleSplit = explode('|', $fullLinkText);
$linkedPage = $linkTitleSplit[0]; // split away an eventual link text
$linkText = (count($linkTitleSplit) > 1) ? $linkTitleSplit[1] : $linkedPage;
$pagePart = explode('#', $linkedPage)[0]; // split away an eventual anchor part
$linkedFilename = fileNameForPage(sanitizeFilename($pagePart));
$exists = file_exists($linkedFilename);
$outHTML = str_replace("[[$fullLinkText]]",
pageLink($linkedPage, $linkText, ($exists? "" : " class=\"noexist\"")), $outHTML);
}
$outHTML = preg_replace("/\{\{(.*?)\}\}/", "<img src=\"" . BASE_URI . "/images/\\1\" alt=\"\\1\" />", $outHTML);
// add an anchor in all title tags (h1/2/3/4):
preg_match_all(
"/<h([1-4])>(.*?)<\/h\\1>/",
$outHTML,
$matches,
PREG_PATTERN_ORDER
);
for ($i = 0; $i < count($matches[0]); $i++)
{
$prefix = "<h".$matches[1][$i].">";
$caption = $matches[2][$i];
$suffix = substr_replace($prefix, "/", 1, 0);
$outHTML = str_replace("$prefix$caption$suffix",
"$prefix<a id=\"".toHTMLID($caption)."\">$caption</a>$suffix", $outHTML);
}
return $outHTML;
}
function destroy_session()
{
if ( isset($_COOKIE[session_name()]) )
{
setcookie(session_name(), '', time() - 42000, '/');
}
session_destroy();
unset($_SESSION["password"]);
unset($_SESSION);
}
function getPageActions($page, $action, $imgSuffix)
{
$pageActions = array('edit', 'delete', 'rename');
$pageActionNames = array(__('Edit'), __('Delete'), __('Rename'));
$result = '';
for ($i = 0; $i < count($pageActions); $i++ )
{
if ($action != $pageActions[$i])
{
$result .= " <a href=\"".SELF."?action=".$pageActions[$i].
"&amp;page=".urlencode($page)."\"><img src=\"/icons/".$pageActions[$i].$imgSuffix.".svg\" alt=\"".$pageActionNames[$i]."\" title=\"".$pageActionNames[$i]."\" class=\"icon\"></a>\n";
}
}
$result .= " <a href=\"" . SELF . "?action=view&page=$page&linkshere=true\"><img src=\"/icons/link".$imgSuffix.".svg\" alt=\"".__('Show links here')."\" title=\"".__('Show links here')."\" class=\"icon\"/></a>\n";
return $result;
}
// Main code
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'view';
$newPage = "";
$text = "";
$html = "";
if ($action === 'view' || $action === 'edit' || $action === 'save' || $action === 'rename' || $action === 'delete')
{
// Look for page name following the script name in the URL, like this:
// http://stevenf.com/w2demo/index.php/Markdown%20Syntax
//
// Otherwise, get page name from 'page' request variable.
$page = preg_match('@^/@', @$_SERVER["PATH_INFO"]) ?
urldecode(substr($_SERVER["PATH_INFO"], 1)) : urldecode(@$_REQUEST['page']);
$page = sanitizeFilename($page);
if ( $page == "" )
{
$page = DEFAULT_PAGE;
}
$filename = fileNameForPage($page);
}
if ($action === 'view' || $action === 'edit')
{
if ( file_exists($filename) )
{
$text = file_get_contents($filename);
}
else
{
$newPage = $page;
$action = 'new';
}
}
$oldgitmsg = "";
$triedSave = false;
if ( $action == 'save' )
{
$msg = '';
$newText = $_REQUEST['newText'];
$isNew = $_REQUEST['isNew'];
if ($isNew)
{
$page = str_replace(array('|','#'), '', $page);
$filename = fileNameForPage($page);
}
if ($isNew && file_exists($filename))
{
$msg .= "Error creating page '$page' - it already exists! Please choose a different name, or <a href=\"?action=edit&amp;page=".urlencode($page)."\">edit</a> the existing page (this discards current text!)!</div>\n";
$action = 'new';
$text = $newText;
$newPage = $page;
if (GIT_COMMIT_ENABLED)
{
$oldgitmsg = $_REQUEST['gitmsg'];
}
$triedSave = true;
}
else
{
$errLevel = error_reporting(0);
if ( !file_exists( dirname($filename) ) ) {
mkdir(dirname($filename), 0755, true);
}
$success = file_put_contents($filename, $newText);
error_reporting($errLevel);
if ( $success === FALSE)
{
$msg .= "Error saving changes! Make sure your web server has write access to " . PAGES_PATH . "\n";
$action = ($isNew ? 'new' : 'edit');
$text = $newText;
$newPage = $page;
if (GIT_COMMIT_ENABLED)
{
$oldgitmsg = $_REQUEST['gitmsg'];
}
$triedSave = true;
}
else
{
$msg .= ($isNew ? __('Created'): __('Saved'));
$usermsg = $_REQUEST['gitmsg'];
$commitmsg = $page . ($usermsg !== '' ? (": ".$usermsg) : ($isNew ? " created" : " changed"));
gitChangeHandler($commitmsg, $msg);
}
}
redirectWithMessage($page, $msg);
}
if ( $action === 'edit' || $action === 'new' )
{
$formAction = SELF . (($action === 'edit') ? "/$page" : "");
$html .= "<form id=\"edit\" method=\"post\" action=\"$formAction\">\n";
if ( $action === 'edit' )
{
$html .= "<input type=\"hidden\" name=\"page\" value=\"$page\" />\n";
}
else
{
if ($newPage != "" && !$triedSave)
{
$html .= "<div class=\"note\">". __('Creating new page since no page with given title exists!') ;
// check if similar page exists...
$pageNames = getAllPageNames();
foreach($pageNames as $pageName)
{
if (levenshtein(strtoupper($newPage), strtoupper($pageName)) < sqrt(min(strlen($newPage), strlen($pageName))) )
{
$html .= "<br/><strong>Note:</strong> Found similar page ".pageLink($pageName, $pageName).". Maybe you meant to edit this instead?";
}
}
$html .= "</div>\n";
}
$html .= "<p>" . __('Title') . ": <input id=\"title\" title=\"".__("Character restrictions: '#' and '|' have a special meaning in page links, they will therefore be removed; also, characters '~', '..', '\\', ':', '|', '&' might cause trouble in filenames and are therefore replaced by '-'.")."\" type=\"text\" name=\"page\" value=\"$newPage\" class=\"pagename\" placeholder=\"".__('Name of new page (restrictions in tip)')."\"/></p>\n";
}
$html .= "<p><textarea id=\"text\" name=\"newText\" rows=\"" . EDIT_ROWS . "\" autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\">$text</textarea></p>\n";
if (GIT_COMMIT_ENABLED)
{
$html .= "<p>Message: <input type=\"text\" id=\"gitmsg\" name=\"gitmsg\" value=\"$oldgitmsg\" /></p>\n";
}
$html .= "<p><input type=\"hidden\" name=\"action\" value=\"save\" />\n";
$html .= "<input type=\"hidden\" name=\"isNew\" value=\"".(($action==='new')?"true":"")."\" />\n";
$html .= '<input id="save" type="submit" value="'. __('Save') .'" />'."\n";
$html .= '<input id="cancel" type="button" onclick="history.go(-1);" value="'. __('Cancel') .'" />'."\n";
$html .= "</p></form>\n";
}
else if ( $action === 'logout' )
{
destroy_session();
header("Location: " . SELF);
exit;
}
else if ( $action === 'upload' )
{
if ( DISABLE_UPLOADS )
{
$html .= '<p>' . __('Image uploading has been disabled on this installation.') . '</p>';
}
else
{
$html .= "<form id=\"upload\" method=\"post\" action=\"" . SELF . "\" enctype=\"multipart/form-data\"><p>\n".
"<input type=\"hidden\" name=\"action\" value=\"uploaded\" />".
"<input id=\"file\" type=\"file\" name=\"userfile\" />\n".
'<input id="resize" type="checkbox" checked="checked" name="resize" value="true">'.
'<label for="resize">'.__('Shrink if larger than ').'</label>'.
'<input id="maxsize" type="number" name="maxsize" min="20" max="8192" value="1200">'.
'<label for="maxsize" id="maxsizelabel">'.__('Pixels').'</label>'.
'<input id="upload" type="submit" value="' . __('Upload') . '" />'."\n".
'<input id="cancel" type="button" onclick="history.go(-1);" value="'. __('Cancel') .'" />'."\n";
"</p></form>\n";
}
// list files in UPLOAD_FOLDER
$path = PAGES_PATH . "/". UPLOAD_FOLDER . "/*";
$imgNames = glob($path);
natcasesort($imgNames);
$html .= "<p>".__('Total').": ".count($imgNames)." ".__('images')."</p>";
$html .= "<table><thead>";
$html .= "<tr>".
/*
"<td>".(($sortBy!='name')?("<a href=\"".SELF."?action=all&sortBy=name\">Name</a>"):"<span class=\"sortBy\">Name</span>")."</td>".
"<td>".(($sortBy!='recent')?("<a href=\"".SELF."?action=all&sortBy=recent\">Modified</a>"):"<span class=\"sortBy\">Modified</span>")."</td>".
*/ "<td>".__("Name")."</td><td>".__("Usage")."</td><td>".__("Modified")."</td><td>".__("Action")."</td>".
"</tr></thead><tbody>";
$date_format = __('date_format', TITLE_DATE);
foreach ($imgNames as $imgName)
{
$html .= "<tr>".
"<td>".basename($imgName)."</td>".
"<td><pre>".imageLinkText(basename($imgName))."</pre></td>".
"<td><nobr>".date($date_format, filemtime($imgName))."</nobr></td>".
"<td><a href=\"".SELF."?action=imgDelete"."&amp;imgName=".urlencode(basename($imgName))."\">".__('Delete')."</a></td>".
"</tr>\n";
}
$html .= "</tbody></table>\n";
}
else if ( $action === 'uploaded' )
{
if ( DISABLE_UPLOADS )
{
die('Invalid access. Uploads are disabled in the configuration.');
}
$dstName = sanitizeFilename($_FILES['userfile']['name']);
$dstName = str_replace(" ", "_", $dstName); // image display currently doesn't like spaces!
$fileType = $_FILES['userfile']['type'];
preg_match('/\.([^.]+)$/', $dstName, $matches);
$fileExt = isset($matches[1]) ? $matches[1] : null;
$imgExts = array('jpg','jpeg','png','gif');
$msg = '';
if (in_array($fileType, explode(',', VALID_UPLOAD_TYPES)) &&
in_array($fileExt, explode(',', VALID_UPLOAD_EXTS)))
{
$path = PAGES_PATH . "/". UPLOAD_FOLDER . "/$dstName";
$resize = isset($_POST['resize']) && $_POST['resize'] === 'true';
$doResize = $resize && in_array($fileExt, $imgExts);
if ($doResize)
{
$exif = exif_read_data($_FILES['userfile']['tmp_name']);
$size = getimagesize($_FILES['userfile']['tmp_name']);
$maxsize = intval($_POST['maxsize']);
$doResize = ($size[0] > $maxsize || $size[1] > $maxsize);
if ($doResize)
{
$msg .= "trying to resize";
$finalPath = $path;
$path = substr($path, 0, strlen($path)-strlen($fileExt)-1) . "-tmp-resize." . $fileExt;
}
}
$errLevel = error_reporting(0);
if ( move_uploaded_file($_FILES['userfile']['tmp_name'], $path) === true )
{
$msg = "File '$dstName' uploaded! ";
if ($doResize)
{
$newSize = array(0, 0);
$idx0 = ($size[0] > $size[1]) ? 0 : 1;
$idx1 = ($idx0 == 0) ? 1 : 0;
$newSize[$idx0] = $maxsize;
$newSize[$idx1] = (int)round($size[$idx1] * $maxsize / $size[$idx0]);
$src = imagecreatefromstring(file_get_contents($path));
$dst = imagecreatetruecolor($newSize[0], $newSize[1]);
if (!imagecopyresampled($dst, $src, 0, 0, 0, 0, $newSize[0], $newSize[1], $size[0], $size[1]))
{
$msg .= "Resizing file failed!";
}
imagedestroy( $src );
if(!empty($exif['Orientation']))
{
switch($exif['Orientation'])
{
case 8:
$msg .= "Image rotated by +90°. ";
$rot = imagerotate($dst,90,0);
break;
case 3:
$msg .= "Image rotated by 180°. ";
$rot = imagerotate($dst,180,0);
break;
case 6:
$msg .= "Image rotated by -90°. ";
$rot = imagerotate($dst,-90,0);
break;
default:
$msg .= "Unknown EXIF orientation specification: ".$exif['Orientation']."!";
break;
}
if ($rot === false)
{
$msg .= "Rotation failed!";
}
else
{
imagedestroy( $dst );
$dst = $rot;
}
}
if ($fileExt === 'png')
{
imagepng($dst, $finalPath);
}
else if ($fileExt === 'jpg' || $fileExt === 'jpeg')
{
imagejpeg($dst, $finalPath);
}
else if ($fileExt === 'gif')
{
imagegif($dst, $finalPath);
}
unlink($path);
imagedestroy( $dst );
}
gitChangeHandler($msg, $msg);
$msg .= " ($size[0]x$size[1]".(($doResize)?", resized to $newSize[0]x$newSize[1]":"").") successfully! Use <pre>".imageLinkText($dstName)."</pre> to refer to it!";
}
else
{
$error_code = $_FILES['userfile']['error'];
if ( $error_code === 0 ) {
// Likely a permissions issue
$msg .= __('Upload error') .": Can't write to ".$path."<br/><br/>\n".
"Check that your permissions are set correctly.";
} else {
// Give generic error message
$msg .= __('Upload error').", error #".$error_code."<br/><br/>\n".
"Please see <a href=\"https://www.php.net/manual/en/features.file-upload.errors.php\">here</a> for more information.<br/><br/>\n".
"If you see this message, please <a href=\"https://github.com/codeling/w2wiki/issues\">file a bug to improve w2wiki</a>";
}
}
error_reporting($errLevel);
}
else
{
$msg .= __('Upload error: invalid file type');
}
redirectWithMessage(DEFAULT_PAGE, $msg);
}
else if ( $action === 'rename' || $action === 'delete' || $action === 'imgDelete')
{
if ($action === 'imgDelete')
{
$page = sanitizeFilename(urldecode($_REQUEST['imgName']));
}
$actionName = ($action === 'delete' || $action === 'imgDelete')?__('Delete'):__('Rename');
$html .= "<form id=\"$action\" method=\"post\" action=\"" . SELF . "\">";
$html .= "<p>".$actionName." $page ".
(($action==='rename')? (__('to')." <input id=\"newPageName\" type=\"text\" name=\"newPageName\" value=\"" . htmlspecialchars($page) . "\" class=\"pagename\" />") : "?") . "</p>";
$html .= "<p><input id=\"$action\" type=\"submit\" value=\"$actionName\">";
$html .= "<input id=\"cancel\" type=\"button\" onclick=\"history.go(-1);\" value=\"Cancel\" />\n";
$html .= "<input type=\"hidden\" name=\"action\" value=\"${action}d\" />";
$html .= "<input type=\"hidden\" name=\"oldPageName\" value=\"" . htmlspecialchars($page) . "\" />";
$html .= "</p></form>";
}
else if ( $action === 'renamed' || $action === 'deleted')
{
// TODO: prevent relative filenames from being injected
$oldPageName = sanitizeFilename($_POST['oldPageName']);
$newPageName = ($action === 'deleted') ? "": sanitizeFilename($_POST['newPageName']);
$msg = '';
if ($action === 'deleted')
{
$success = unlink(fileNameForPage($oldPageName));
}
else
{
$success = rename(fileNameForPage($oldPageName), fileNameForPage($newPageName));
}
if ($success)
{
$message = ($action === 'deleted') ? "Removed $oldPageName." :
"Renamed $oldPageName to $newPageName.";
$msg .= $message;
// Change links in all pages to point to new page
$pagenames = getAllPageNames();
$changedPages = array();
foreach ($pagenames as $replacePage)
{
$content = file_get_contents(fileNameForPage($replacePage));
$count = 0;
$regexSaveOldPageName = str_replace("/", "\\/", $oldPageName);
$newContent = preg_replace("/\[\[$regexSaveOldPageName([|#].*\]\]|\]\])/",
(($action === 'deleted') ? "" : "[[$newPageName\\1"),
$content, -1, $count);
if ($count > 0) // if something changed
{
$changedPages[] = $replacePage." ($count ".__('matches').")";
file_put_contents(fileNameForPage($replacePage), $newContent);
}
}
if (count($changedPages) > 0)
{
$msg .= "<br/>\n".__('Updated links in the following pages:')."\n<ul><li>";
$msg .= implode("</li><li>", $changedPages);
$msg .= "</li></ul>";
}
gitChangeHandler($message, $msg);
$page = $newPageName;
}
else
{
$msg .= ($action === 'deleted') ? __('Error deleting file'): __('Error renaming file');
$page = $oldPageName;
}
if ($action === 'deleted' && $success)
{
$page = DEFAULT_PAGE;
}
redirectWithMessage($page, $msg);
}
else if ( $action === 'imgDeleted')
{
// TODO: prevent relative filenames from being injected
$oldPageName = sanitizeFilename($_REQUEST['oldPageName']);
$imgPath = PAGES_PATH . "/". UPLOAD_FOLDER . "/". $oldPageName;
$success = unlink($imgPath);
if ($success)
{
$msg = __('Image deleted');
gitChangeHandler($msg, $msg);
$msg .= " (".$imgPath.")";
}
else
{
$msg = __('Error deleting image');
$msg .= " (".$imgPath.")";
}
redirectWithMessage(DEFAULT_PAGE, $msg);
}
else if ( $action === 'all' )
{
$pageNames = getAllPageNames();
$filelist = array();
$sortBy = isset($_REQUEST['sortBy']) ? $_REQUEST['sortBy'] : 'name';
if (!in_array($sortBy, array('name', 'recent')))
{
$sortBy = 'name';
}
if ($sortBy === 'name')
{
natcasesort($pageNames);
foreach($pageNames as $page)
{
$filelist[$page] = filemtime(fileNameForPage($page));
}
}
else
{
foreach($pageNames as $page)
{
$filelist[$page] = filemtime(fileNameForPage($page));
}
arsort($filelist, SORT_NUMERIC);
}
$html .= "<p>".__('Total').": ".count($pageNames)." ".__("pages")."</p>";
$html .= "<table><thead>";
$html .= "<tr>".
"<td>".(($sortBy!='name')?("<a href=\"".SELF."?action=all&sortBy=name\">Name</a>"):"<span class=\"sortBy\">".__('Name')."</span>")."</td>".
"<td>".(($sortBy!='recent')?("<a href=\"".SELF."?action=all&sortBy=recent\">".__('Modified')."</a>"):"<span class=\"sortBy\">".__('Modified')."</span>")."</td>".
"<td>".__('Action')."</td>".
"</tr></thead><tbody>";
$date_format = __('date_format', TITLE_DATE);
foreach ($filelist as $pageName => $pageDate)
{
$html .= "<tr>".
"<td>".pageLink($pageName, $pageName)."</td>".
"<td valign=\"top\"><nobr>".date( $date_format, $pageDate)."</nobr></td>".
//"<td class=\"pageActions\">".getPageActions($pageName, $action,"-dark")."</td>". /* dark mode */
"<td class=\"pageActions\">".getPageActions($pageName, $action, "")."</td>". /* light mode */
"</tr>\n";
}
$html .= "</tbody></table>\n";
}
else if ( $action === 'search' )
{
$matches = 0;
$q = $_REQUEST['q'];
$html .= " <h1>Search: $q</h1>\n";
if ( trim($q) != "" )
{
$html .= " <ul>\n";
$pagenames = getAllPageNames();
$found = FALSE;
$matchingPages = array();
foreach ($pagenames as $searchPage)
{
if ($searchPage === $q)
{
$found = TRUE;
}
if (preg_match("/{$q}/i", $searchPage))
{
array_unshift($matchingPages, $searchPage);
++$matches;
}
else
{
$text = file_get_contents(fileNameForPage($searchPage));
if ( preg_match("/{$q}/i", $text) )
{
$matchingPages[] = $searchPage;
++$matches;
}
}
}
foreach ($matchingPages as $page)
{
$link = pageLink($page, $page, ($page === $q)? " class=\"literalMatch\"": "");
$html .= " <li>$link</li>\n";
}
if (!$found)
{
$html .= " <li>".pageLink($q, __('Create page')." '$q'", " class=\"noexist\"")."</li>";
}
$html .= " </ul>\n";
}
$html .= " <p>$matches ".__('matches')."</p>\n";
}
else
{
$html .= empty($text) ? '' : toHTML($text);
}
$datetime = '';
if ( ($action === 'all'))
{
$title = __("All");
}
else if ( $action === 'upload' )
{
$title = __("Upload");
}
else if ( $action === 'new' )
{
$title = __("New");
}
else if ( $action === 'search' )
{
$title = __("Search");
}
else if ($filename != '')
{
$title = (($action === 'edit')? (__('Edit').": "):"") . $page;
$date_format = __('date_format', TITLE_DATE);
if ( $date_format )
{
$datetime = "<span class=\"titledate\">" . date($date_format, @filemtime($filename)) . "</span>";
}
}
else
{
$title = __($action);
}
// Disable caching on the client (the iPhone is pretty agressive about this
// and it can cause problems with the editing function)
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
printHeader($title, $action);
print " <div class=\"titlebar\"><span class=\"title\">$title</span>$datetime";
if ($action === 'view' || $action === 'rename' || $action === 'delete' || $action === 'edit')
{
print(getPageActions($page, $action, ""));
}
print " </div>\n";
print " <div class=\"toolbar\">\n";
print " <a href=\"" . SELF . "\"><img src=\"/icons/home.svg\" alt=\"". __(DEFAULT_PAGE) . "\" title=\"". __(DEFAULT_PAGE) . "\" class=\"icon\"></a>\n";
print " <a href=\"" . SELF . "?action=all\"><img src=\"/icons/list.svg\" alt=\"". __('All') . "\" title=\"". __('All') . "\" class=\"icon\"></a>\n";
print " <a href=\"" . SELF . "?action=new\"><img src=\"/icons/new.svg\" alt=\"".__('New')."\" title=\"".__('New')."\" class=\"icon\"></a>\n";
if ( !DISABLE_UPLOADS )
{
print " <a href=\"" . SELF . VIEW . "?action=upload\"><img src=\"/icons/upload.svg\" alt=\"".__('Upload')."\" title=\"".__('Upload')."\" class=\"icon\"/></a>\n";
}
if ( REQUIRE_PASSWORD )
{
print " <a href=\"" . SELF . "?action=logout\">". __('Log out') . "</a>";
}
print " <form method=\"post\" action=\"" . SELF . "?action=search\">\n";
print " <input class=\"search\" placeholder=\"". __('Search') ."\" size=\"20\" id=\"search\" type=\"text\" name=\"q\" />\n </form>\n";
if ($action === 'edit')
{
printDrawer();
}
print " </div>\n";
if (SIDEBAR_PAGE != '')
{
print " <div class=\"sidebar\">\n\n";
$sidebarFile = fileNameForPage(SIDEBAR_PAGE);
if (file_exists($sidebarFile))
{
$text = file_get_contents($sidebarFile);
}
else
{
$text = __('Sidebar file could not be found')." ($sidebarFile)";
}
print toHTML($text);
print " </div>\n";
}
if ($action === 'view' && $_GET['linkshere'])
{
print "<div class=\"linkshere\">".__('What links here:')."<ul>";
$pagenames = getAllPageNames();
foreach($pagenames as $searchPage)
{
$text = file_get_contents(fileNameForPage($searchPage));
$regexSavePage = str_replace("/", "\\/", $page);
if ( preg_match("/\[\[$regexSavePage/i", $text) )
{
$link = pageLink($searchPage, $searchPage, "");
print(" <li>$link</li>\n");
}
}
print "</ul></div>";
}
print " <div class=\"main\">\n\n";
if(isset($_SESSION['msg']) && $_SESSION['msg'] != '')
{
print " <div class=\"note\">".$_SESSION['msg']."</div>";
unset($_SESSION['msg']);
}
print "$html\n";
print " </div>\n";
printFooter();

View file

@ -1,65 +0,0 @@
<?php if (!defined('W2APP')){ die('No direct access.'); }
/**
* Locale set
*
* Do not change variable name $w2_word_set.
* Rewrite values in your locale and rename this file to locale code.
* Set "LOCALE" to your locale in config.php.
*/
$w2_word_set = array(
// Buttons / Labels
'Home' => 'Start',
'New' => 'Neu',
'Edit' => 'Bearbeiten',
'Delete' => 'Löschen',
'Rename' => 'Umbenennen',
'Created' => 'Angelegt',
'Upload' => 'Hochladen',
'All' => 'Alle',
'Recent' => 'Zuletzt',
'Exit' => 'Ausloggen',
'Search' => 'Suchen',
'Formatting help' => 'Formatierungshilfe',
'Bold' => 'Fett',
'Emphasize' => 'Kursiv',
'Header' => 'Überschrift',
'Save' => 'Speichern',
'Cancel' => 'Abbrechen',
'Saved' => 'Gespeichert',
'Log In' => 'Einloggen',
'Log Out' => 'Ausloggen',
'Password' => 'Passwort',
'Title' => 'Titel',
'Image Description' => 'Bildbeschreibung',
'Name' => 'Name',
'Usage' => 'Verwendung',
'Modified' => 'Verändert',
'Action' => 'Aktion',
'Total' => 'Gesamt',
'images' => 'Bilder',
'matches' => 'Übereinstimmung(en)',
'pages' => 'Seite(n)',
'Create page' => 'Seite anlegen',
'to' => 'in',
'Shrink if larger than ' => 'Verkleinern wenn größer als ',
'Pixels' => 'Pixel',
'What links here:' => 'Seiten die hierher linken:',
'Close' => 'Schließen',
// Messages
'Upload error' => 'Fehler beim Hochladen',
'Upload error: invalid file type' => 'Fehler beim Hochladen: Dieser Dateityp ist nicht zugelassen, bitte wende Dich an deinen Administrator!',
'Image uploading has been disabled on this installation.' => 'Hochladen ist nicht erlaubt, bitte wende Dich an deinen Administrator!',
'Creating new page since no page with given title exists!' => 'Es wird eine neue Seite angelegt, weil noch keine Seite mit dem angegebenen Titel existiert!',
'Updated links in the following pages:' => 'Es wurden Links in den folgenden Seiten aktualisiert:',
'Error deleting file' => 'Fehler beim Löschen der Datei',
'Error renaming file' => 'Fehler beim Umbenennen der Datei',
'Sidebar file could not be found' => 'Seitenleisten-Datei nicht gefunden',
'Name of new page (restrictions in tip)' => 'Seitenname (Einschränkungen im Tip)',
"Character restrictions: '#' and '|' have a special meaning in page links, they will therefore be removed; also, characters '~', '/', '\\', ':', '|', '&' might cause trouble in filenames and are therefore replaced by '-'." => "Buchstaben-Beschränkungen: '#' und '|' haben eine spezielle Bedeutung in Links, sie werden deshalb entfernt. Weiters können die Zeichen '~', '/', '\\', ':', '|', '&' Probleme in Dateinamen verursachen, und werden deshalb durch einen Bindestrich '-' ersetzt.",
'Image deleted' => 'Bild gelöscht',
'Error deleting image' => 'Fehler beim Löschen des Bildes',
// Override TITLE_DATE and TITLE_DATE_NO_TIME if set.
'date_format' => 'd.m.Y H:i',
'date_format_no_time' => 'd.m.Y',
);

View file

@ -1,32 +0,0 @@
<?php if (!defined('W2APP')){ die('No direct access.'); }
/**
* Locale set
*
* Do not change variable name $w2_word_set.
* Rewrite values in your locale and rename this file to locale code.
* Set "LOCALE" to your locale in config.php.
*/
$w2_word_set = array(
// Buttons / Labels
'Home' => 'Home',
'New' => 'New',
'Edit' => 'Edit',
'Upload' => 'Upload',
'All' => 'All',
'Recent' => 'Recent',
'Exit' => 'Exit',
'Search' => 'Search',
'Save' => 'Save',
'Cancel' => 'Cancel',
'Saved' => 'Saved',
'Log In' => 'Log In',
'Title' => 'Title',
// Messages
'Upload error' => 'Upload error',
'Upload error: invalid file type' => 'Upload error: invalid file type',
'Image uploading has been disabled on this installation.' => 'Image uploading has been disabled on this installation.',
// Override TITLE_DATE and TITLE_DATE_NO_TIME if set.
'date_format' => 'Y-m-d H:i:s',
'date_format_no_time' => 'Y-m-d',
);

View file

@ -1,32 +0,0 @@
<?php if (!defined('W2APP')){ die('No direct access.'); }
/**
* Locale set
*
* Do not change variable name $w2_word_set.
* Rewrite values in your locale and rename this file to locale code.
* Set "LOCALE" to your locale in config.php.
*/
$w2_word_set = array(
// Buttons / Labels
'Home' => 'ホーム',
'New' => '新規',
'Edit' => '編集',
'Upload' => 'アップロード',
'All' => '全て',
'Recent' => '最近',
'Exit' => 'ログアウト',
'Search' => '検索',
'Save' => '保存',
'Cancel' => 'キャンセル',
'Saved' => '保存しました',
'Log In' => 'ログイン',
'Title' => 'ページタイトル',
// Messages
'Upload error' => 'アップロードエラー',
'Upload error: invalid file type' => 'アップロードエラー:不正なファイル形式です',
'Image uploading has been disabled on this installation.' => '画像アップロードは許可されていません。',
// Override TITLE_DATE and TITLE_DATE_NO_TIME if set.
'date_format' => 'Y-m-d H:i:s',
'date_format_no_time' => 'Y-m-d',
);

View file

@ -1,32 +0,0 @@
<?php if (!defined('W2APP')){ die('No direct access.'); }
/**
* Locale set
*
* Do not change variable name $w2_word_set.
* Rewrite values in your locale and rename this file to locale code.
* Set "LOCALE" to your locale in config.php.
*/
$w2_word_set = array(
// Buttons / Labels
'Home' => 'Home',
'New' => 'New',
'Edit' => 'Edit',
'Upload' => 'Upload',
'All' => 'All',
'Recent' => 'Recent',
'Exit' => 'Exit',
'Search' => 'Search',
'Save' => 'Save',
'Cancel' => 'Cancel',
'Saved' => 'Saved',
'Log In' => 'Log In',
'Title' => 'Title',
// Messages
'Upload error' => 'Upload error',
'Upload error: invalid file type' => 'Upload error: invalid file type',
'Image uploading has been disabled on this installation.' => 'Image uploading has been disabled on this installation.',
// Override TITLE_DATE and TITLE_DATE_NO_TIME if set.
'date_format' => 'Y-m-d H:i:s',
'date_format_no_time' => 'Y-m-d',
);

View file

@ -1,10 +0,0 @@
<?php
// Use this file if you cannot use class autoloading. It will include all the
// files needed for the Markdown parser.
//
// Take a look at the PSR-0-compatible class autoloading implementation
// in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php';
require_once dirname(__FILE__) . '/Markdown.php';

File diff suppressed because it is too large Load diff

View file

@ -1,11 +0,0 @@
<?php
// Use this file if you cannot use class autoloading. It will include all the
// files needed for the MarkdownExtra parser.
//
// Take a look at the PSR-0-compatible class autoloading implementation
// in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php';
require_once dirname(__FILE__) . '/Markdown.php';
require_once dirname(__FILE__) . '/MarkdownExtra.php';

File diff suppressed because it is too large Load diff

View file

@ -1,9 +0,0 @@
<?php
// Use this file if you cannot use class autoloading. It will include all the
// files needed for the MarkdownInterface interface.
//
// Take a look at the PSR-0-compatible class autoloading implementation
// in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php';

View file

@ -1,38 +0,0 @@
<?php
/**
* Markdown - A text-to-HTML conversion tool for web writers
*
* @package php-markdown
* @author Michel Fortin <michel.fortin@michelf.com>
* @copyright 2004-2019 Michel Fortin <https://michelf.com/projects/php-markdown/>
* @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
*/
namespace md;
/**
* Markdown Parser Interface
*/
interface MarkdownInterface {
/**
* Initialize the parser and return the result of its transform method.
* This will work fine for derived classes too.
*
* @api
*
* @param string $text
* @return string
*/
public static function defaultTransform($text);
/**
* Main function. Performs some preprocessing on the input text
* and pass it through the document gamut.
*
* @api
*
* @param string $text
* @return string
*/
public function transform($text);
}

View file

@ -1,183 +0,0 @@
Getting Started
---------------
[speedwm](https://speedie.gq/projects/speedwm.php) is a window manager forked
from [dwm](https://dwm.suckless.org) (also known as dynamic window manager).
It manages the user's open windows and tiles them according to a set layout.
This is what makes it dynamic, unlike windows managers like i3 which you may
be used to.
### This is an X11 window manager, you need to use X.
Yes, this is an X11 window manager. I do not like Wayland and it's
philosophies, and I will not
support it for multiple reasons. See for my reasoning
behind this. Hate me all you want for it!
If it isn't clear, `xorg-server` as well as `xinit` or `sx` is pretty much
expected. You can also use display managers like `sddm` or `lightdm` although
it should be mentioned that `ly` is **known** to have issues with dwm and
therefore also
speedwm. Do note that setting up X11 is out of the scope of this wiki, and you
need to figure out how to do that yourself.
### Supported operating systems
This is not some arbitrary requirement. While it may run if it's not listed
here, I will not be providing support due to having a lack of experience with
said operating system. The main operating systems that **do not** support
speedwm are macOS and Microsoft Windows. UNIX like operating systems are the
most likely to run it.
- Nearly all GNU/Linux distributions
- NixOS and GNU Guix may require separate instructions. I will not provide
support for these, use the existing documentation to set it up.
- FreeBSD, OpenBSD, NetBSD
- There are likely more BSDs that can run speedwm, but I cannot support all
of them. Try it and see if it works.
### Installation on Gentoo GNU/Linux
Gentoo has slightly different instructions for setting up speedwm. While you
can follow along with the generic installation instructions, I have a Gentoo
overlay with packages for all speedwm versions.
To get started, add [my
overlay](https://codeberg.org/speedie/speedie-overlay). Then simply `emerge
x11-wm/speedwm x11-wm/libspeedwm x11-wm/speedwm-extras`. Optionally, you may
`emerge x11-misc/spde` instead, which is a metapackage for a lot of stuff
including fonts, and general programs that work well for me.
If you want to install speedwm using Git, do this by adding the following
lines:
`=x11-wm/speedwm-9999 **`
`=x11-wm/libspeedwm-9999 **`
`=x11-wm/speedwm-extras-9999 **`
to `/etc/portage/package.accept_keywords` and then emerging the packages as
per the instructions above.
### Installation on generic GNU/Linux distributions
Installing speedwm on most GNU/Linux distributions is very simple. First,
determine if you want to install it using Git (the absolute latest version) or
using a stable tarball.
As of 26/01/2023, 1.8 is the latest tarball release
which is not very stable. For this reason, it is recommended that you `git
clone` the repository. If you do not have `git`, install it using your
distribution's package manager. If you're (still) going to be using a 'stable'
tarball, you do not need to install `git`.
While the list of dependencies will vary depending on the speedwm version
you're going to install (see docs/dependencies.md for your specific version),
below is a list for the latest release, 1.8 and soon to be 1.9.
- libXft
- libXinerama
- Used for multi-monitor support. It can be disabled if you do not need it
by commenting the XINERAMA libraries in `toggle.mk`.
- imlib2
- Used for tag previews and window icons. It can be disabled if you do not
need it. To do this, comment out `IMLIB2LIBS` in `toggle.mk` and set
`USEIMLIB2`, `USEWINICON` and `USETAGPREVIEW` to `0` in `toggle.h`.
- pango
- yajl
- Used for IPC support. It can be disabled if you do not need it. To do
this, comment out `YAJLINC` and `YAJLLIBS` in `toggle.mk` and set `USEIPC`
to `0` in `toggle.h`.
- tcc
- This is a compiler. It is used because it is much faster than `clang` or
`gcc` (although at the expense of debugging and compatibility). You can
swap it out by passing `CC=cc` to the `make` command later when we compile
speedwm.
#### Installation using `git`
This assumes you have `git` installed.
`cd` into a location where your normal user (not root) has permission to both
read and write. Do not clone the speedwm repository in `~/.config` as speedwm
will write configuration files to that location.
<span style="color:blue">Note: Cloning the repository to `~/.config` is fine
if the speedwm source code directory is **not** `speedwm` but speedwm
will use the `~/.config/speedwm` directory to store configuration files (not
source code).</span>
From here on, we're going to assume you are in the location `~/Documents`! Run
`git clone https://codeberg.org/speedie/speedwm.git speedwm` to clone the
repository into a directory named `speedwm`. Provided the repository hasn't
moved and you have a working internet connection, you should have received a
copy of the speedwm source code.
You can now `cd speedwm` into it so we can actually install it. If you need to
make changes to `toggle.h`, `toggle.mk`, `host.mk` or any other C source code,
now is the time to do it.
Now, it's time to compile it! Provided you have all dependencies installed,
this should be very, very easy and quick. Run `make clean install` as root to install
speedwm. The binary will be in `/usr/bin/speedwm`. If you need to use a
different compiler (tcc in Arch repositories has a few issues), you can run
`make CC=cc clean install` to use the system default compiler. Alternatively
use `gcc` instead of `cc` or whatever you want.
After installation, it is *highly* recommended that you move your source code
directory to a safe place. speedwm is a source based window manager and
**most** (but not all) changes you make to it are going to be done by
recompiling the window manager. This is, of course done with the same `make
clean install` command you used earlier.
I recommend you do this by forking the speedwm repository, and putting it on a
Git repository somewhere. That way, you can always clone your specific
version.
<span style="color:red">Warning: If you lose your source code, you will be
**unable** to make any further changes to speedwm.</span>
Now follow along with 'Using speedwm'.
#### Installation using a tarball
Installation using a tarball works pretty much the same. Visit [the releases
page](https://codeberg.org/speedie/speedwm/releases) and get the latest
(or an old if you want) tarball. Avoid the 'Source Code (ZIP)' and 'Source
Code (TAR.GZ)' options, get the 'speedwm-<version>.tar.gz' file.
`cd` into a location where your normal user (not root) has permission to both
read and write. Make sure `~/.config/speedwm` is not used by anything.
Now we need to unpack the tarball and get our source code. To do this, you can
use the `tar` command. I will spare you the time reading the man page and the
command to unpack the tarball is `tar -xpvf
/path/to/the/speedwm/tarball.tar.gz`. The `-x` argument here means extract.
`-p` means preserve permissions. The `-v` means verbose, we want to see
what's going on. `-f` means file, we want to specify a file to unpack.
After unpacking it, there should be one directory; `speedwm-<version>`. Let's
`cd speedwm-<version>` into it. Now it's time to compile speedwm!
Provided you have all dependencies installed, this should be very, very easy
and quick. Run `make clean install` as root to install speedwm. The binary
will be in `/usr/bin/speedwm`. If you need to use a different compiler (tcc in
Arch repostories has a few issues), you can run `make CC=cc clean install` to
use the system default compiler. Alternatively use `gcc` instead of `cc` or
whatever you want.
After installation, it is *highly* recommended that you move your source code
directory to a safe place. speedwm is a source based window manager and
**most** (but not all) changes you make to it are going to be done by
recompiling the window manager. This is, of course done with the same `make
clean install` command you used earlier.
I recommend you do this by putting the source code on a
Git or subversion repository somewhere. That way, you can always clone your specific
version.
<span style="color:red">Warning: If you lose your source code, you will be
**unable** to make any further changes to speedwm.</span>
Now follow along with 'Using speedwm'.

View file

@ -1,4 +0,0 @@
Welcome to the speedie.site wiki!
---------------------------------
Welcome to the speedie.site wiki! This is a wiki that anyone may edit. It is mostly related to speedie.site projects such as fontctrl, spmenu and others, although [speedwm](https://speedwm.speedie.site) has its own wiki.

View file

@ -1,173 +0,0 @@
# Code documentation
NOTE: This article was taken from [the spmenu repository](https://git.speedie.site/spmenu/plain/code.pdf). This article therefore be outdated or vice versa. I highly recommend you check out the repository first though.
Some of spmenu's code documented. If you want to hack on the project, this
should be useful. Note that these may be renamed in the future to make the
codebase easier to understand and make changes to. Also note that this is
**definitely not** a complete list.
## Position and width/height variables
- `bh`
- Menu height divided by lines gets you `bh`. The name comes from dwm's `bh`
meaning 'bar height'. This is the height of each item in the list.
- `mh`
- Menu height (or height of the window)
- Use `drw_resize()` and `XResizeWindow()` to adjust this.
- `mw`
- Menu width (or width of the window)
- Use `drw_resize()` and `XResizeWindow()` to adjust this.
- `2 * borderwidth` is removed from `mw` (2* because we have two sides)
- `2 * sp` is removed from `mw` (2* because we have two sides)
- `x`
- X position, functions like `drw_text` use this.
- If you set this in bar drawing functions, you must apply the same
to `buttonpress()`, otherwise clicks will be offset.
- `y`
- Y position, functions like `drw_text` use this.
- If you set this in bar drawing functions, you must apply the same
to `buttonpress()`, otherwise clicks will be offset.
- `ev->x`
- X position where you clicked. This is used in the `buttonpress()` function
to check where you clicked.
- `ev->y`
- Y position where you clicked. This is used in the `buttonpress()` function
to check where you clicked.
- `w`
- Width of something, this is passed to `drw_text()` for example, but you may
override this.
- `plw`
- This is the width of the powerline arrow. It must be added on in
the `buttonpress()` and draw functions.
- `vp`
- Vertical padding, this is initially added on in the `create_window()` function.
- `sp`
- Horizontal padding, this is initially added on in the `create_window()` function.
- `promptw`
- Width of the prompt text, this is going to be the same as `TEXTW(prompt)`.
- `inputw`
- Width of the input text.
- `fh`
- Font height. Used to calculate the height of the cursor. See `drawcaret()`.
- `menuposition`
- Integer the user is meant to configure. If it's set to `0`, spmenu will be
put on the bottom of the screen. If it's set to `1` it will be put on the
top of the screen. If it's `2` it will be put in the center of the screen.
- `wa.width`
- Window width, `wa` is `XWindowAttributes`.
- `wa.height`
- Window height, `wa` is `XWindowAttributes`.
- `imageheight`
- Image height, This is **not** the height of the image, it is the height
that the image will be scaled to fit.
- `imagewidth`
- Image width, This is **not** the width of the image, it is the width
that the image will be scaled to fit.
- `imagegaps`
- Image gaps, this is extra space added around the image.
- `imageh`
- Usually the same as `imageheight`. This is what `imageheight` is initially
set to.
- `imagew`
- Usually the same as `imagewidth`. This is what `imagewidth` is initially
set to.
- `imageg`
- Usually the same as `imagegaps`. This is what `imagegaps` is initially set to.
- `longestedge`
- As the name implies, it is the longest (highest value) of `imageheight` and `imagewidth`.
- `numberWidth`
- Integer set in some functions, it is simply `TEXTW(numbers)` if the match
count isn't hidden.
- `modeWidth`
- Integer set in some functions, it is simply `TEXTW(modetext)` if the mode
indicator isn't hidden.
- `larrowWidth`
- Integer set in some functions, it is simply `TEXTW(leftarrow)` if the left
arrow isn't hidden.
- `rarrowWidth`
- Integer set in some functions, it is simply `TEXTW(rightarrow)` if the right
arrow isn't hidden.
- `powerlinewidth`
- Integer set in some functions, it is simply `plw / 2` if powerlines are enabled.
- `curpos`
- Cursor/caret position. When text is added to the input, the width of that text
is added to this.
## Drawable abstraction functions
Most of these are in `libs/sl/draw.c` and `libs/sl/draw.h`.
- `drw_create(Display *dpy, int screen, Window win, unsigned int w,
unsigned int h, Visual *visual, unsigned int depth, Colormap cmap);`
- This function creates a drawable from `Display *dpy`, `Drw`. Think of
it as a canvas.
- `drw_resize(Drw *drw, unsigned int w, unsigned int h)`
- This function resizes the drawable to the dimensions passed as
arguments (`w`, `h`).
- `drw_free(Drw *drw);`
- This function will free the drawable from memory. It is *usually* called in
cleanup functions like `cleanup()` so most of the time you don't need to use this.
## Font abstraction functions
Most of these are in `libs/sl/draw.c` and `libs/sl/draw.h`.
NOTE: These will differ slightly depending on if Pango is enabled or not.
- `drw_font_create(Drw* drw, char *font[], size_t fontcount);`
- This function will return a font libXft can use.
- `drw_font_free(Fnt *set);`
- This function will free the font from memory.
- `drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n, Bool markup);`
- This function returns the smallest value out of the passed argument `n`
and the length of the text drawn. The text is not actually drawn though.
- `drw_font_getwidth(Drw *drw, const char *text, Bool markup);`
- This function returns the width of drawn text. The text is not actually
drawn though.
- `drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned
int *w, unsigned int *h, Bool markup);`
- This function returns the length of the text with the used font.
## Colorscheme abstraction functions
- `drw_clr_create(Drw *drw, Clr *dest, char *clrname, unsigned int alpha);`
- This function allocates space for a color.
- `drw_scm_create(Drw *drw, char *clrnames[], unsigned int alphas[],
size_t clrcount);`
- This function returns a color scheme from an array of colors and alpha.
## Cursor abstraction functions
- `drw_cur_create(Drw *drw, int shape);`
- This function creates and returns a cursor.
- `drw_cur_free(Drw *drw, Cur *cursor);`
- This function will free the cursor from memory.
## Drawable context functions
- `drw_setscheme(Drw *drw, Clr *scm);`
- Sets the color scheme to `*scm` created by `drw_scm_create()`
## Drawing functions
- `drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled
, int invert);`
- Draws a simple rectangle. Used in other functions to create more useful
shapes, such as a cursor.
- `drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned
int lpad, const char *text, int invert, Bool markup);`
- Draws text on the drawable using the font created. `const char *text`
contains the text itself.
## Map functions
- `drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);`
- Maps the drawable. (makes it visible)
## Removed functions
Various functions that have been removed for some reason.
- `drw_setfont(Drw *drw, Fnt *set);`
- Sets the font.
- NOTE: Applies only if Pango is disabled.

View file

@ -1,9 +0,0 @@
# [spmenu] How to use the buildconf
This wiki article describes how to use the buildconf. It's really simple, and there's not much to say.
If you cloned spmenu from the [git repository](https://git.speedie.gq/spmenu), you should already have a default buildconf. This same config is used to build the Arch/Gentoo packages.
# Toggle image support
If you want to enable/disable image support (and as such, the `imlib2` dependency), you may set `imlib2=true` or `imlib2=false` in the buildconf.

View file

@ -1,5 +0,0 @@
Useful articles:
- [[Home]]
- [[[spmenu] Code documentation]]
- [[[spmenu] How to use the buildconf]]

30
run.sh
View file

@ -1,30 +0,0 @@
#!/bin/sh
#
# crontab this to run every X minutes
# 5 * * * * /usr/bin/run.sh
die() { printf "%s\n" "$*"; exit 1; }
WIKINAME="wiki"
POST_DIR="$1"
[ -z "$1" ] && POST_DIR="/var/www/page/$WIKINAME/pages"
[ -e "$POST_DIR" ] || die "You must specify a VALID path. Edit $0."
cd "$POST_DIR" || die "Does not exist."
pwd
[ -e "/tmp/markdown-log" ] && mv /tmp/markdown-log /tmp/markdown-log-2
find ./*md > /tmp/markdown-log
[ -e "/tmp/markdown-log-2" ] || exit 0
[ -z "$(diff -up /tmp/markdown-log /tmp/markdown-log-2)" ] && exit 0
git add ./*.md
git commit -am "Add articles"
printf "%s - Added articles" "$(date)" > /tmp/markdown-crontab-log
exit 0

View file

@ -1,21 +0,0 @@
<VirtualHost *:80>
DocumentRoot %TRAVIS_BUILD_DIR%
<Directory "%TRAVIS_BUILD_DIR%/">
Options FollowSymLinks MultiViews ExecCGI
AllowOverride All
Require all granted
</Directory>
# Wire up Apache to use Travis CI's php-fpm.
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
</VirtualHost>