only structure
This commit is contained in:
parent
0692e8a0c5
commit
17143880e1
1923 changed files with 5 additions and 42772 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -3,3 +3,8 @@
|
|||
werc/etc/*
|
||||
scripts/commands.txt
|
||||
.env
|
||||
gossa/
|
||||
prosody/
|
||||
scripts/
|
||||
transfer/
|
||||
werc/
|
|
@ -1,10 +0,0 @@
|
|||
services:
|
||||
gossa:
|
||||
image: pldubouilh/gossa
|
||||
container_name: gossa
|
||||
ports:
|
||||
- 3001:8001
|
||||
volumes:
|
||||
- ../werc/sites/thirdculture.top/_files:/shared
|
||||
- ../werc/sites/ppl.thirdculture.top:/shared/people
|
||||
|
1
prosody
1
prosody
|
@ -1 +0,0 @@
|
|||
Subproject commit d882e119c7acedc0703d9ef18ee28c42f67cfb0b
|
|
@ -1,38 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
SUBDOMAINS=("thirdculture.top" "ppl.thirdculture.top" "files.thirdculture.top" "up.thirdculture.top"
|
||||
"events.thirdculture.top" "music.thirdculture.top" "social.thirdculture.top" "visual.thirdculture.top")
|
||||
HOSTS_FILE="/etc/hosts"
|
||||
|
||||
add_subdomains() {
|
||||
echo "Adding subdomains to /etc/hosts..."
|
||||
for SUBDOMAIN in "${SUBDOMAINS[@]}"; do
|
||||
if ! grep -q "$SUBDOMAIN" "$HOSTS_FILE"; then
|
||||
echo "127.0.0.1 $SUBDOMAIN" | sudo tee -a "$HOSTS_FILE" > /dev/null
|
||||
echo "Added $SUBDOMAIN to /etc/hosts"
|
||||
else
|
||||
echo "$SUBDOMAIN is already in /etc/hosts"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
remove_subdomains() {
|
||||
echo "Removing subdomains from /etc/hosts..."
|
||||
for SUBDOMAIN in "${SUBDOMAINS[@]}"; do
|
||||
sudo sed -i "/$SUBDOMAIN/d" "$HOSTS_FILE"
|
||||
echo "Removed $SUBDOMAIN from /etc/hosts"
|
||||
done
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
add)
|
||||
add_subdomains
|
||||
;;
|
||||
remove)
|
||||
remove_subdomains
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 {add|remove}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
|
@ -1,58 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Ensure the script is run with exactly two arguments
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "Usage: $0 <path> <name>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Define variables
|
||||
path="$1"
|
||||
name="$2"
|
||||
|
||||
# Create the folder structure
|
||||
mkdir -p "$path/$name/_werc" "$path/$name/blog/_werc"
|
||||
|
||||
# Create the first config file (not under blog)
|
||||
cat > "$path/$name/_werc/config" <<EOF
|
||||
conf_enable_wiki
|
||||
conf_enable_cssedit $name
|
||||
wiki_editors_groups=$name
|
||||
css_file='_werc/style.css'
|
||||
EOF
|
||||
|
||||
# Create the second config file (under blog)
|
||||
cat > "$path/$name/blog/_werc/config" <<EOF
|
||||
conf_enable_wiki
|
||||
conf_enable_blog
|
||||
conf_blog_only_pull=0
|
||||
conf_blog_editors=$name
|
||||
wiki_editors_groups=$name
|
||||
blogTitle=''
|
||||
blogDesc=''
|
||||
EOF
|
||||
|
||||
# Create the style.css file
|
||||
echo "/* Put custom styles here */" > "$path/$name/_werc/style.css"
|
||||
|
||||
# Update index.html
|
||||
index_file="$path/index.html"
|
||||
|
||||
if [ -f "$index_file" ]; then
|
||||
awk -v name="$name" '
|
||||
{
|
||||
print
|
||||
if ($0 ~ /<!-- BUTTONS -->/) {
|
||||
print " <div class=\"grid-item\">"
|
||||
print " <a href=\"/" name "/\"><img src=\"/_werc/pub/img/but/" name ".gif\" alt=\"" name "\" /></a>"
|
||||
print " </div>"
|
||||
print ""
|
||||
}
|
||||
}' "$index_file" > "${index_file}.tmp" && mv "${index_file}.tmp" "$index_file"
|
||||
echo "Updated index.html with new user entry"
|
||||
else
|
||||
echo "Warning: index.html not found at $index_file"
|
||||
fi
|
||||
|
||||
# Output a success message
|
||||
echo "Folder structure created successfully at $path/$name"
|
|
@ -1,35 +0,0 @@
|
|||
#!/bin/rc
|
||||
|
||||
# Check if the correct number of arguments are provided
|
||||
if (~ $#argv 2) {
|
||||
echo "Usage: $0 <path> <name>"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Assign arguments to variables
|
||||
path = $argv[1]
|
||||
name = $argv[2]
|
||||
|
||||
# Create the folder structure
|
||||
mkdir -p $path/$name/_werc
|
||||
mkdir -p $path/$name/blog/_werc
|
||||
|
||||
# Create the first config file (not under blog)
|
||||
echo "extraHeaders='<link rel=\"stylesheet\" type=\"text/css\" href=\"_werc/style.css\">'" > $path/$name/_werc/config
|
||||
echo "conf_enable_wiki" >> $path/$name/_werc/config
|
||||
echo "conf_enable_cssedit $name" >> $path/$name/_werc/config
|
||||
echo "css_file='_werc/style.css'" >> $path/$name/_werc/config
|
||||
echo "" >> $path/$name/_werc/config
|
||||
|
||||
# Create the second config file (under blog)
|
||||
echo "conf_enable_wiki" > $path/$name/blog/_werc/config
|
||||
echo "conf_enable_blog" >> $path/$name/blog/_werc/config
|
||||
echo "conf_blog_only_pull=0" >> $path/$name/blog/_werc/config
|
||||
echo "conf_blog_editors=$name" >> $path/$name/blog/_werc/config
|
||||
echo "" >> $path/$name/blog/_werc/config
|
||||
|
||||
# Create the style.css file
|
||||
touch $path/$name/_werc/style.css
|
||||
|
||||
# Output a success message
|
||||
echo "Folder structure created successfully at $path/$name"
|
|
@ -1,100 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
CONFIG_FILE="${CONFIG_FILE:-./.env/onboard.env}"
|
||||
if [ ! -f "$CONFIG_FILE" ]; then
|
||||
echo "Error: Configuration file not found at $CONFIG_FILE"
|
||||
echo "CONFIG_FILE unset or .env/onboard.env does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
source "$CONFIG_FILE"
|
||||
|
||||
usage() {
|
||||
cat << EOF
|
||||
Usage: $0 <username> <mkpasswd_hash> <htpasswd_hash>
|
||||
|
||||
Arguments:
|
||||
username The username for the new account
|
||||
mkpasswd_hash The hash generated by mkpasswd
|
||||
htpasswd_hash The hash generated by htpasswd
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
validate_input() {
|
||||
|
||||
[ $# -ne 3 ] && usage
|
||||
[[ ! "$2" =~ ^\$6\$ ]] && echo "Error: Invalid mkpasswd hash format" && exit 1
|
||||
[[ ! "$3" =~ ^\$apr1\$ ]] && echo "Error: Invalid htpasswd hash format" && exit 1
|
||||
|
||||
local required_vars=(
|
||||
"SSH_USER" "SSH_HOST" "CONTAINER_NAME" "DOMAIN" "SERVICES_URL"
|
||||
"USER_STRUCTURE_PATH" "WERC_PATH" "HTPASSWD_FILE"
|
||||
)
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [ -z "${!var}" ]; then
|
||||
echo "Error: Required variable $var is not set in $CONFIG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
[ ! -d "$USER_STRUCTURE_PATH" ] && echo "Error: User structure path does not exist: $USER_STRUCTURE_PATH" && exit 1
|
||||
[ ! -d "$WERC_PATH" ] && echo "Error: Werc path does not exist: $WERC_PATH" && exit 1
|
||||
|
||||
}
|
||||
|
||||
create_user_structure() {
|
||||
local username="$1"
|
||||
local mkpasswd_hash="$2"
|
||||
local user_path="$USER_STRUCTURE_PATH/$username"
|
||||
mkdir -p "$user_path"
|
||||
echo "$mkpasswd_hash" > "$user_path/password"
|
||||
echo "$username:$3" >> "$HTPASSWD_FILE"
|
||||
}
|
||||
|
||||
setup_werc_structure() {
|
||||
local username="$1"
|
||||
./add_person.sh "$WERC_PATH" "$username"
|
||||
}
|
||||
|
||||
generate_invite() {
|
||||
invite=$(ssh "$SSH_USER@$SSH_HOST" "docker exec $CONTAINER_NAME prosodyctl mod_invites generate $DOMAIN" | tail -n 1)
|
||||
[ -z "$invite" ] && echo "Error: Failed to generate invite" && exit 1
|
||||
}
|
||||
|
||||
main() {
|
||||
local username="$1"
|
||||
local mkpasswd_hash="$2"
|
||||
local htpasswd_hash="$3"
|
||||
|
||||
validate_input "$@"
|
||||
|
||||
echo "Setting up user structure..."
|
||||
create_user_structure "$username" "$mkpasswd_hash" "$htpasswd_hash"
|
||||
|
||||
echo "Setting up werc structure..."
|
||||
setup_werc_structure "$username"
|
||||
|
||||
echo "Generating invite..."
|
||||
generate_invite
|
||||
|
||||
cat << EOF
|
||||
User setup completed successfully!
|
||||
Username: $username
|
||||
Services URL: $SERVICES_URL
|
||||
Invite link: $invite
|
||||
|
||||
The following paths have been updated:
|
||||
- User structure: $USER_STRUCTURE_PATH/$username
|
||||
- Werc structure: $WERC_PATH/$username
|
||||
- Password file: $USER_STRUCTURE_PATH/$username/password
|
||||
- Updated .htpasswd at: $HTPASSWD_FILE
|
||||
|
||||
Next steps:
|
||||
1. Push changes to server
|
||||
2. Send the services URL and invite link to the user
|
||||
EOF
|
||||
}
|
||||
|
||||
main "$@"
|
1
transfer/.gitignore
vendored
1
transfer/.gitignore
vendored
|
@ -1 +0,0 @@
|
|||
keys/
|
|
@ -1,16 +0,0 @@
|
|||
services:
|
||||
transfer:
|
||||
image: dutchcoders/transfer.sh:latest
|
||||
container_name: transfer
|
||||
ports:
|
||||
- "3880:8080"
|
||||
- "3881:8081"
|
||||
command: ["--provider", "local", "--basedir", "/uploads/", "--web-path", "/web/", "--max-upload-size", "10485760", "--tls-listener", ":8081", "--tls-cert-file", "/fullchain.pem", "--tls-private-key", "/privkey.pem", "--tls-listener-only"]
|
||||
environment:
|
||||
- MAX_UPLOAD_SIZE=10485760
|
||||
volumes:
|
||||
- ./uploads:/uploads
|
||||
- ./tshweb:/web
|
||||
- ./keys/fullchain.pem:/fullchain.pem
|
||||
- ./keys/privkey.pem:/privkey.pem
|
||||
restart: always
|
|
@ -1,14 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="styles/main.css">
|
||||
</head>
|
||||
<body>
|
||||
<br/>
|
||||
<p style="color: red; text-align: center;">Content not found!</p>
|
||||
<p style="color: red; text-align: center;">404</p>
|
||||
</body>
|
||||
</html>
|
|
@ -1,31 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<br />
|
||||
<h2 class="page-title">{{.Filename}}</h2>
|
||||
<code>
|
||||
type: <b>{{.ContentType}}</b>
|
||||
size: <b>{{.ContentLength | format "#,###."}}</b> bytes
|
||||
</code>
|
||||
<br />
|
||||
<audio id="audio-player" class="preview-audio" controls preload="auto" data-setup='{}'>
|
||||
<source src="{{.URL}}" type="{{.ContentType}}">
|
||||
</source>
|
||||
</audio>
|
||||
<p class="dwn"><a href="{{.URLGet}}"> download</a></p>
|
||||
<div class="qrcode">
|
||||
<img src="data:image/png;base64,{{.QRCode}}" />
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,27 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<br />
|
||||
<h2 class="page-title">{{.Filename}}</h2>
|
||||
<code>
|
||||
type: <b>{{.ContentType}}</b>
|
||||
size: <b>{{.ContentLength | format "#,###."}}</b> bytes
|
||||
</code>
|
||||
<br />
|
||||
<p class="dwn"><a href="{{.URLGet}}"> download</a></p>
|
||||
<div class="qrcode">
|
||||
<img src="data:image/png;base64,{{.QRCode}}" />
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,27 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<br />
|
||||
<h2 class="page-title">{{.Filename}}</h2>
|
||||
<code>
|
||||
type: <b>{{.ContentType}}</b>
|
||||
size: <b>{{.ContentLength | format "#,###."}}</b> bytes
|
||||
</code>
|
||||
<br />
|
||||
<div class="preview-image"><img src="{{.URL}}" alt=""></div>
|
||||
<p class="dwn"><a href="{{.URLGet}}"> download</a></p>
|
||||
<div class="qrcode">
|
||||
<img src="data:image/png;base64,{{.QRCode}}" />
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,28 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<br />
|
||||
<h2 class="page-title">{{.Filename}}</h2>
|
||||
<code>
|
||||
type: <b>{{.ContentType}}</b>
|
||||
size: <b>{{.ContentLength | format "#,###."}}</b> bytes
|
||||
</code>
|
||||
<br />
|
||||
<div class="md-preview">{{.Content}}</div>
|
||||
<p class="dwn"><a href="{{.URLGet}}"> download</a></p>
|
||||
<div class="qrcode">
|
||||
<img src="data:image/png;base64,{{.QRCode}}" />
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,31 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<br />
|
||||
<h2 class="page-title">{{.Filename}}</h2>
|
||||
<code>
|
||||
type: <b>{{.ContentType}}</b>
|
||||
size: <b>{{.ContentLength | format "#,###."}}</b> bytes
|
||||
</code>
|
||||
<br />
|
||||
<video id="video-player" class="prev-video" controls preload="auto" data-setup='{}'>
|
||||
<source src="{{.URL}}" type="{{.ContentType}}">
|
||||
</source>
|
||||
</video>
|
||||
<p class="dwn"><a href="{{.URLGet}}"> download</a></p>
|
||||
<div class="qrcode">
|
||||
<img src="data:image/png;base64,{{.QRCode}}" />
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
Binary file not shown.
Before Width: | Height: | Size: 3.1 KiB |
|
@ -1,4 +0,0 @@
|
|||
<a href="{{.URLGet}}" class="btn-cta btn"> download</i> </a> <br/><br/>
|
||||
<div class="qrcode">
|
||||
<img src="data:image/png;base64,{{.QRCode}}"/>
|
||||
</div>
|
|
@ -1,4 +0,0 @@
|
|||
<br/>
|
||||
<h2 class="page-title">{{.Filename}}</h2>
|
||||
<h4>type: <b>{{.ContentType}}</b></h4>
|
||||
<h4>size: <b>{{.ContentLength | format "#,###."}}</b> bytes</h4>
|
|
@ -1,37 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1><span class="accent">Third Culture</span> Upload</h1>
|
||||
<form action="https://up.thirdculture.top" method="POST" enctype="multipart/form-data">
|
||||
<label for="fileInput">Choose file:</label>
|
||||
<input type="file" name="file" id="fileInput" required />
|
||||
<br><br>
|
||||
<button type="submit">Upload</button>
|
||||
</form>
|
||||
<p><br></p>
|
||||
<p>Make sure to copy the link in the next page!</p>
|
||||
<p>More info on third culture upload <a href="scripts/info.html">here</a>.</p>
|
||||
<p><br></p>
|
||||
<svg version="1.1" style="fill:none;width:75px;height:75px;" width="50" height="50" viewBox="0 0 50 50" id="svg3" sodipodi:docname="logo.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs id="defs3" />
|
||||
<path style="fill:#000000;stroke:#000000;stroke-width:1.51515px;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="m 0.75757498,49.242423 v 0 V 0.75757498 H 49.242425 V 49.242423 Z" id="path1" />
|
||||
<path style="fill:none;stroke:#a4d1ad;stroke-width:1.51515px;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="m 20.454546,38.636362 v 0 l 9.090908,-9.090909 m -9.090908,0 v 0 l 9.090908,9.090909" id="path2" />
|
||||
<path style="fill:none;stroke:#aea3f0;stroke-width:4.24243px;stroke-linecap:round;stroke-linejoin:round"
|
||||
d="m 6.8181812,40.151514 v 0 L 25,9.8484837 43.181819,40.151514" id="path3" />
|
||||
</svg>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,16 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Third Culture Upload</title>
|
||||
<link rel="stylesheet" href="../styles/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>up.thirdculture.top info</h1>
|
||||
<p>Third culture upload supports uploading through the browser but also using the terminal as well you can find more details on the <a href="https://github.com/dutchcoders/transfer.sh">transfer.sh github</a>. I will include some simple examples here for quick reference.</p>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -1,99 +0,0 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #121212;
|
||||
color: #e0e0e0;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #9b4d96;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.preview-image {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.preview-image img {
|
||||
max-width: 600px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
text-align: center;
|
||||
color: #9b4d96;
|
||||
}
|
||||
|
||||
.accent {
|
||||
color: #7bbc7f;
|
||||
}
|
||||
|
||||
form {
|
||||
background-color: #1e1e1e;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
width: 300px;
|
||||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
label {
|
||||
font-size: 16px;
|
||||
color: #ddd;
|
||||
margin-bottom: 10px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
input[type="file"] {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
margin: 10px 0;
|
||||
border: 2px solid #9b4d96;
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
input[type="file"]:hover {
|
||||
border-color: #be2b90;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: #9b4d96;
|
||||
color: #fff;
|
||||
padding: 12px;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
width: 100%;
|
||||
font-size: 16px;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s ease;
|
||||
}
|
||||
|
||||
.dwn {
|
||||
text-align: center;
|
||||
margin-top: 5px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #be2b90;
|
||||
}
|
||||
|
||||
button:active {
|
||||
background-color: #9b4d96;
|
||||
}
|
||||
|
||||
.qrcode {
|
||||
text-align: center;
|
||||
}
|
79
werc/README
79
werc/README
|
@ -1,79 +0,0 @@
|
|||
werc - a minimalist document management system
|
||||
----------------------------------------------
|
||||
|
||||
Werc is a content management system and web (anti-)framework designed to be simple to
|
||||
use, simple to setup, simple to hack on, and not get in the way while allowing
|
||||
users easy customization.
|
||||
|
||||
For more information see the official website: http://werc.cat-v.org/
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Requirements:
|
||||
|
||||
* An http server that can handle CGIs
|
||||
* Plan 9 from User Space: http://swtch.com/plan9port,
|
||||
Or 9base-tip: http://tools.suckless.org/9base,
|
||||
Or frontbase: http://openbsd.stanleylieber.com/frontbase
|
||||
|
||||
Note: Werc by default expects the Plan 9 tools to be installed under
|
||||
/bin/, if you have installed them elsewhere you will need to edit the
|
||||
#! line in bin/werc.rc and customize the $plan9port variable in your
|
||||
etc/initrc.local.
|
||||
|
||||
|
||||
Instructions:
|
||||
|
||||
Untar werc at your desired location, configure httpd to use
|
||||
/path-to-your-werc-installation/bin/werc.rc as a cgi-script, it is recommended
|
||||
that you make werc.rc handle all non-static files (this can be done by setting
|
||||
it up as your 404 handler) and setup your virtual hosts to handle static files
|
||||
by setting the document root for the domain to
|
||||
/path-to-werc-installation/sites/yourdomain.com/, and create a directory for
|
||||
your web site under sites/ where you can start adding content right away.
|
||||
|
||||
If you will want to allow updates via the web interface (eg., for wiki or
|
||||
comments apps) make sure all files under sites/ are writable by the user your
|
||||
cgi will run as, usually www-data, for example by doing: chown -R :www-data
|
||||
sites/; chmod -R g+w sites/
|
||||
|
||||
If your Plan 9 binaries are located somewhere else than the standard /bin/ you
|
||||
will need to edit the first line of bin/werc.rc (Note that p9p in particular is
|
||||
picky about where it is located, once you run ./INSTALL you should *not* move
|
||||
it to a different directory without running ./INSTALL again.)
|
||||
|
||||
For general configuration options copy etc/initrc to etc/initrc.local and
|
||||
customize it as needed. Site (and directory) specific options can be set in a
|
||||
sites/example.com/_werc/config file inside the site's directory. To customize
|
||||
templates and included files you can store your own version of the files in
|
||||
lib/ under sites/example.com/_werc/lib.
|
||||
|
||||
The source tree for the werc website is included under sites/werc.cat-v.org as
|
||||
an example, feel free to use it as a template for your own site.
|
||||
|
||||
For more details see the documentation section of the website:
|
||||
http://werc.cat-v.org/docs/
|
||||
|
||||
|
||||
Contact
|
||||
-------
|
||||
|
||||
For comments, suggestions, bug reports or patches join the werc mailing list
|
||||
at: http://werc.cat-v.org or the irc channel #cat-v in irc.freenode.org
|
||||
|
||||
If you have a public website that uses werc I would love to hear about it and
|
||||
get feedback about you experience setting it up.
|
||||
|
||||
Thanks
|
||||
------
|
||||
|
||||
Garbeam, Kris Maglione, sqweek, soul9, mycroftiv, maht, yiyus, cinap_lenrek,
|
||||
khm and many others for their ideas, patches, testing and other contributions.
|
||||
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Werc is in the public domain.
|
|
@ -1,6 +0,0 @@
|
|||
repo: 77501160f26f7411d00111255a38267f9973ec27
|
||||
node: e422b2d51d185ecbbdb180a28fdd13cac672be03
|
||||
branch: default
|
||||
latesttag: null
|
||||
latesttagdistance: 25
|
||||
changessincelatesttag: 25
|
|
@ -1,158 +0,0 @@
|
|||
BARF - emit HTML
|
||||
|
||||
DESCRIPTION
|
||||
BARF utilizes rc(1) and command line tools to compile a structured
|
||||
directory of files into a single page of HTML. Tagging and RSS 2.0
|
||||
feeds have been implemented.
|
||||
|
||||
SETUP
|
||||
To enable BARF, add:
|
||||
|
||||
conf_enable_barf
|
||||
|
||||
to _werc/config under the site root.
|
||||
|
||||
To configure BARF, copy or create the following files under the site
|
||||
root (example files have been included in this distribution):
|
||||
|
||||
_werc/barf/config
|
||||
A list of variables that control various site options:
|
||||
|
||||
barf_type=paste # blog, image, log, paste
|
||||
posts_per_page=10
|
||||
show_ascending=0
|
||||
show_footer=0
|
||||
show_header=0
|
||||
show_sidebar=0
|
||||
require_login=0 # if not logged in, redirect to /login
|
||||
allow_anon=1 # allow posts without logging in
|
||||
show_disqus=0 # include disqus comments template
|
||||
# from _werc/barf/disqus
|
||||
|
||||
_werc/barf/footer
|
||||
HTML or markdown that will appear as the foot of
|
||||
the BARF content area.
|
||||
|
||||
_werc/barf/header
|
||||
HTML or markdown that will appear at the head of
|
||||
the BARF content area.
|
||||
|
||||
_werc/barf/sidebar
|
||||
HTML or markdown that will appear on one side of
|
||||
the BARF content area.
|
||||
|
||||
Finally, sample stylesheets are provided in the directory
|
||||
pub/. Copy any of these to _werc/pub/style.css to try
|
||||
them out.
|
||||
|
||||
POSTS
|
||||
Posts are stored in the directory src/ relative to the
|
||||
site root.
|
||||
|
||||
Directory names in src/ that do not match the regular
|
||||
expression ^[0-9]*$ will not be included in the listing of
|
||||
posts that are displayed in the browser. However, such
|
||||
directories are still accessible when called directly via
|
||||
an appropriately constructed URL.
|
||||
|
||||
A post's directory contains the following files and
|
||||
directories (an example post's directory has been
|
||||
included in this distribution):
|
||||
|
||||
body
|
||||
date
|
||||
img/
|
||||
link
|
||||
tags/
|
||||
title
|
||||
|
||||
The img/ directory contains images uploaded to the
|
||||
image board, including the original image and a
|
||||
thumbnail version, resized to no greater than 500
|
||||
pixels wide and 600 pixels tall.
|
||||
|
||||
The tags/ directory contains one empty file named
|
||||
for each tag associated with the post.
|
||||
|
||||
The site root contains a file named tags that is compr-
|
||||
ised of an index of the tags associated with each post.
|
||||
This index is consulted when searching for a given tag in
|
||||
the web browser.
|
||||
|
||||
UTILS
|
||||
bin/gf
|
||||
Parse Livejournal and Tumblr RSS feeds into
|
||||
BARF posts. (Abandoned, may no longer work.)
|
||||
bin/gk
|
||||
Create a list of known tags in the site root in
|
||||
a file named known_tags.
|
||||
bin/gr
|
||||
Parse Google Reader bundles into BARF posts.
|
||||
bin/gt
|
||||
Create an index of tags in the site root in a file
|
||||
named tags.
|
||||
|
||||
For more information on these tools, read the source.
|
||||
|
||||
ADMIN
|
||||
Any tool that can create, alter, or delete flat files
|
||||
and directories is sufficient to administer a BARF.
|
||||
|
||||
Web-based login and administration utilizes werc's
|
||||
built-in user authentication:
|
||||
|
||||
http://domain.com/login
|
||||
|
||||
After login, links to edit and delete will appear in
|
||||
each post's meta data.
|
||||
|
||||
Web-based administration requires that the src/
|
||||
directory and its sub-directories are writable by
|
||||
the web server process.
|
||||
|
||||
REQUIREMENTS
|
||||
Unix
|
||||
Plan9port or 9base are required. Site type
|
||||
image requires ImageMagick and curl. Site
|
||||
type url also requires curl if the user employs
|
||||
the option to download remote URLs. These
|
||||
utilities may be swapped out for others by
|
||||
altering the source.
|
||||
|
||||
SOURCE
|
||||
http://plan9.stanleylieber.com/werc/apps/barf.tgz
|
||||
https://code.9front.org/hg/barf
|
||||
|
||||
EXAMPLES
|
||||
blog
|
||||
http://read.stanleylieber.com
|
||||
RSS feeds are converted by the utility rrss[0]
|
||||
and stored as individual blog posts.
|
||||
image
|
||||
http://img.stanleylieber.com
|
||||
Hybrid public/private image board. Requires
|
||||
standard werc authentication to post, but all
|
||||
posts are visible to the public.
|
||||
paste
|
||||
http://okturing.com
|
||||
Public pastebin. No authentication required
|
||||
to post.
|
||||
url
|
||||
http://url.stanleylieber.com
|
||||
Private index of URL bookmarks, similar
|
||||
in functionality to the old delicious.com.
|
||||
(In fact, most of the index was imported
|
||||
from delicious.)
|
||||
|
||||
SEE ALSO
|
||||
[0] https://code.9front.org/hg/rrss
|
||||
|
||||
LICENSE
|
||||
Public domain.
|
||||
|
||||
BUGS
|
||||
On Plan 9, if the web server process is run as user
|
||||
none (typically the case), directories used for entering
|
||||
posts or uploading/downloading files from the browser
|
||||
must be set world writable. This could prove problematic
|
||||
on multiuser systems.
|
|
@ -1,80 +0,0 @@
|
|||
fn conf_enable_barf{
|
||||
barf_base_uri=$conf_wd
|
||||
barf_root=`{pwd}
|
||||
conf_enable_app barf
|
||||
}
|
||||
|
||||
fn barf_init{
|
||||
p=`{echo $req_path | sed 's!^'^$barf_base_uri^'!!'}
|
||||
barf_dir=`{basename -d $"p | sed 's!^\.$!!'}
|
||||
barf_items=`{cat $barf_root/_werc/barf/items}
|
||||
. ./apps/barf/lib/core
|
||||
. ./apps/barf/barf/config
|
||||
. $barf_root/_werc/barf/config
|
||||
. ./apps/barf/lib/$barf_type
|
||||
if(test -f $barf_root/_werc/barf/lib/$barf_type)
|
||||
. $barf_root/_werc/barf/lib/$barf_type
|
||||
if(~ $require_login 1 && ! ~ $req_path $barf_base_uri^login){
|
||||
check_user
|
||||
if(~ $#logged_user 0)
|
||||
post_redirect /login
|
||||
}
|
||||
if(~ $REQUEST_METHOD GET && ~ $REQUEST_URI *'='*){
|
||||
load_get_args
|
||||
parse_get_args
|
||||
}
|
||||
if(~ $REQUEST_METHOD POST)
|
||||
parse_post_args
|
||||
if(~ $a_func add_post){
|
||||
if(~ $allow_anon 1 || {check_user && ! ~ $#logged_user 0})
|
||||
add_post
|
||||
post_redirect /
|
||||
}
|
||||
if(~ $a_func edit_post delete_post dsrc){
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
switch($a_func){
|
||||
case edit_post
|
||||
edit_post
|
||||
case delete_post
|
||||
delete_post
|
||||
case dsrc
|
||||
dsrc
|
||||
}
|
||||
}
|
||||
}
|
||||
get_start
|
||||
get_stop
|
||||
get_tags
|
||||
if(~ $req_path $barf_base_uri){
|
||||
extraHeaders=$"extraHeaders ^ \
|
||||
'<link rel="alternate" type="application/rss+xml" title="RSS" href="'$base_url^$barf_base_uri'index.rss" />'
|
||||
handler_body_main=(tpl_handler `{barf_template barf})
|
||||
}
|
||||
if not if(~ $req_path $barf_base_uri^index.rss){
|
||||
obarf_type=$barf_type # disgusting hack. fix!
|
||||
barf_type=rss
|
||||
. ./apps/barf/lib/rss
|
||||
barf_setup_feed_handlers barf.tpl 'text/xml; charset=utf-8'
|
||||
}
|
||||
if not if(~ $req_path $barf_base_uri^login){
|
||||
barf_type=login
|
||||
handler_body_main=(tpl_handler `{barf_template barf})
|
||||
}
|
||||
}
|
||||
|
||||
fn barf_setup_feed_handlers{
|
||||
handler_body_main=NOT_USED_by_barf_feeds
|
||||
res_tail=()
|
||||
http_content_type=$2
|
||||
headers=()
|
||||
master_template=apps/barf/lib/$1
|
||||
}
|
||||
|
||||
fn barf_template{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/lib/$1.tpl)
|
||||
echo -n $barf_root/$"barf_dir/_werc/barf/lib/$1.tpl
|
||||
if not if(test -f $barf_root/_werc/barf/lib/$1.tpl)
|
||||
echo -n $barf_root/_werc/barf/lib/$1.tpl
|
||||
if not
|
||||
get_lib_file barf/$1.tpl apps/barf/lib/$1.tpl
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
barf_type=blog # blog, image, log, paste, url
|
||||
site_tmp=_tmp # used by hoc on plan 9
|
||||
posts_per_page=10
|
||||
show_ascending=0
|
||||
show_footer=0
|
||||
show_header=0
|
||||
show_sidebar=0
|
||||
require_login=0 # if not logged in, redirect to /login
|
||||
allow_anon=1 # allow posts without logging in
|
|
@ -1 +0,0 @@
|
|||
THIS IS THE FOOTER.
|
|
@ -1 +0,0 @@
|
|||
THIS IS THE HEADER.
|
|
@ -1 +0,0 @@
|
|||
THIS IS THE SIDEBAR.
|
|
@ -1,174 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Build static pages for $site.
|
||||
rfork e
|
||||
fn usage{
|
||||
echo usage: $0 [ domain.com ] >[1=2]
|
||||
exit usage
|
||||
}
|
||||
if(~ $#1 0)
|
||||
usage
|
||||
|
||||
fn conf_enable_barf{ }
|
||||
|
||||
werc=/var/www/werc
|
||||
site=$werc/sites/$1
|
||||
barf_root=$site
|
||||
|
||||
. $site/_werc/config
|
||||
. $site/_werc/barf/config
|
||||
. $werc/apps/barf/lib/core
|
||||
. $werc/apps/barf/lib/$barf_type
|
||||
if(test -f $site/_werc/barf/lib/$barf_type)
|
||||
. $site/_werc/barf/lib/$barf_type
|
||||
if(~ $show_ascending 1)
|
||||
sort=(sort -nu)
|
||||
if not
|
||||
sort=(sort -nru)
|
||||
|
||||
fn check_user{ }
|
||||
|
||||
fn display_html_footers{
|
||||
echo '</body>
|
||||
</html>'
|
||||
}
|
||||
|
||||
fn display_html_headers{
|
||||
echo '<html>
|
||||
<head>
|
||||
|
||||
<title>'$"siteTitle'</title>
|
||||
|
||||
<link rel="stylesheet" href="/_werc/pub/style.css" type="text/css" media="screen" title="default">
|
||||
<link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon">
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="'$"rss'">
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
|
||||
</head>
|
||||
<body>
|
||||
'
|
||||
}
|
||||
|
||||
fn display_prevnext{
|
||||
if(~ $#nstart 1){
|
||||
echo '
|
||||
<div id="page_list">
|
||||
<span>
|
||||
'
|
||||
if(test $start -lt $pstop && ! ~ $start $pstart)
|
||||
echo '<a href="'$pstart^'-'^$pstop^'.html">prev</a> | '
|
||||
echo '</span>
|
||||
<span>
|
||||
'
|
||||
if(test $nstart -gt $bposts($#bposts))
|
||||
echo '<a href="'$nstart^'-'^$nstop^'.html">next</a>'
|
||||
echo '
|
||||
</span>
|
||||
</div>
|
||||
'
|
||||
}
|
||||
}
|
||||
|
||||
fn get_post_list{
|
||||
if(~ $#posts 0){
|
||||
if(~ $id [0-9]*)
|
||||
posts=$id
|
||||
if not{
|
||||
posts=`{
|
||||
if(~ $tags all)
|
||||
ls -p $site/src |
|
||||
grep -e '^[0-9]*$' |
|
||||
eval $sort |
|
||||
sed -n $start^,^$stop^p
|
||||
if not
|
||||
grep -e '^.*\/'$tags'$' $site/tags |
|
||||
awk -F '/' '{print $1;}' |
|
||||
eval $sort |
|
||||
sed -n $start^,^$stop^p
|
||||
}
|
||||
if(! ~ $posts [0-9]*)
|
||||
posts=()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn print{
|
||||
display_html_headers
|
||||
if(~ $show_header 1)
|
||||
display_header
|
||||
display_^$barf_type
|
||||
if(~ $show_sidebar 1)
|
||||
display_sidebar
|
||||
if(~ $show_footer 1)
|
||||
display_footer
|
||||
display_html_footers
|
||||
}
|
||||
|
||||
fn print_id{
|
||||
echo '<span id="post_id"><a href="'$"a_id'.html">No.'$"a_id'</a></span>'
|
||||
}
|
||||
|
||||
fn print_tags{
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
a_tags=`{for(t in $a_tags) echo '<a href="/tag/'$t'">'$t'</a>, '}
|
||||
a_tags=`{echo $a_tags | awk '{print substr($0, 1, length($0) -1)}'}
|
||||
echo '<span id="post_tags">'$"a_tags'</span>'
|
||||
}
|
||||
|
||||
fn print_title{
|
||||
a_title=`{cat $a_dir/title}
|
||||
if(! ~ $#a_title 0){
|
||||
if(~ $barf_type log url)
|
||||
echo '<a href="'`{cat $a_dir/link}'">'$"a_title'</a>'
|
||||
if not
|
||||
echo '<a href="'$"a_id'.html">'$"a_title'</a>'
|
||||
}
|
||||
}
|
||||
|
||||
cd $site
|
||||
|
||||
# individual posts
|
||||
bposts=`{ls -p $site/src | grep -v private | grep -e '^[0-9]*$' | eval $sort}
|
||||
for(b in $bposts){
|
||||
id=$b posts=() print >$b.html
|
||||
echo $"b^'.html' >[1=2]
|
||||
}
|
||||
|
||||
# paginated posts
|
||||
start=$bposts(1)
|
||||
stop=`{echo $bposts(1)^-^$posts_per_page | bc}
|
||||
pstart=$start
|
||||
pstop=$stop
|
||||
while(test $start -ge $bposts($#bposts)){
|
||||
if(test $stop -lt $bposts($#bposts))
|
||||
stop=$bposts($#bposts)
|
||||
nstart=`{echo $stop^-^1 | bc}
|
||||
nstop=`{echo $stop^-^$posts_per_page^-1 | bc}
|
||||
pposts=`{
|
||||
for(i in `{seq $stop $start | eval $sort})
|
||||
if(test -d $site/src/$i)
|
||||
echo $i
|
||||
}
|
||||
tags=all posts=$pposts print >$start^-^$stop.html
|
||||
echo $"start^'-'^$"stop^'.html' >[1=2]
|
||||
pstart=$start
|
||||
pstop=$stop
|
||||
start=`{echo $stop^-1 | bc}
|
||||
stop=`{echo $start^-^$posts_per_page | bc}
|
||||
}
|
||||
cp `{ls [0-9]*-[0-9]*.html | sort -n | tail -1} index.html
|
||||
if(test -x /boot/factotum)
|
||||
chmod +t [0-9]*.html [0-9]*-[0-9]*.html index.html
|
||||
|
||||
# tags
|
||||
for(b in `{awk -F '/' '{print $3;}' tags | sort -u}){
|
||||
btags=$b
|
||||
mkdir -p tag/$btags
|
||||
bposts=`{grep -e '^.*\/'$btags'$' tags | awk -F '/' '{print $1;}' | eval $sort}
|
||||
start=$bposts(1)
|
||||
stop=$bposts($#bposts)
|
||||
tags=all posts=$bposts print >tag/$btags/index.html
|
||||
echo tag/$btags/index.html >[1=2]
|
||||
if(test -x /boot/factotum)
|
||||
chmod +t tag tag/$btags tag/$btags/index.html
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
#!/bin/rc
|
||||
# 2016-05-01T18:47:42-0400
|
||||
# Delete posts $low through $high.
|
||||
rfork e
|
||||
dhost=ur.inri.net
|
||||
fn usage {
|
||||
echo usage: dsrc [ -r n ] [ -t n ] >[1=2]
|
||||
exit usage
|
||||
}
|
||||
switch($1){
|
||||
case -r
|
||||
site=/usr/sl/www/werc/sites/read.stanleylieber.com
|
||||
case -t
|
||||
site=/usr/sl/www/werc/sites/tumblr.stanleylieber.com
|
||||
case *
|
||||
usage
|
||||
}
|
||||
if(! ~ $sysname ur){
|
||||
rcpu -h $dhost -c dsrc $*
|
||||
exit
|
||||
}
|
||||
low=`{ls -p $site/src | sort -n | sed 1q}
|
||||
high=$2
|
||||
cd $site/src && rm -rf `{seq $low $high}
|
||||
{
|
||||
for(i in `{seq $low $high})
|
||||
echo ',x/^'$i'\/.*\n/d'
|
||||
echo w
|
||||
echo w
|
||||
echo q
|
||||
} | sam -d $site/tags >[2]/dev/null
|
|
@ -1,426 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Parse RSS feeds from livejournal or tumblr into BARF blog posts
|
||||
# for the specified site. If a post with a matching <link> already
|
||||
# exists, no new post will be created for that <item>. Accordingly,
|
||||
# the gf script may run slowly for sites with a large number of
|
||||
# existing posts. Tags will be created from each <category>.
|
||||
rfork en
|
||||
switch($1){
|
||||
case 1oct1993_lj
|
||||
feed=http://feeds.feedburner.com/Sl/1oct1993
|
||||
site=1oct1993.com
|
||||
tags=(rss)
|
||||
case architecture
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6e361b590b57934fb1e7c4e29339d619&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(architecture)
|
||||
case comics
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6bc617a6b20aafd526affafc9a28a5d5&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(comics)
|
||||
case fg_lj
|
||||
feed=http://feeds.feedburner.com/Sl/flamesgif
|
||||
site=flamesgif.com
|
||||
tags=(rss livejournal)
|
||||
case inri_lj
|
||||
feed=http://feeds.feedburner.com/Sl/itrecords
|
||||
site=inri.net
|
||||
tags=(rss livejournal)
|
||||
case mf_lj
|
||||
feed=http://feeds.feedburner.com/Sl/massivefictions
|
||||
site=massivefictions.com
|
||||
tags=(rss livejournal)
|
||||
case other_lj
|
||||
feed=http://feeds.feedburner.com/SL/other
|
||||
site=other.stanleylieber.com
|
||||
tags=()
|
||||
case read
|
||||
#feed=http://feeds.feedburner.com/SL/g/friends
|
||||
#feed='http://pipes.yahoo.com/pipes/pipe.run?_id=f5d60acfd41497310d74900270192600&_render=rss'
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=d1f7146306b019d96d768facf95eebd9&_render=rss'
|
||||
site=test.stanleylieber.com
|
||||
tags=()
|
||||
case sl_lj
|
||||
feed=http://feeds.feedburner.com/ImNotReallyStanleyLieber
|
||||
site=stanleylieber.com
|
||||
tags=(rss livejournal)
|
||||
case sl_tumblr
|
||||
feed=http://stanleylieber.tumblr.com/rss
|
||||
site=stanleylieber.com
|
||||
tags=(rss tumblr)
|
||||
case ta_lj
|
||||
feed=http://feeds.feedburner.com/Sl/text_adventure
|
||||
site=textadventure.stanleylieber.com
|
||||
tags=(rss livejournal)
|
||||
case tech
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6dd49be6e34a6871db9bcfc74d4b36b1&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(tech)
|
||||
case *
|
||||
echo 'Usage: gf [ ... ]' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gf.$1
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn get_feed{
|
||||
$"cmd $feed >$file.work
|
||||
{
|
||||
echo '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
,s/\n//g
|
||||
,s/<\/item>/\n<\/item>\n/g
|
||||
,s/^<item>/<item>\n/g
|
||||
,s/^[ ]*<guid/<guid/g
|
||||
,s/^<[\/i].*$//g
|
||||
,s/^[ ]*\n[ ]*$//g
|
||||
x/<description>.*<\/description>/ s/\n//g
|
||||
w
|
||||
q
|
||||
'
|
||||
echo
|
||||
} | sam -d $file.work >[2]/dev/null >[1=2]
|
||||
awk '/(^<item>|<guid|<link>|<pubDate>|<title>|<description>|<comments>|<category>|<\/item>)/ {print $0;}' $file.work >$file
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
switch($a_link){
|
||||
case *1oct1993*
|
||||
tags=($tags 1oct1993)
|
||||
case *9front*
|
||||
tags=($tags software plan9 9front)
|
||||
case *amyearles* *pushedunder* *seaglass* *woolandwater*
|
||||
tags=($tags amy_earles)
|
||||
case *animenewsnetwork*
|
||||
tags=($tags telescreen anime)
|
||||
case *spikejapan*
|
||||
tags=($tags japan comics manga telescreen anime)
|
||||
case *ArchDaily* *archdaily*
|
||||
tags=($tags archdaily architecture)
|
||||
case *bldgblog*
|
||||
tags=($tags bldgblog architecture)
|
||||
case *kazuyosejima*
|
||||
tags=($tags japan architecture)
|
||||
case *Minimalissimo*
|
||||
tags=($tags minimalissimo design architecture)
|
||||
case *ArtFagCity* *artfagcity*
|
||||
tags=($tags artfagcity art)
|
||||
case *rhizome-fp*
|
||||
tags=($tags rhizome-fp art)
|
||||
case *rhizome*
|
||||
tags=($tags rhizome art)
|
||||
case *starwarsmodern*
|
||||
tags=($tags starwarsmodern art)
|
||||
case *tokyoartbeat*
|
||||
tags=($tags tokyoartbeat japan art)
|
||||
case *trendbeheer*
|
||||
tags=($tags trendbeheer art)
|
||||
case *ValentinaTanni*
|
||||
tags=($tags valentinatanni art)
|
||||
case *vvork*
|
||||
tags=($tags vwork art)
|
||||
case *auriea* *tale-of-tales* *taleoftales*
|
||||
tags=($tags auriea)
|
||||
case *basscomm* *closeoutwarrior* *crummysocks* *gamerrelocationproject* *protipoftheday* *PushButtonB* *pushbuttonb*
|
||||
tags=($tags video_games basscomm)
|
||||
case *benjaminmarra*
|
||||
tags=($tags comics benjamin_marra)
|
||||
case *boingboing*
|
||||
tags=($tags boingboing)
|
||||
case *bushinbooks* *henka*
|
||||
tags=($tags budo)
|
||||
case *alexaanddave* *CEREBUS* *Cerebus* *cerebus* *davesim* *gerhard*
|
||||
tags=($tags comics cerebus gerhard)
|
||||
case *coilhouse*
|
||||
tags=($tags coilhouse)
|
||||
case *arche-arc*
|
||||
tags=($tags arche comics)
|
||||
case *blaiselarmee*
|
||||
tags=($tags blaise_larmee comics)
|
||||
case *bleedingcool*
|
||||
tags=($tags bleedingcool comics)
|
||||
case *bobgreenberger*
|
||||
tags=($tags bob_greengerger comics)
|
||||
case *coldheatcomics*
|
||||
tags=($tags coldheat comics)
|
||||
case *comicbookresources*
|
||||
tags=($tags cbr comics)
|
||||
case *comicsbeat*
|
||||
tags=($tags comicsbeat comics)
|
||||
case *ComicsComics* *comicscomics*
|
||||
tags=($tags comicscomics comics)
|
||||
case *coveredblog*
|
||||
tags=($tags coveredblog comics)
|
||||
case *dcfifty-too*
|
||||
tags=($tags dcfifty-too comics)
|
||||
case *Destructoid* *destructoid*
|
||||
tags=($tags destructoid video_games)
|
||||
case *economist.com*
|
||||
tags=($tags economist)
|
||||
case *ferrandelgado*
|
||||
tags=($tags ferran_delgado comics)
|
||||
case *eddiecampbell*
|
||||
tags=($tags eddie_campbell comics)
|
||||
case *factualopinion*
|
||||
tags=($tags factualopinion comics)
|
||||
case *floating_world* *floatingworld*
|
||||
tags=($tags floating_world comics)
|
||||
case *frankmiller*
|
||||
tags=($tags frank_miller comics)
|
||||
case *humancolor*
|
||||
tags=($tags humancolor comics)
|
||||
case *jerkcity*
|
||||
tags=($tags jerkcity comics)
|
||||
case *newconstructionblog*
|
||||
tags=($tags newconstruction manga comics)
|
||||
case *ohdannyboy*
|
||||
tags=($tags ohdannyboy comics)
|
||||
case *pulphope*
|
||||
tags=($tags pulphope comics)
|
||||
case *pwbeat*
|
||||
tags=($tags pwbeat comics)
|
||||
case *reliablecomics*
|
||||
tags=($tags reliablecomics comics)
|
||||
case *reneefrench*
|
||||
tags=($tags renee_french comics)
|
||||
case *rickveitch*
|
||||
tags=($tags rick_veitch comics)
|
||||
case *smbc-comics*
|
||||
tags=($tags smbc comics)
|
||||
case *studygroup*
|
||||
tags=($tags studygroup comics)
|
||||
case *xkcd*
|
||||
tags=($tags xkcd comics)
|
||||
case *bowiesongs* *DavidBowie* *davidbowie*
|
||||
tags=($tags music david_bowie)
|
||||
case *designboom*
|
||||
tags=($tags designboom design)
|
||||
case *dezeen*
|
||||
tags=($tags dezeen design)
|
||||
case *infosthetics*
|
||||
tags=($tags infosthetics design)
|
||||
case *inhabitat*
|
||||
tags=($tags inhabitat architecture design)
|
||||
case *luigicolani*
|
||||
tags=($tags luigicolani design)
|
||||
case *mocoloco*
|
||||
tags=($tags mocoloco design)
|
||||
case *sydmead*
|
||||
tags=($tags sydmead design)
|
||||
case *dzima*
|
||||
tags=($tags dzima)
|
||||
case *bbcicecream*
|
||||
tags=($tags bbcicecream fashion)
|
||||
case *DamStyle *damstyle*
|
||||
tags=($tags damstyle fashion)
|
||||
case *facehunter*
|
||||
tags=($tags facehunter fashion)
|
||||
case *StilInBerlin*
|
||||
tags=($tags germany fashion)
|
||||
case *jstreets*
|
||||
tags=($tags jstreets japan fashion)
|
||||
case *stylefromtokyo*
|
||||
tags=($tags stylefromtokyo japan fashion)
|
||||
case *tokyofashion*
|
||||
tags=($tags tokyofashion japan fashion)
|
||||
case *flames.gif* *flamesgif*
|
||||
tags=($tags flames.gif)
|
||||
case *contemporary-home-computing*
|
||||
tags=($tags software flames.gif)
|
||||
case *kurzweil*
|
||||
tags=($tags kurzweil future)
|
||||
case *longnow*
|
||||
tags=($tags longnow future)
|
||||
case *OpenTheFuture*
|
||||
tags=($tags openthefuture future)
|
||||
case *golang* *blog.nella.org*
|
||||
tags=($tags golang)
|
||||
case *googlepluses*
|
||||
tags=($tags google)
|
||||
case *news.ycombinator.com*
|
||||
tags=($tags hackernews hack)
|
||||
case *seanbonner*
|
||||
tags=($tags sean_bonner hack)
|
||||
case *banriman*
|
||||
tags=($tags banriman japan)
|
||||
case *japansubculture*
|
||||
tags=($tags japansubculture japan)
|
||||
case *jeansnow*
|
||||
tags=($tags jeansnow japan)
|
||||
case *Kotaku* *kotaku*
|
||||
tags=($tags kotaku video_games)
|
||||
case *eforemario*
|
||||
tags=($tags before_mario video_games)
|
||||
case *nakakobooks*
|
||||
tags=($tags books nakakobooks japan)
|
||||
case *ozawamaria*
|
||||
tags=($tags maria_ozawa japan)
|
||||
case *shisaku.blogspot.com*
|
||||
tags=($tags shisaku japan)
|
||||
case *jimshooter*
|
||||
tags=($tags comics jim_shooter)
|
||||
case *LettersOfNote* *lettersofnote*
|
||||
tags=($tags letters)
|
||||
case *nasa*letters.rss*
|
||||
tags=($tags nasa letters)
|
||||
case *hellodamage* *manganews* *naokiurasawa* *samehat*
|
||||
tags=($tags comics manga)
|
||||
case *mangatraders*
|
||||
tags=($tags p2p comics manga)
|
||||
case *hortonheardawho*
|
||||
tags=($tags hortonheardawho flickr nasa mars)
|
||||
case *me-vs-gutenberg* *mevsgutenberg*
|
||||
tags=($tags martin_sand)
|
||||
case *marxy*
|
||||
tags=($tags marxy)
|
||||
case *etamodern*
|
||||
tags=($tags metamodern)
|
||||
case *aviationintel*
|
||||
tags=($tags aviationintel mil)
|
||||
case *aviationweek*
|
||||
tags=($tags aviationweek mil)
|
||||
case *codeonemagazine*
|
||||
tags=($tags codeonemagazine mil)
|
||||
case *geimint*
|
||||
tags=($tags geimint mil)
|
||||
case *momus* *mrstsk*
|
||||
tags=($tags books music momus)
|
||||
case *bjork* *toog*
|
||||
tags=($tags music)
|
||||
case *nasa.gov*
|
||||
tags=($tags space nasa)
|
||||
case *mongoliad*
|
||||
tags=($tags neal_stephenson)
|
||||
case *gaiman*
|
||||
tags=($tags comics neil_gaiman)
|
||||
case *nin.com* *feeds.nin.com*
|
||||
tags=($tags music nin)
|
||||
case *nix-os* *syssoftware*
|
||||
tags=($tags plan9 nix)
|
||||
case *bsdly* *OPENBSD* *OpenBSD* *openbsd* *scientist-home* *undeadly*
|
||||
tags=($tags software openbsd)
|
||||
case *godownmatthew* *mysticmilk* *petetoms*
|
||||
tags=($tags pete_toms)
|
||||
case *Pitchfork* *pitchfork*
|
||||
tags=($tags music pitchfork)
|
||||
case *9gridchan* *cat-v* *maht0x0r* *Plan9* *plan9*
|
||||
tags=($tags software plan9)
|
||||
case *FlauntTalks* *prince.org* *purpleinterviews* *wendyandlisa*
|
||||
tags=($tags music prince)
|
||||
case *commandcenter* *rob_pike*
|
||||
tags=($tags golang plan9 rob_pike)
|
||||
case *prometheus*
|
||||
tags=($tags telescreen prometheus)
|
||||
case *reddit.com*
|
||||
tags=($tags reddit)
|
||||
case *swtch.com*
|
||||
tags=($tags golang plan9 rsc)
|
||||
case *bunniestudios*
|
||||
tags=($tags bunniestudios security)
|
||||
case *jwz*
|
||||
tags=($tags jwz security)
|
||||
case *Krebs* *krebs*
|
||||
tags=($tags krebs security)
|
||||
case *scarybeastsecurity*
|
||||
tags=($tags scarybeast security)
|
||||
case *schneier*
|
||||
tags=($tags bruce_schneier security)
|
||||
case *chinchillakwak* *skwak*
|
||||
tags=($tags skwak)
|
||||
case *slashdot*
|
||||
tags=($tags slashdot)
|
||||
case *stanleylieber*
|
||||
tags=($tags stanleylieber)
|
||||
case *fastcompany*
|
||||
tags=($tags fastcompany tech)
|
||||
case *danharmon*
|
||||
tags=($tags danharmon telescreen)
|
||||
case *mindlessones*
|
||||
tags=($tags mindlessones telescreen)
|
||||
case *tcj.com*
|
||||
tags=($tags comics tcj)
|
||||
case *TEDblog* *ted.com*
|
||||
tags=($tags ted)
|
||||
case *ticom*
|
||||
tags=($tags ticom security)
|
||||
case *orrentfreak*
|
||||
tags=($tags p2p torrentfreak)
|
||||
case *ultra*culture*
|
||||
tags=($tags ultraculture)
|
||||
case *kleinletters*
|
||||
tags=($tags comics todd_klein)
|
||||
case *plaidstallions*
|
||||
tags=($tags plaidstallions toys)
|
||||
case *shojikawamori*
|
||||
tags=($tags shojikawamori japan toys)
|
||||
}
|
||||
echo -n $tags
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=`{echo $posts($i) | sed 's/> </>\n</g' | grep -v -e '<comments>'}
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | grep -e 'title>' | sed 's/^.*<title>//g; s/<\/title>.*$//g'}
|
||||
a_date=`{echo $post | grep -e '<pubDate>' | sed 's/^.*<pubDate>//g; s/<\/pubDate>.*$//g'}
|
||||
a_link=`{echo $post | grep -e '<link>' | sed 's/^.*<link>//g; s/<\/link>.*$//g; s/^.*http/http/g'}
|
||||
a_tags=`{echo $post | grep -e '<category>' | sed 's/^.*<\/comments>//g; s/^.*<description>//g; s/^.*<\/description>//g; s/^.*<\/pubDate>//g; s/<category>/ /g; s/<\/category>//g; s/<dc.*$//g; s/^ //g; s/ $//g'}
|
||||
a_tags=`{for(j in $a_tags){ echo $j | sed 's/^.*(<|>).*$//g'}}
|
||||
a_body=`{echo $post | grep -e '<description>' | sed 's/^.*<description>//g; s/<\/description>.*$//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! ~ $"a_link `{cat $werc/sites/$site/src/*/link}){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $"a_link >$werc/sites/$site/src/$a_id/link
|
||||
echo $"a_body '</a></li></ul>' >$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in `{get_tags}){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com)
|
||||
for(i in `{f $werc/sites/$site/src/$a_id})
|
||||
chmod +t $i
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
get_feed
|
||||
parse_posts
|
|
@ -1,20 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Create an index of known_tags in $werc/sites/$site/known_tags
|
||||
if(! ~ $#1 0)
|
||||
base=$1
|
||||
if not if(~ $#barf_root 1 && $#barf_base 1)
|
||||
base=$barf_root/$"barf_base
|
||||
if not
|
||||
base=`{pwd}
|
||||
|
||||
if(test -f $base/_known_tags)
|
||||
rm $base/_known_tags
|
||||
for(i in `{cat $base/etc/tags}){
|
||||
grep -e '^.*\/'$i'$' $base/tags |
|
||||
awk -F '/' '{print $3;}' |
|
||||
sort |
|
||||
uniq -c |
|
||||
awk '{print $2 " " $1;}' >>$base/_known_tags
|
||||
}
|
||||
if(test -f $base/_known_tags)
|
||||
cp $base/_known_tags $base/known_tags
|
|
@ -1,415 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Parse RSS feeds from Google Reader bundles into BULGE blog posts.
|
||||
# If a post with a matching <link> already exists, no new post will
|
||||
# be created for that <item>. Accordingly, the gr script may run
|
||||
# slowly for sites with a large number of existing posts. Tags will
|
||||
# be created from each <category>.
|
||||
rfork en
|
||||
switch($1){
|
||||
case architecture
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6e361b590b57934fb1e7c4e29339d619&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(architecture)
|
||||
case comics
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6bc617a6b20aafd526affafc9a28a5d5&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(comics)
|
||||
case friends
|
||||
feed='https://www.google.com/reader/bundle/user%2F08193524211692385241%2Fbundle%2Ffriends'
|
||||
site=read.stanleylieber.com
|
||||
tags=(friends)
|
||||
case tech
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=6dd49be6e34a6871db9bcfc74d4b36b1&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=(tech)
|
||||
case *
|
||||
echo usage: `{basename $0} '[ ... ]' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gr.$1
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn f{ du -a $* | sed 's/^.* //g' }
|
||||
|
||||
fn get_feed{
|
||||
$"cmd $feed >$file.work
|
||||
{
|
||||
echo '
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/\''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
,/<div id="items">/d
|
||||
/<div id="sidebar">/,d
|
||||
,s/<h2 class="item-title">/\n<h2 class="item-title">/g
|
||||
,s/<div class="item">.*$/HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDER/\n/g
|
||||
1d
|
||||
w
|
||||
q
|
||||
'
|
||||
echo
|
||||
} | sam -d $file.work >[2]/dev/null >[1=2]
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
switch($a_link){
|
||||
case *1oct1993*
|
||||
tags=($tags 1oct1993)
|
||||
case *9front*
|
||||
tags=($tags software plan9 9front)
|
||||
case *amyearles* *pushedunder* *seaglass* *woolandwater*
|
||||
tags=($tags amy_earles)
|
||||
case *animenewsnetwork*
|
||||
tags=($tags telescreen anime)
|
||||
case *spikejapan*
|
||||
tags=($tags japan comics manga telescreen anime)
|
||||
case *ArchDaily* *archdaily*
|
||||
tags=($tags archdaily architecture)
|
||||
case *bldgblog*
|
||||
tags=($tags bldgblog architecture)
|
||||
case *kazuyosejima*
|
||||
tags=($tags japan architecture)
|
||||
case *Minimalissimo*
|
||||
tags=($tags minimalissimo design architecture)
|
||||
case *ArtFCity* *ArtFagCity* *artfagcity*
|
||||
tags=($tags artfagcity art)
|
||||
case *rhizome-fp*
|
||||
tags=($tags rhizome-fp art)
|
||||
case *rhizome*
|
||||
tags=($tags rhizome art)
|
||||
case *starwarsmodern*
|
||||
tags=($tags starwarsmodern art)
|
||||
case *tokyoartbeat*
|
||||
tags=($tags tokyoartbeat japan art)
|
||||
case *trendbeheer*
|
||||
tags=($tags trendbeheer art)
|
||||
case *ValentinaTanni*
|
||||
tags=($tags valentinatanni art)
|
||||
case *vvork*
|
||||
tags=($tags vwork art)
|
||||
case *auriea* *tale-of-tales* *taleoftales*
|
||||
tags=($tags auriea)
|
||||
case *basscomm* *closeoutwarrior* *crummysocks* *gamerrelocationproject* *protipoftheday* *PushButtonB* *pushbuttonb*
|
||||
tags=($tags video_games basscomm)
|
||||
case *benjaminmarra*
|
||||
tags=($tags comics benjamin_marra)
|
||||
case *boingboing*
|
||||
tags=($tags boingboing)
|
||||
case *bushinbooks* *henka*
|
||||
tags=($tags budo)
|
||||
case *alexaanddave* *CEREBUS* *Cerebus* *cerebus* *davesim* *gerhard*
|
||||
tags=($tags comics cerebus gerhard)
|
||||
case *coilhouse*
|
||||
tags=($tags coilhouse)
|
||||
case *arche-arc*
|
||||
tags=($tags arche comics)
|
||||
case *blaiselarmee*
|
||||
tags=($tags blaise_larmee comics)
|
||||
case *bleedingcool*
|
||||
tags=($tags bleedingcool comics)
|
||||
case *bobgreenberger*
|
||||
tags=($tags bob_greengerger comics)
|
||||
case *coldheatcomics*
|
||||
tags=($tags coldheat comics)
|
||||
case *comicbookresources*
|
||||
tags=($tags cbr comics)
|
||||
case *comicsbeat*
|
||||
tags=($tags comicsbeat comics)
|
||||
case *ComicsComics* *comicscomics*
|
||||
tags=($tags comicscomics comics)
|
||||
case *coveredblog*
|
||||
tags=($tags coveredblog comics)
|
||||
case *dcfifty-too*
|
||||
tags=($tags dcfifty-too comics)
|
||||
case *Destructoid* *destructoid*
|
||||
tags=($tags destructoid video_games)
|
||||
case *economist.com*
|
||||
tags=($tags economist)
|
||||
case *ferrandelgado*
|
||||
tags=($tags ferran_delgado comics)
|
||||
case *eddiecampbell*
|
||||
tags=($tags eddie_campbell comics)
|
||||
case *factualopinion*
|
||||
tags=($tags factualopinion comics)
|
||||
case *floating_world* *floatingworld*
|
||||
tags=($tags floating_world comics)
|
||||
case *frankmiller*
|
||||
tags=($tags frank_miller comics)
|
||||
case *humancolor*
|
||||
tags=($tags humancolor comics)
|
||||
case *jerkcity*
|
||||
tags=($tags jerkcity comics)
|
||||
case *newconstructionblog*
|
||||
tags=($tags newconstruction manga comics)
|
||||
case *ohdannyboy*
|
||||
tags=($tags ohdannyboy comics)
|
||||
case *pulphope*
|
||||
tags=($tags pulphope comics)
|
||||
case *pwbeat*
|
||||
tags=($tags pwbeat comics)
|
||||
case *reliablecomics*
|
||||
tags=($tags reliablecomics comics)
|
||||
case *reneefrench*
|
||||
tags=($tags renee_french comics)
|
||||
case *rickveitch*
|
||||
tags=($tags rick_veitch comics)
|
||||
case *smbc-comics*
|
||||
tags=($tags smbc comics)
|
||||
case *studygroup*
|
||||
tags=($tags studygroup comics)
|
||||
case *xkcd*
|
||||
tags=($tags xkcd comics)
|
||||
case *bowiesongs* *DavidBowie* *davidbowie*
|
||||
tags=($tags music david_bowie)
|
||||
case *designboom*
|
||||
tags=($tags designboom design)
|
||||
case *dezeen*
|
||||
tags=($tags dezeen design)
|
||||
case *infosthetics*
|
||||
tags=($tags infosthetics design)
|
||||
case *inhabitat*
|
||||
tags=($tags inhabitat architecture design)
|
||||
case *luigicolani*
|
||||
tags=($tags luigicolani design)
|
||||
case *mocoloco*
|
||||
tags=($tags mocoloco design)
|
||||
case *sydmead*
|
||||
tags=($tags sydmead design)
|
||||
case *dzima*
|
||||
tags=($tags dzima)
|
||||
case *bbcicecream*
|
||||
tags=($tags bbcicecream fashion)
|
||||
case *DamStyle *damstyle*
|
||||
tags=($tags damstyle fashion)
|
||||
case *facehunter*
|
||||
tags=($tags facehunter fashion)
|
||||
case *StilInBerlin*
|
||||
tags=($tags germany fashion)
|
||||
case *jstreets*
|
||||
tags=($tags jstreets japan fashion)
|
||||
case *Stilinberlin*
|
||||
tags=($tags stilinberlin germany fashion)
|
||||
case *stylefromtokyo*
|
||||
tags=($tags stylefromtokyo japan fashion)
|
||||
case *tokyofashion*
|
||||
tags=($tags tokyofashion japan fashion)
|
||||
case *flames.gif* *flamesgif*
|
||||
tags=($tags flames.gif)
|
||||
case *contemporary-home-computing*
|
||||
tags=($tags software flames.gif)
|
||||
case *kurzweil*
|
||||
tags=($tags kurzweil future)
|
||||
case *longnow*
|
||||
tags=($tags longnow future)
|
||||
case *OpenTheFuture*
|
||||
tags=($tags openthefuture future)
|
||||
case *golang* *blog.nella.org*
|
||||
tags=($tags golang)
|
||||
case *googlepluses*
|
||||
tags=($tags google)
|
||||
case *news.ycombinator.com*
|
||||
tags=($tags hackernews hack)
|
||||
case *seanbonner*
|
||||
tags=($tags sean_bonner hack)
|
||||
case *banriman*
|
||||
tags=($tags banriman japan)
|
||||
case *japansubculture*
|
||||
tags=($tags japansubculture japan)
|
||||
case *jeansnow*
|
||||
tags=($tags jeansnow japan)
|
||||
case *Kotaku* *kotaku*
|
||||
tags=($tags kotaku video_games)
|
||||
case *eforemario*
|
||||
tags=($tags before_mario video_games)
|
||||
case *nakakobooks*
|
||||
tags=($tags books nakakobooks japan)
|
||||
case *ozawamaria*
|
||||
tags=($tags maria_ozawa japan)
|
||||
case *ibuya246*
|
||||
tags=($tags shibuya246 japan)
|
||||
case *shisaku.blogspot.com*
|
||||
tags=($tags shisaku japan)
|
||||
case *jimshooter*
|
||||
tags=($tags comics jim_shooter)
|
||||
case *LettersOfNote* *lettersofnote*
|
||||
tags=($tags letters)
|
||||
case *nasa*letters.rss*
|
||||
tags=($tags nasa letters)
|
||||
case *hellodamage* *manganews* *naokiurasawa* *samehat*
|
||||
tags=($tags comics manga)
|
||||
case *mangatraders*
|
||||
tags=($tags p2p comics manga)
|
||||
case *hortonheardawho*
|
||||
tags=($tags hortonheardawho flickr nasa mars)
|
||||
case *me-vs-gutenberg* *mevsgutenberg*
|
||||
tags=($tags martin_sand)
|
||||
case *marxy*
|
||||
tags=($tags marxy)
|
||||
case *etamodern*
|
||||
tags=($tags metamodern)
|
||||
case *aviationintel*
|
||||
tags=($tags aviationintel mil)
|
||||
case *aviationweek*
|
||||
tags=($tags aviationweek mil)
|
||||
case *codeonemagazine*
|
||||
tags=($tags codeonemagazine mil)
|
||||
case *geimint*
|
||||
tags=($tags geimint mil)
|
||||
case *bjork*
|
||||
tags=($tags bjork music)
|
||||
case *momus* *mrstsk*
|
||||
tags=($tags books momus music)
|
||||
case *toog*
|
||||
tags=($tags toog music)
|
||||
case *nasa.gov*
|
||||
tags=($tags space nasa)
|
||||
case *mongoliad*
|
||||
tags=($tags neal_stephenson)
|
||||
case *gaiman*
|
||||
tags=($tags comics neil_gaiman)
|
||||
case *nin.com* *feeds.nin.com*
|
||||
tags=($tags music nin)
|
||||
case *nix-os* *syssoftware*
|
||||
tags=($tags plan9 nix)
|
||||
case *bsdly* *OPENBSD* *OpenBSD* *openbsd* *scientist-home* *undeadly*
|
||||
tags=($tags software openbsd)
|
||||
case *godownmatthew* *mysticmilk* *petetoms*
|
||||
tags=($tags pete_toms)
|
||||
case *Pitchfork* *pitchfork*
|
||||
tags=($tags music pitchfork)
|
||||
case *9gridchan* *cat-v* *maht0x0r* *Plan9* *plan9*
|
||||
tags=($tags software plan9)
|
||||
case *FlauntTalks* *prince.org* *purpleinterviews* *wendyandlisa*
|
||||
tags=($tags music prince)
|
||||
case *commandcenter* *rob_pike*
|
||||
tags=($tags golang plan9 rob_pike)
|
||||
case *prometheus*
|
||||
tags=($tags telescreen prometheus)
|
||||
case *reddit.com*
|
||||
tags=($tags reddit)
|
||||
case *swtch.com*
|
||||
tags=($tags golang plan9 rsc)
|
||||
case *bunniestudios*
|
||||
tags=($tags bunniestudios security)
|
||||
case *jwz*
|
||||
tags=($tags jwz security)
|
||||
case *Krebs* *krebs*
|
||||
tags=($tags krebs security)
|
||||
case *scarybeastsecurity*
|
||||
tags=($tags scarybeast security)
|
||||
case *schneier*
|
||||
tags=($tags bruce_schneier security)
|
||||
case *chinchillakwak* *skwak*
|
||||
tags=($tags skwak)
|
||||
case *slashdot*
|
||||
tags=($tags slashdot)
|
||||
case *stanleylieber*
|
||||
tags=($tags stanleylieber)
|
||||
case *fastcompany*
|
||||
tags=($tags fastcompany tech)
|
||||
case *danharmon*
|
||||
tags=($tags danharmon telescreen)
|
||||
case *mindlessones*
|
||||
tags=($tags mindlessones telescreen)
|
||||
case *tcj.com*
|
||||
tags=($tags comics tcj)
|
||||
case *TEDblog* *ted.com*
|
||||
tags=($tags ted)
|
||||
case *ticom*
|
||||
tags=($tags ticom security)
|
||||
case *orrentfreak*
|
||||
tags=($tags p2p torrentfreak)
|
||||
case *ultra*culture*
|
||||
tags=($tags ultraculture)
|
||||
case *kleinletters*
|
||||
tags=($tags comics todd_klein)
|
||||
case *kennercollector*
|
||||
tags=($tags kennercollector toys)
|
||||
case *plaidstallions*
|
||||
tags=($tags plaidstallions toys)
|
||||
case *shojikawamori*
|
||||
tags=($tags shojikawamori japan toys)
|
||||
case *ruinedcartridge*
|
||||
tags=($tags basscomm video_games)
|
||||
}
|
||||
echo -n $tags
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
for(post in `{sort -r $file.work}){
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*<h2 class="item-title"><div class="">//g' | sed 's/<div class="item-info">.*$//g' | htmlfmt}
|
||||
if(~ $#a_title 0)
|
||||
a_title=`{echo $post | sed 's/^.*<div class="item-info">//g' | sed 's/<div class="item-annotations">.*$//g' | htmlfmt}
|
||||
if(~ $#a_title 0)
|
||||
a_title=fake
|
||||
a_link=`{echo $post | sed 's/^.*<h2 class="item-title"><div class="">//g' | sed 's/<div class="item-info">.*$//g' | htmlfmt -a | sed 's/^.*\[//g' | sed 's/\].*$//g' | sed 's/ .*$//g'}
|
||||
if(~ $#a_link 0 || ! ~ $"a_link http*)
|
||||
a_link=`{echo $post | sed 's/^.*<h2 class="item-title"><div class="">//g' | sed 's/<div class="item-info">.*$//g' | sed 's/^.*<a href="//g' | sed 's/\".*$//g' | sed 's/^.*http/http/g' | sed 's/ .*$//g'}
|
||||
if(~ $#a_link 0 || ! ~ $"a_link http*)
|
||||
a_link=`{echo $post | sed 's/^.*<div class="item-info">//g' | sed 's/<div class="item-annotations">.*$//g' | htmlfmt -a | sed 's/^.*\[//g' | sed 's/\].*$//g' | sed 's/ .*$//g'}
|
||||
if(~ $#a_link 0 || ! ~ $"a_link http*)
|
||||
a_link=`{echo $post | sed 's/^.*<div class="item-info">//g' | sed 's/<div class="item-annotations">.*$//g' | sed 's/^.*<a href="//g' | sed 's/" class="f">.*$//g' | sed 's/\".*$//g' | sed 's/^.*http/http/g' | sed 's/ .*$//g'}
|
||||
a_link=$a_link(1)
|
||||
if(~ $#a_link 0 || ~ $"a_link '' || ! ~ $"a_link http*)
|
||||
a_link=fake
|
||||
if(! ~ $#a_link 1)
|
||||
a_link=`{echo $a_link | awk '{print $1;}'}
|
||||
a_date=`{date -n}
|
||||
a_body=`{echo $post | sed 's/^.*<div class="item-body">//g' | sed 's/<div class="clear">.*$//g'}
|
||||
if(~ $#a_body 0)
|
||||
a_body=fake
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link `{cat $werc/sites/$site/src/*/link}){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $"a_link >$werc/sites/$site/src/$a_id/link
|
||||
echo $"a_body '</a></li></ul>' >$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in `{get_tags}){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum)
|
||||
for(i in `{f $werc/sites/$site/src/$a_id})
|
||||
chmod +t $i
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
get_feed
|
||||
parse_posts
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Create an index of tags in $werc/sites/$site/tags. BULGE
|
||||
# greps this index when running a search on a given tag.
|
||||
# This file is also maintained by the bin/g* commands, or
|
||||
# when adding posts through the web interface.
|
||||
if(! ~ $#1 0)
|
||||
base=$1
|
||||
if not if(~ $#barf_root 1 && $#barf_base 1)
|
||||
base=$barf_root/$"barf_base
|
||||
if not
|
||||
base=`{pwd}
|
||||
|
||||
if(test -f $base/_tags)
|
||||
rm $base/_tags
|
||||
builtin cd $base/src
|
||||
ls -p |
|
||||
sort -n |
|
||||
xargs du -a |
|
||||
sed 's/^.* //g' |
|
||||
grep -e '^[0-9]*\/tags' |
|
||||
grep -v -e '^.*\/tags$' >>$base/_tags
|
||||
if(test -s $base/_tags)
|
||||
cp $base/_tags $base/tags
|
|
@ -1,455 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds from Yahoo Pipes into BARF blog posts
|
||||
# for the specified site. If a post with a matching _link_ already
|
||||
# exists, no new post will be created for that item. Accordingly,
|
||||
# the gy script may run slowly for sites with a large number of
|
||||
# existing posts. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case read
|
||||
feed='http://pipes.yahoo.com/pipes/pipe.run?_id=d1f7146306b019d96d768facf95eebd9&_render=rss'
|
||||
site=read.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gy [ ... ]' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gy.$1
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
switch($a_link){
|
||||
case *1oct1993*
|
||||
tags=($tags 1oct1993)
|
||||
case *9front*
|
||||
tags=($tags software plan9 9front)
|
||||
case *organicmentalcore*
|
||||
tags=($tags aleks)
|
||||
case *amyearles* *etsy.com* *pushedunder* *seaglass* *woolandwater*
|
||||
tags=($tags amy_earles)
|
||||
case *animenewsnetwork*
|
||||
tags=($tags telescreen anime)
|
||||
case *spikejapan*
|
||||
tags=($tags japan comics manga telescreen anime)
|
||||
case *augmented.org*
|
||||
tags=($tags augmented.org ar)
|
||||
case *ArchDaily* *archdaily*
|
||||
tags=($tags archdaily architecture)
|
||||
case *bldgblog*
|
||||
tags=($tags bldgblog architecture)
|
||||
case *kazuyosejima*
|
||||
tags=($tags japan architecture)
|
||||
case *Minimalissimo*
|
||||
tags=($tags minimalissimo design architecture)
|
||||
case *ArtFagCity* *ArtFCity* *artfagcity*
|
||||
tags=($tags artfagcity art)
|
||||
case *rhizome-fp*
|
||||
tags=($tags rhizome-fp art)
|
||||
case *rhizome*
|
||||
tags=($tags rhizome art)
|
||||
case *starwarsmodern*
|
||||
tags=($tags starwarsmodern art)
|
||||
case *tokyoartbeat*
|
||||
tags=($tags tokyoartbeat japan art)
|
||||
case *trendbeheer*
|
||||
tags=($tags trendbeheer art)
|
||||
case *ValentinaTanni*
|
||||
tags=($tags valentinatanni art)
|
||||
case *vvork*
|
||||
tags=($tags vwork art)
|
||||
case *auriea* *tale-of-tales* *taleoftales*
|
||||
tags=($tags auriea)
|
||||
case *basscomm* *closeoutwarrior* *crummysocks* *gamerrelocationproject* *protipoftheday* *PushButtonB* *pushbuttonb*
|
||||
tags=($tags video_games basscomm)
|
||||
case *benjaminmarra*
|
||||
tags=($tags comics benjamin_marra)
|
||||
case *boingboing*
|
||||
tags=($tags boingboing)
|
||||
case *bushinbooks* *henka*
|
||||
tags=($tags budo)
|
||||
case *alexaanddave* *CEREBUS* *Cerebus* *cerebus* *davesim* *gerhard*
|
||||
tags=($tags comics cerebus gerhard)
|
||||
case *coilhouse*
|
||||
tags=($tags coilhouse)
|
||||
case *arche-arc*
|
||||
tags=($tags arche comics)
|
||||
case *bitolithic.com*
|
||||
tags=($tags bitolithic comics)
|
||||
case *blaiselarmee*
|
||||
tags=($tags blaise_larmee comics)
|
||||
case *bleedingcool*
|
||||
tags=($tags bleedingcool comics)
|
||||
case *bobgreenberger*
|
||||
tags=($tags bob_greengerger comics)
|
||||
case *coldheatcomics*
|
||||
tags=($tags coldheat comics)
|
||||
case *comicbookresources*
|
||||
tags=($tags cbr comics)
|
||||
case *comicsbeat*
|
||||
tags=($tags comicsbeat comics)
|
||||
case *ComicsComics* *comicscomics*
|
||||
tags=($tags comicscomics comics)
|
||||
case *coveredblog*
|
||||
tags=($tags coveredblog comics)
|
||||
case *dcfifty-too*
|
||||
tags=($tags dcfifty-too comics)
|
||||
case *Destructoid* *destructoid*
|
||||
tags=($tags destructoid video_games)
|
||||
case *economist.com*
|
||||
tags=($tags economist)
|
||||
case *brucesterling.tumblr.com*
|
||||
tags=($tags bruce_sterling)
|
||||
case *thecreatorsproject*
|
||||
tags=($tags thecreatorsproject)
|
||||
case *ferrandelgado*
|
||||
tags=($tags ferran_delgado comics)
|
||||
case *eddiecampbell*
|
||||
tags=($tags eddie_campbell comics)
|
||||
case *factualopinion*
|
||||
tags=($tags factualopinion comics)
|
||||
case *floating_world* *floatingworld*
|
||||
tags=($tags floating_world comics)
|
||||
case *frankmiller*
|
||||
tags=($tags frank_miller comics)
|
||||
case *humancolor*
|
||||
tags=($tags humancolor comics)
|
||||
case *jerkcity*
|
||||
tags=($tags jerkcity comics)
|
||||
case *maakies.com*
|
||||
tags=($tags tony_millionaire maakies comics)
|
||||
case *newconstructionblog*
|
||||
tags=($tags newconstruction manga comics)
|
||||
case *ohdannyboy*
|
||||
tags=($tags ohdannyboy comics)
|
||||
case *pulphope*
|
||||
tags=($tags pulphope comics)
|
||||
case *pwbeat*
|
||||
tags=($tags pwbeat comics)
|
||||
case *reliablecomics*
|
||||
tags=($tags reliablecomics comics)
|
||||
case *reneefrench*
|
||||
tags=($tags renee_french comics)
|
||||
case *rickveitch*
|
||||
tags=($tags rick_veitch comics)
|
||||
case *royalboiler*
|
||||
tags=($tags royalboiler comics)
|
||||
case *smbc-comics*
|
||||
tags=($tags smbc comics)
|
||||
case *studygroup*
|
||||
tags=($tags studygroup comics)
|
||||
case *xkcd*
|
||||
tags=($tags xkcd comics)
|
||||
case *bowiesongs* *DavidBowie* *davidbowie*
|
||||
tags=($tags music david_bowie)
|
||||
case *designboom*
|
||||
tags=($tags designboom design)
|
||||
case *dezeen*
|
||||
tags=($tags dezeen design)
|
||||
case *infosthetics*
|
||||
tags=($tags infosthetics design)
|
||||
case *inhabitat*
|
||||
tags=($tags inhabitat architecture design)
|
||||
case *luigicolani*
|
||||
tags=($tags luigicolani design)
|
||||
case *mocoloco*
|
||||
tags=($tags mocoloco design)
|
||||
case *sydmead*
|
||||
tags=($tags sydmead design)
|
||||
case *dzima*
|
||||
tags=($tags dzima)
|
||||
case *bbcicecream*
|
||||
tags=($tags bbcicecream fashion)
|
||||
case *DamStyle *damstyle*
|
||||
tags=($tags damstyle fashion)
|
||||
case *facehunter*
|
||||
tags=($tags facehunter fashion)
|
||||
case *StilInBerlin* *Stilinberlin*
|
||||
tags=($tags germany fashion)
|
||||
case *jstreets*
|
||||
tags=($tags jstreets japan fashion)
|
||||
case *stylefromtokyo*
|
||||
tags=($tags stylefromtokyo japan fashion)
|
||||
case *tokyofashion*
|
||||
tags=($tags tokyofashion japan fashion)
|
||||
case *flames.gif* *flamesgif*
|
||||
tags=($tags flames.gif)
|
||||
case *contemporary-home-computing*
|
||||
tags=($tags software flames.gif)
|
||||
case *acceler8or.com*
|
||||
tags=($tags acceler8or future)
|
||||
case *afrocyberpunk.wordpress.com*
|
||||
tags=($tags afrocyberpunk future)
|
||||
case *hyperallergic.com*
|
||||
tags=($tags hyperallergic future)
|
||||
case *kurzweil*
|
||||
tags=($tags kurzweil future)
|
||||
case *longnow*
|
||||
tags=($tags longnow future)
|
||||
case *OpenTheFuture*
|
||||
tags=($tags openthefuture future)
|
||||
case *theverge.com*
|
||||
tags=($tags theverge future)
|
||||
case *golang* *blog.nella.org*
|
||||
tags=($tags golang)
|
||||
case *googlepluses*
|
||||
tags=($tags google)
|
||||
case *news.ycombinator.com*
|
||||
tags=($tags hackernews hack)
|
||||
case *seanbonner*
|
||||
tags=($tags sean_bonner hack)
|
||||
case *banriman*
|
||||
tags=($tags banriman japan)
|
||||
case *japansubculture*
|
||||
tags=($tags japansubculture japan)
|
||||
case *jeansnow*
|
||||
tags=($tags jeansnow japan)
|
||||
case *Kotaku* *kotaku*
|
||||
tags=($tags kotaku video_games)
|
||||
case *eforemario*
|
||||
tags=($tags before_mario video_games)
|
||||
case *instagram* *web.stagram.com*
|
||||
tags=($tags instagram)
|
||||
case *nakakobooks*
|
||||
tags=($tags books nakakobooks japan)
|
||||
case *ozawamaria*
|
||||
tags=($tags maria_ozawa japan)
|
||||
case *Shibuya246*
|
||||
tags=($tags shibuya246 japan)
|
||||
case *shisaku.blogspot.com*
|
||||
tags=($tags shisaku japan)
|
||||
case *jimshooter*
|
||||
tags=($tags comics jim_shooter)
|
||||
case *LettersOfNote* *lettersofnote*
|
||||
tags=($tags letters)
|
||||
case *nasa*letters.rss*
|
||||
tags=($tags nasa letters)
|
||||
case *kore.livejournal.com*
|
||||
tags=($tags kore livejournal)
|
||||
case *real-funny-lady.livejournal.com*
|
||||
tags=($tags rea_funny_lady livejournal)
|
||||
case *vintage-ads.livejournal.com*
|
||||
tags=($tags vintage_ads livejournal)
|
||||
case *hellodamage*
|
||||
tags=($tags comics hellodamage manga)
|
||||
case *manganews*
|
||||
tags=($tags comics manganews manga)
|
||||
case *naokiurasawa*
|
||||
tags=($tags comics naokiurasawa manga)
|
||||
case *samehat*
|
||||
tags=($tags comics samehat manga)
|
||||
case *mangatraders*
|
||||
tags=($tags p2p comics manga)
|
||||
case *hortonheardawho*
|
||||
tags=($tags hortonheardawho flickr nasa mars)
|
||||
case *marstoday.com*
|
||||
tags=($tags marstoday mars)
|
||||
case *kielbryant*
|
||||
tags=($tags kiel_bryant flickr)
|
||||
case *flickr*paoru*
|
||||
tags=($tags paoru flickr)
|
||||
case *me-vs-gutenberg* *mevsgutenberg*
|
||||
tags=($tags martin_sand)
|
||||
case *marxy*
|
||||
tags=($tags marxy)
|
||||
case *etamodern*
|
||||
tags=($tags metamodern)
|
||||
case *aviationintel*
|
||||
tags=($tags aviationintel mil)
|
||||
case *aviationweek*
|
||||
tags=($tags aviationweek mil)
|
||||
case *codeonemagazine*
|
||||
tags=($tags codeonemagazine mil)
|
||||
case *geimint*
|
||||
tags=($tags geimint mil)
|
||||
case *momus* *mrstsk*
|
||||
tags=($tags books music momus)
|
||||
case *bjork*
|
||||
tags=($tags bjork music)
|
||||
case *c-h-r-i-s-c-a-r-t-e-r*
|
||||
tags=($tags chris_carter music)
|
||||
case *toog*
|
||||
tags=($tags toog music)
|
||||
case *nasa.gov*
|
||||
tags=($tags space nasa)
|
||||
case *mongoliad*
|
||||
tags=($tags neal_stephenson)
|
||||
case *gaiman*
|
||||
tags=($tags comics neil_gaiman)
|
||||
case *111567547782666546187*
|
||||
tags=($tags daniel_rehn gplus)
|
||||
case *114408853762245370512*
|
||||
tags=($tags francesco_cardi gplus)
|
||||
case *106673611724400311137*
|
||||
tags=($tags mark_jondahl gplus)
|
||||
case *113974084460235989118*
|
||||
tags=($tags jose_nazario gplus)
|
||||
case *102089697005520721324*
|
||||
tags=($tags zaki_hasan gplus)
|
||||
case *nin.com* *feeds.nin.com*
|
||||
tags=($tags music nin.com nin)
|
||||
case *ninofficialnews.tumblr.com*
|
||||
tags=($tags music tumblr nin)
|
||||
case *nix-os* *syssoftware*
|
||||
tags=($tags plan9 nix)
|
||||
case *bsdly* *OPENBSD* *OpenBSD* *openbsd* *scientist-home* *undeadly*
|
||||
tags=($tags software openbsd)
|
||||
case *godownmatthew* *mysticmilk* *petetoms*
|
||||
tags=($tags pete_toms)
|
||||
case *Pitchfork* *pitchfork*
|
||||
tags=($tags music pitchfork)
|
||||
case *9gridchan* *cat-v* *maht0x0r* *Plan9* *plan9*
|
||||
tags=($tags software plan9)
|
||||
case *FlauntTalks* *prince.org* *purpleinterviews* *wendyandlisa*
|
||||
tags=($tags music prince)
|
||||
case *101960720994009339267*
|
||||
tags=($tags gplus rob_pike)
|
||||
case *commandcenter* *rob_pike*
|
||||
tags=($tags blogger rob_pike)
|
||||
case *prometheus*
|
||||
tags=($tags telescreen prometheus)
|
||||
case *reddit.com*
|
||||
tags=($tags reddit)
|
||||
case *swtch.com*
|
||||
tags=($tags golang plan9 rsc)
|
||||
case *bunniestudios*
|
||||
tags=($tags bunniestudios security)
|
||||
case *jwz*
|
||||
tags=($tags jwz security)
|
||||
case *Krebs* *krebs*
|
||||
tags=($tags krebs security)
|
||||
case *scarybeastsecurity*
|
||||
tags=($tags scarybeast security)
|
||||
case *schneier*
|
||||
tags=($tags bruce_schneier security)
|
||||
case *chinchillakwak* *skwak*
|
||||
tags=($tags skwak)
|
||||
case *slashdot*
|
||||
tags=($tags slashdot)
|
||||
case *spaceref.com*
|
||||
tags=($tags space spaceref)
|
||||
case *StanleyLieber* *stanleylieber*
|
||||
tags=($tags stanleylieber)
|
||||
case *fastcompany*
|
||||
tags=($tags fastcompany tech)
|
||||
case *gizchina.com*
|
||||
tags=($tags gizchina tech)
|
||||
case *danharmon*
|
||||
tags=($tags danharmon telescreen)
|
||||
case *mindlessones*
|
||||
tags=($tags mindlessones telescreen)
|
||||
case *tcj.com*
|
||||
tags=($tags comics tcj)
|
||||
case *TEDBlog* *TEDblog* *ted.com*
|
||||
tags=($tags ted)
|
||||
case *ticom*
|
||||
tags=($tags ticom security)
|
||||
case *orrentfreak*
|
||||
tags=($tags p2p torrentfreak)
|
||||
case *ultra*culture*
|
||||
tags=($tags ultraculture)
|
||||
case *kleinletters*
|
||||
tags=($tags comics todd_klein)
|
||||
case *collectiondx.com*
|
||||
tags=($tags collectiondx toys)
|
||||
case *kennercollector.com*
|
||||
tags=($tags kennercollector toys)
|
||||
case *plaidstallions*
|
||||
tags=($tags plaidstallions toys)
|
||||
case *shojikawamori*
|
||||
tags=($tags shojikawamori japan toys)
|
||||
case *tumblr*
|
||||
tags=($tags tumblr)
|
||||
case *ruinedcartridge*
|
||||
tags=($tags ruinedcartridge basscomm video_games)
|
||||
}
|
||||
echo -n $tags
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
echo $"a_body '</a></li></ul>' >$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in `{get_tags}){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
get_posts
|
||||
parse_posts
|
|
@ -1,119 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds into BARF blog posts for the specified site.
|
||||
# If a post with a matching _link_ already exists, no new post will
|
||||
# be created for that item. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# The file argument should point to a file containing one line per feed,
|
||||
# with fields separated by the | character, in the following format:
|
||||
#
|
||||
# http://feeds.feedburner.com/ImNotReallyStanleyLieber|stanleylieber
|
||||
#
|
||||
# where the first field is the feed URL and each addition field is a tag.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case /*
|
||||
feeds=$1
|
||||
site=read.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gz file' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gz.$pid
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $"feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
if(~ $a_link(1) *staticflickr.com*)
|
||||
echo '<img src="'$"a_link'">' >$werc/sites/$site/src/$a_id/body
|
||||
echo $"a_body '</a></li></ul>' >>$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in $tags){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
for(i in `{grep -v -e '^#' $feeds}){
|
||||
feed=`{echo $"i | sed 's/\|.*$//g'}
|
||||
tags=`{echo $"i | sed 's/\|/ /g'}
|
||||
tags=$tags(2-)
|
||||
get_posts
|
||||
parse_posts
|
||||
}
|
|
@ -1,119 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds into BARF blog posts for the specified site.
|
||||
# If a post with a matching _link_ already exists, no new post will
|
||||
# be created for that item. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# The file argument should point to a file containing one line per feed,
|
||||
# with fields separated by the | character, in the following format:
|
||||
#
|
||||
# http://feeds.feedburner.com/ImNotReallyStanleyLieber|stanleylieber
|
||||
#
|
||||
# where the first field is the feed URL and each addition field is a tag.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case /*
|
||||
feeds=$1
|
||||
site=read.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gz file' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gz.$pid
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $"feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
if(~ $a_link(1) *staticflickr.com*)
|
||||
echo '<img src="'$"a_link'">' >$werc/sites/$site/src/$a_id/body
|
||||
echo $"a_body '</a></li></ul>' >>$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in $tags){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
for(i in `{grep -v -e '^#' $feeds}){
|
||||
feed=`{echo $"i | sed 's/\|.*$//g'}
|
||||
tags=`{echo $"i | sed 's/\|/ /g'}
|
||||
tags=$tags(2-)
|
||||
get_posts
|
||||
parse_posts
|
||||
}
|
|
@ -1,119 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Parse XML RSS feeds into BARF blog posts for the specified site.
|
||||
# If a post with a matching _link_ already exists, no new post will
|
||||
# be created for that item. Tags will be created according to the rules
|
||||
# defined in the get_tags() function.
|
||||
#
|
||||
# The file argument should point to a file containing one line per feed,
|
||||
# with fields separated by the | character, in the following format:
|
||||
#
|
||||
# http://feeds.feedburner.com/ImNotReallyStanleyLieber|stanleylieber
|
||||
#
|
||||
# where the first field is the feed URL and each addition field is a tag.
|
||||
#
|
||||
# Requires 20h's xmlpull and rssread.
|
||||
rfork en
|
||||
switch($1){
|
||||
case /*
|
||||
feeds=$1
|
||||
site=tumblr.stanleylieber.com
|
||||
tags=()
|
||||
case *
|
||||
echo 'Usage: gz file' >[1=2]
|
||||
exit usage
|
||||
}
|
||||
|
||||
file=/tmp/gz.$pid
|
||||
werc=/usr/sl/www/werc
|
||||
|
||||
if(test -f /boot/factotum)
|
||||
cmd=hget
|
||||
if not
|
||||
cmd='curl -s'
|
||||
|
||||
fn cram{
|
||||
ssam '
|
||||
,s/^link:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/^title:.*$/HJDIVIDER&HJDIVIDER/g
|
||||
,s/\n//g
|
||||
,s/HJDIVIDERtitle:/\n&/g
|
||||
'
|
||||
}
|
||||
|
||||
fn scape{
|
||||
ssam '
|
||||
,s/
//g
|
||||
,s/\"/\"/g
|
||||
,s/\"/\"/g
|
||||
,s/\&/\&/g
|
||||
,s/\&/\&/g
|
||||
,s/\'/''/g
|
||||
,s/\,/,/g
|
||||
,s/\-/-/g
|
||||
,s/\./\./g
|
||||
,s/\//\//g
|
||||
,s/\:/:/g
|
||||
,s/\;/;/g
|
||||
,s/\</</g
|
||||
,s/\</</g
|
||||
,s/\=/=/g
|
||||
,s/\>/>/g
|
||||
,s/\>/>/g
|
||||
,s/\_/_/g
|
||||
,s/\|/\|/g
|
||||
'
|
||||
}
|
||||
|
||||
fn get_posts{
|
||||
$"cmd $"feed | rssread | cram | scape >$file
|
||||
echo >>$file
|
||||
}
|
||||
|
||||
fn parse_posts{
|
||||
ifs='
|
||||
' {
|
||||
posts=`{cat $file}
|
||||
for(i in `{seq 1 $#posts | sort -nr}){
|
||||
post=$posts($i)
|
||||
if(! ~ $post ''){
|
||||
a_title=`{echo $post | sed 's/^.*HJDIVIDERtitle: //g; s/HJDIVIDER.*$//g'}
|
||||
a_date=`{date}
|
||||
a_link=`{echo $post | sed 's/^.*HJDIVIDERlink: //g; s/HJDIVIDER.*$//g'}
|
||||
a_body=`{echo $post | sed 's/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g; s/^.*HJDIVIDER//g'}
|
||||
a_id=`{echo `{ls -p $werc/sites/$site/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $werc/sites/$site/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
if(! ~ $"a_link '' && ! grep -s `{echo $"a_link | md5sum} $werc/sites/$site/links){
|
||||
mkdir -p $werc/sites/$site/src/$a_id/tags # big fat race
|
||||
echo $"a_title >$werc/sites/$site/src/$a_id/title
|
||||
echo $"a_date >$werc/sites/$site/src/$a_id/date
|
||||
echo $a_link(1) >$werc/sites/$site/src/$a_id/link
|
||||
echo $a_link(1) | md5sum >>$werc/sites/$site/links
|
||||
if(~ $a_link(1) *staticflickr.com*)
|
||||
echo '<img src="'$"a_link'">' >$werc/sites/$site/src/$a_id/body
|
||||
echo $"a_body '</a></li></ul>' >>$werc/sites/$site/src/$a_id/body
|
||||
ifs=' ' {
|
||||
for(j in $tags){
|
||||
>$werc/sites/$site/src/$a_id/tags/$j
|
||||
echo $a_id/tags/$j >>$werc/sites/$site/tags
|
||||
}
|
||||
}
|
||||
}
|
||||
if(test -f /boot/factotum && ~ $site *.stanleylieber.com && test -d $werc/sites/$site/src/$a_id)
|
||||
chmod +t $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/* $werc/sites/$site/src/$a_id $werc/sites/$site/src/$a_id/tags/*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(test -f /boot/factotum && test -f /rc/bin/hget)
|
||||
webfs
|
||||
for(i in `{grep -v -e '^#' $feeds}){
|
||||
feed=`{echo $"i | sed 's/\|.*$//g'}
|
||||
tags=`{echo $"i | sed 's/\|/ /g'}
|
||||
tags=$tags(2-)
|
||||
get_posts
|
||||
parse_posts
|
||||
}
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/rc
|
||||
# Remove static files.
|
||||
rm -r [0-9]*.html [0-9]*-[0-9]*.html tag
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/rc
|
||||
# do not store these files in the worm
|
||||
fn f{ du -a $* | sed 's/^.* //g' }
|
||||
for(i in `{f $1}){ chmod +t $i }
|
|
@ -1,14 +0,0 @@
|
|||
% if(~ $show_header 1 && ! ~ $barf_type login rss)
|
||||
% display_header
|
||||
% if(~ $a_func edit_form){
|
||||
% if(check_user && ! ~ $#logged_user 0)
|
||||
% edit_form
|
||||
% if not
|
||||
% display_^$barf_type
|
||||
% }
|
||||
% if not
|
||||
% display_^$barf_type
|
||||
% if(~ $show_sidebar 1 && ~ $#a_func 0 && ! ~ $barf_type login rss)
|
||||
% display_sidebar
|
||||
% if(~ $show_footer 1 && ~ $#a_func 0 && ! ~ $barf_type login rss)
|
||||
% display_footer
|
|
@ -1,43 +0,0 @@
|
|||
fn display_blog{
|
||||
echo '<div id="center">
|
||||
<div id="posts">'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<div id="post">
|
||||
<div id="post_title">'
|
||||
print_title
|
||||
echo '</div>
|
||||
<div id="post_meta">'
|
||||
link=`{cat $a_dir/link}
|
||||
echo '<span id="post_link">
|
||||
<a href="'$"link'" target="_b">link</a>
|
||||
</span>
|
||||
| <span id="post_tags">'
|
||||
print_tags
|
||||
echo '</span>
|
||||
| <span id="post_date">'
|
||||
cat $a_dir/date
|
||||
echo '</span>'
|
||||
print_id
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo ' | <span id="post_edit">'
|
||||
print_edit
|
||||
echo '</span>'
|
||||
}
|
||||
echo '</div>
|
||||
<div id="post_body">'
|
||||
cat $a_dir/body
|
||||
if(~ $show_disqus 1 && ! ~ $#id 0)
|
||||
cat $barf_root/_werc/barf/disqus
|
||||
echo '</div>
|
||||
</div>
|
||||
<br>'
|
||||
}
|
||||
display_prevnext
|
||||
echo '<br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
</div>'
|
||||
}
|
|
@ -1,414 +0,0 @@
|
|||
fn delete_post{
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
if(test -d $a_dir){
|
||||
rm -rf $a_dir &&
|
||||
{echo ',x/^'$a_id'\/.*\n/d'; echo w; echo q} | sam -d $barf_root/$"barf_dir/tags >[2]/dev/null
|
||||
}
|
||||
post_redirect $base_url^$barf_base_uri
|
||||
}
|
||||
|
||||
fn display_footer{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/footer)
|
||||
cat $barf_root/$"barf_dir/_werc/barf/footer
|
||||
if not if(test -f $barf_root/_werc/barf/footer)
|
||||
cat $barf_root/_werc/barf/footer
|
||||
if not
|
||||
cat apps/barf/barf/footer
|
||||
}
|
||||
|
||||
fn display_header{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/header)
|
||||
cat $barf_root/$"barf_dir/_werc/barf/header
|
||||
if not if(test -f $barf_root/_werc/barf/header)
|
||||
cat $barf_root/_werc/barf/header
|
||||
if not
|
||||
cat apps/barf/barf/header
|
||||
}
|
||||
|
||||
fn display_login{
|
||||
echo '<div id="login">
|
||||
<form method="post" action="/">
|
||||
<input type="hidden" name="a_func" value="login">
|
||||
username: <input type="text" name="user_name"><br>
|
||||
password: <input type="password" name="user_password"><br>
|
||||
<input name="s" type="submit" value="login">
|
||||
</form>
|
||||
</div>'
|
||||
}
|
||||
|
||||
fn display_prevnext{
|
||||
if(test $stop -gt `{echo 1+^$posts_per_page | bc}){
|
||||
nprev=`{echo $start^-1-^$posts_per_page | bc}
|
||||
prev='<span>
|
||||
<a href="'$base_url^$barf_base_uri'?tags='$"tags'&start='$"nprev'">prev</a> |
|
||||
</span>'
|
||||
}
|
||||
if(test $#posts -gt $posts_per_page){
|
||||
nnext=`{echo $stop^+1 | bc}
|
||||
next='<span>
|
||||
<a href="'$base_url^$barf_base_uri'?tags='$"tags'&start='$"nnext'">next</a>
|
||||
</span>'
|
||||
}
|
||||
echo '<div id="page_list">
|
||||
'$"prev'
|
||||
'$"next'
|
||||
</div>'
|
||||
}
|
||||
|
||||
fn display_sidebar{
|
||||
if(test -f $barf_root/$"barf_dir/_werc/barf/sidebar)
|
||||
cat $barf_root/$"barf_dir/_werc/barf/sidebar
|
||||
if not if(test -f $barf_root/_werc/barf/sidebar)
|
||||
cat $barf_root/_werc/barf/sidebar
|
||||
if not
|
||||
cat apps/barf/barf/sidebar
|
||||
}
|
||||
|
||||
fn dsrc{
|
||||
low=`{ls -p $barf_root/$"barf_dir/src | sort -n | sed 1q}
|
||||
high=$a_id
|
||||
if(~ $#low 1 && ~ $#high 1){
|
||||
cd $barf_root/$"barf_dir/src && rm -rf `{seq $low $high} &&
|
||||
{
|
||||
for(i in `{seq $low $high})
|
||||
echo ',x/^'$i'\/.*\n/d'
|
||||
echo w
|
||||
echo w
|
||||
echo q
|
||||
} | sam -d $barf_root/$"barf_dir/tags >[2]/dev/null
|
||||
}
|
||||
post_redirect $base_url^$barf_base_uri
|
||||
}
|
||||
|
||||
fn edit_form{
|
||||
if(~ $#a_id 0)
|
||||
name=add
|
||||
if not{
|
||||
name=update
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
for(x in $barf_items){
|
||||
if(~ $x img)
|
||||
a_img=`{ls -p $a_dir/img | sed 1q}
|
||||
if(~ $x tags)
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
if not
|
||||
$x=`{cat $a_dir/$x}
|
||||
}
|
||||
}
|
||||
echo '<div id="list">
|
||||
<form action="/" method="post" name="edit" id="button">
|
||||
<input type="hidden" name="fake" value="fake">
|
||||
<input type="text" name="url" style="display: none;">
|
||||
<input type="hidden" name="a_func" value="edit_post">'
|
||||
if(~ $name update)
|
||||
echo '<input type="hidden" name="a_id" value="'$"a_id'">'
|
||||
for(x in $barf_items){
|
||||
if(~ $x body){
|
||||
echo '<div id="edit_body">' \
|
||||
'body:<br>' \
|
||||
'<textarea name="a_body">'
|
||||
if(~ $name update)
|
||||
cat $a_dir/body
|
||||
echo '</textarea></div>'
|
||||
}
|
||||
if not if(~ $x img){
|
||||
echo '<div id="edit_img">' \
|
||||
'image:<br>' \
|
||||
'<input name="a_img" type="text" value="'$"a_img'" id="edit"> ' \
|
||||
'download: <input name="a_download" type="checkbox" value="1">' \
|
||||
'</div>'
|
||||
}
|
||||
if not if(~ $x tags){
|
||||
echo '<div id="edit_tags">' \
|
||||
'tags: (space separated list of tags)<br>' \
|
||||
'<input name="a_tags" type="text" value="'$"a_tags'" id="edit">' \
|
||||
'</div>'
|
||||
}
|
||||
if not{
|
||||
echo '<div id="edit_'$"x'">' \
|
||||
$"x':<br>' \
|
||||
'<input name="a_'$"x'" type="text" value="'$"$x'" id="edit">' \
|
||||
'</div>'
|
||||
}
|
||||
}
|
||||
echo '<div id="edit_submit">' \
|
||||
'<input type="submit" name="'$name'" value="'$name'">' \
|
||||
'</div>
|
||||
</form>
|
||||
</div>'
|
||||
}
|
||||
|
||||
fn edit_post{
|
||||
if(~ $#a_id 0){
|
||||
a_id=`{echo `{ls -p $barf_root/$"barf_dir/src | sort -n | tail -1}^+1 | bc}
|
||||
if(~ $#a_id 0)
|
||||
a_id=1
|
||||
while(test -d $barf_root/$"barf_dir/src/$a_id)
|
||||
a_id=`{echo $a_id^+1 | bc}
|
||||
}
|
||||
a_dir=$barf_root/$"barf_dir^src/$a_id
|
||||
mkdir -p $a_dir/img $a_dir/tags
|
||||
rm -f $a_dir/tags/*
|
||||
for(x in $barf_items){
|
||||
if(~ $x date){
|
||||
if(! ~ $#a_date 0)
|
||||
echo $"a_date >$a_dir/date
|
||||
if not
|
||||
date >$a_dir/date
|
||||
}
|
||||
if not if(~ $x tags){
|
||||
if(! ~ $#a_tags 0){
|
||||
a_tags=`{echo $"a_tags | sed 's/[^A-Za-z0-9_\- ]//g'}
|
||||
ifs=' '{a_tags=`{echo -n $a_tags}}
|
||||
{
|
||||
t=1
|
||||
while(test $t -le $#a_tags){
|
||||
>$a_dir/tags/$a_tags($t)
|
||||
t=`{echo $t^+1 | bc}
|
||||
}
|
||||
}
|
||||
for(i in $a_tags)
|
||||
echo $a_id'/tags/'$i >>$barf_root/$"barf_dir/tags
|
||||
}
|
||||
}
|
||||
if not if(! ~ $x img tags){
|
||||
item='a_'$"x
|
||||
if(! ~ $$item ''){
|
||||
>$a_dir/$x
|
||||
echo $$item >$a_dir/$x
|
||||
}
|
||||
}
|
||||
}
|
||||
if(~ $a_download 1){
|
||||
switch($barf_type){
|
||||
case image
|
||||
rm -f $a_dir/img/*
|
||||
img=$a_dir/img/^`{date -n}^.^`{echo $"a_img |
|
||||
sed 's/^.*\.(gif|GIF)$/gif/g;
|
||||
s/^.*\.(jpg|jpeg|JPG|JPEG)$/jpg/g;
|
||||
s/^.*\.(png|PNG)$/png/g;
|
||||
s/^.*\.(tif|TIF|tiff|TIFF)$/tif/g'
|
||||
}
|
||||
thumb=$a_dir/img/small.^`{basename $img | sed 's/\..*$//g'}^.png
|
||||
if(test -f /boot/factotum){
|
||||
@{
|
||||
rfork n
|
||||
if(test -f /rc/bin/hget)
|
||||
webfs
|
||||
hget $"a_img >$img
|
||||
#magick/convert $img -resize 500x600 $thumb
|
||||
switch($img){
|
||||
case *.bmp
|
||||
cmd=bmp
|
||||
case *.gif
|
||||
cmd=gif
|
||||
case *.ico
|
||||
cmd=ico
|
||||
case *.jpg
|
||||
cmd=jpg
|
||||
case *.png
|
||||
cmd=png
|
||||
case *.tif
|
||||
cmd=tif
|
||||
case *.tga
|
||||
cmd=tga
|
||||
}
|
||||
$cmd -9et <$img | resample -x 500 | topng >$thumb
|
||||
}
|
||||
}
|
||||
if not{
|
||||
curl -s -o $"a_img >$img
|
||||
convert $img -resize 500x600 $thumb
|
||||
}
|
||||
case url
|
||||
if(test -f /boot/factotum){
|
||||
@{
|
||||
rfork n
|
||||
if(test -f /rc/bin/hget)
|
||||
webfs
|
||||
hget $"a_link | htmlfmt | fmt >$a_dir/body
|
||||
}
|
||||
}
|
||||
if not
|
||||
curl -s $"a_link | htmlfmt | fmt >$a_dir/body
|
||||
}
|
||||
}
|
||||
if(! ~ $gp 1)
|
||||
post_redirect $base_url^$barf_base_uri
|
||||
}
|
||||
|
||||
fn get_post_list{
|
||||
if(~ $id [0-9]*)
|
||||
posts=$id
|
||||
if not{
|
||||
posts=`{
|
||||
if(~ $show_ascending 1)
|
||||
sort=(sort -n)
|
||||
if not
|
||||
sort=(sort -nr)
|
||||
if(~ $tags all)
|
||||
ls -p $barf_root/$"barf_dir/src |
|
||||
grep -e '^[0-9]*$' |
|
||||
eval $sort |
|
||||
sed -n $start^,^$stop^p # awk 'NR=='$start',NR=='$stop' {print;}'
|
||||
if not
|
||||
grep -e '^.*\/'$tags'$' $barf_root/$"barf_dir/tags |
|
||||
awk -F '/' '{print $1;}' |
|
||||
eval $sort |
|
||||
uniq |
|
||||
sed -n $start^,^$stop^p
|
||||
}
|
||||
if(! ~ $posts [0-9]*)
|
||||
posts=()
|
||||
}
|
||||
}
|
||||
|
||||
fn get_start{
|
||||
if(~ $#start 0)
|
||||
start=1
|
||||
}
|
||||
|
||||
fn get_stop{
|
||||
if(~ $#stop 0)
|
||||
stop=`{echo $start^+^$posts_per_page | bc}
|
||||
}
|
||||
|
||||
fn get_tags{
|
||||
if(~ $#tags 0)
|
||||
tags=all
|
||||
}
|
||||
|
||||
fn load_get_args{
|
||||
if(~ $REQUEST_METHOD GET && ~ $#get_args 0 && ~ $REQUEST_URI *'='*){
|
||||
ifs='&' {
|
||||
a=`{echo $"REQUEST_URI | sed 's/(^\/|#.*$)//g'}
|
||||
for(pair in $a){
|
||||
ifs='=' { pair=`{echo -n $pair} }
|
||||
n='get_arg_'^`{echo $pair(1) | urldecode | tr -cd 'a-zA-Z0-9_'}
|
||||
get_args=( $get_args $n )
|
||||
ifs=() { $n=`{echo -n $pair(2) | urldecode | tr -d '
'} }
|
||||
}
|
||||
}
|
||||
pair=()
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_get_args{
|
||||
if(! ~ $#get_arg_a_func 0)
|
||||
a_func=$get_arg_a_func
|
||||
if(! ~ $#get_arg_a_id 0)
|
||||
a_id=$get_arg_a_id
|
||||
if(! ~ $#get_arg_id 0)
|
||||
id=$get_arg_id
|
||||
if(! ~ $#get_arg_start 0)
|
||||
start=$get_arg_start
|
||||
if(! ~ $#get_arg_stop 0)
|
||||
stop=$get_arg_stop
|
||||
if(! ~ $#get_arg_reply 0)
|
||||
reply=$get_arg_reply
|
||||
if(! ~ $#get_arg_tags 0)
|
||||
tags=$get_arg_tags
|
||||
}
|
||||
|
||||
fn parse_post_args{
|
||||
for(x in $barf_items){
|
||||
a='a_'$"x
|
||||
p='post_arg_'$"a
|
||||
$a=$$p
|
||||
}
|
||||
if(! ~ $#post_arg_a_download 0)
|
||||
a_download=$post_arg_a_download
|
||||
if(! ~ $#post_arg_a_func 0)
|
||||
a_func=$post_arg_a_func
|
||||
if(! ~ $#post_arg_fake 0)
|
||||
fake=$post_arg_fake
|
||||
if(! ~ $#post_arg_a_id 0)
|
||||
a_id=$post_arg_a_id
|
||||
if(! ~ $#post_arg_url 0)
|
||||
url=$post_arg_url
|
||||
}
|
||||
|
||||
fn print_edit{
|
||||
edit='<a href="'$base_url^$barf_base_uri'?a_func=edit_form&a_id='$"a_id'">edit</a>'
|
||||
delete='<a href="'$base_url^$barf_base_uri'?a_func=delete_post&a_id='$"a_id'" onclick="return confirm(''are you sure you want to delete?'');">delete</a>'
|
||||
dsrc='<a href="'$base_url^$barf_base_uri'?a_func=dsrc&a_id='$"a_id'" onclick="return confirm(''are you sure you want to dsrc?'');">dsrc</a>'
|
||||
echo $"edit' | '$"delete' | '$"dsrc
|
||||
}
|
||||
|
||||
fn print_id{
|
||||
echo '<span id="post_id"><a href="/?id='$"a_id'">No.'$"a_id'</a></span>'
|
||||
}
|
||||
|
||||
fn print_img{
|
||||
a_img=`{ls -p $a_dir/img/[0-9]*}
|
||||
a_thumb=`{ls -p $a_dir/img/small*}
|
||||
if(! ~ $#a_img 0)
|
||||
if(~ $#a_thumb 0)
|
||||
a_thumb=$a_img
|
||||
echo '<a href="'$base_url^$barf_base_uri'src/'$a_id'/img/'$a_img'" target="_b"><img src="'$base_url^$barf_base_uri'src/'$a_id'/img/'$a_thumb'" border="0"></a>'
|
||||
}
|
||||
|
||||
fn print_tags{
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
a_tags=`{for(t in $a_tags) echo '<a href="'$base_url^$barf_base_uri'?tags='$t'">'$t'</a>, '}
|
||||
a_tags=`{echo $a_tags | awk '{print substr($0, 1, length($0) -1)}'}
|
||||
echo '<span id="post_tags">'$"a_tags'</span>'
|
||||
}
|
||||
|
||||
fn print_title{
|
||||
a_title=`{cat $a_dir/title}
|
||||
if(! ~ $#a_title 0){
|
||||
if(~ $barf_type log url)
|
||||
echo '<a href="'`{cat $a_dir/link}'">'$"a_title'</a>'
|
||||
if not
|
||||
echo '<a href="'$base_url^$barf_base_uri'?id='$"a_id'">'$"a_title'</a>'
|
||||
}
|
||||
}
|
||||
|
||||
fn redirect_bots{
|
||||
if(! ~ $fake fake || ! ~ $url '')
|
||||
post_redirect http://google.com
|
||||
}
|
||||
|
||||
fn urldecode {
|
||||
awk '
|
||||
BEGIN {
|
||||
hextab ["0"] = 0; hextab ["8"] = 8;
|
||||
hextab ["1"] = 1; hextab ["9"] = 9;
|
||||
hextab ["2"] = 2; hextab ["A"] = hextab ["a"] = 10
|
||||
hextab ["3"] = 3; hextab ["B"] = hextab ["b"] = 11;
|
||||
hextab ["4"] = 4; hextab ["C"] = hextab ["c"] = 12;
|
||||
hextab ["5"] = 5; hextab ["D"] = hextab ["d"] = 13;
|
||||
hextab ["6"] = 6; hextab ["E"] = hextab ["e"] = 14;
|
||||
hextab ["7"] = 7; hextab ["F"] = hextab ["f"] = 15;
|
||||
}
|
||||
{
|
||||
decoded = ""
|
||||
i = 1
|
||||
len = length ($0)
|
||||
while ( i <= len ) {
|
||||
c = substr ($0, i, 1)
|
||||
if ( c == "%" ) {
|
||||
if ( i+2 <= len ) {
|
||||
c1 = substr ($0, i+1, 1)
|
||||
c2 = substr ($0, i+2, 1)
|
||||
if ( hextab [c1] == "" || hextab [c2] == "" ) {
|
||||
print "WARNING: invalid hex encoding: %" c1 c2 | "cat >&2"
|
||||
} else {
|
||||
code = 0 + hextab [c1] * 16 + hextab [c2] + 0
|
||||
c = sprintf ("%c", code)
|
||||
i = i + 2
|
||||
}
|
||||
} else {
|
||||
print "WARNING: invalid % encoding: " substr ($0, i, len - i)
|
||||
}
|
||||
} else if ( c == "+" ) {
|
||||
c = " "
|
||||
}
|
||||
decoded = decoded c
|
||||
++i
|
||||
}
|
||||
printf "%s", decoded
|
||||
}
|
||||
'
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
% run_handler $handler_body_main
|
|
@ -1,68 +0,0 @@
|
|||
fn add_post{
|
||||
redirect_bots
|
||||
a_download=1
|
||||
edit_post
|
||||
}
|
||||
|
||||
fn display_image{
|
||||
echo '<div id="center">'
|
||||
if(~ $allow_anon 1 || {check_user && ! ~ $#logged_user 0}){
|
||||
echo '<div id="upload">
|
||||
<form method="post" action="/">
|
||||
<input type="hidden" name="fake" value="fake">
|
||||
<input type="text" name="url" style="display: none;">
|
||||
<input type="hidden" name="a_func" value="add_post">
|
||||
<div id="upload_heading">/'$tags'/</div>
|
||||
<table id="upload_table">
|
||||
<tr><td id="upload_label">Image</td><td><input type="text" name="a_img" id="upload_input"></td></tr>
|
||||
<tr><td id="upload_label">Link</td><td><input type="text" name="a_link" id="upload_input"></td></tr>
|
||||
<tr><td id="upload_label">Tags</td><td><input type="text" name="a_tags" id="upload_tags">
|
||||
<input type="submit" name="submit" value="add" id="upload_submit"></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td>
|
||||
<p>
|
||||
<li id="upload_meta">Supported file types are: GIF, JPG, PNG</li>
|
||||
<li id="upload_meta">Images greater than 500x600 pixels will be thumbnailed.</li>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>'
|
||||
}
|
||||
echo '<div id="center_body">'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<div id="post">
|
||||
<div id="post_meta">
|
||||
<span id="post_link">'
|
||||
link=`{cat $a_dir/link}
|
||||
echo '<a href="'$"link'">link</a>
|
||||
</span> |
|
||||
<span id="post_tags">'
|
||||
print_tags
|
||||
echo '</span> |
|
||||
<span id="post_date">'
|
||||
cat $a_dir/date
|
||||
echo '</span>'
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo '| <span id="post_edit">'
|
||||
print_edit
|
||||
echo '</span>'
|
||||
}
|
||||
echo '</div>
|
||||
<div id="post_img">'
|
||||
print_img
|
||||
echo '</div>
|
||||
</div>
|
||||
<br><br>'
|
||||
}
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
</div>'
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
fn display_log{
|
||||
if(~ $#logged_user 0)
|
||||
a='<a href="'$base_url^$barf_base_uri'login">login</a>'
|
||||
if not
|
||||
a='<a href="'$base_url^$barf_base_uri'?a_func=edit_form">add</a>'
|
||||
echo '<div>
|
||||
<span id="add">'$"a'</span>
|
||||
<span id="search">
|
||||
<form method="get" action="/">
|
||||
<input type="text" name="tags" size="28">
|
||||
<input type="submit" value="search">
|
||||
</form>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="list">
|
||||
<table id="post_table">
|
||||
<tbody>
|
||||
<tr id="blank">
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>'
|
||||
if(check_user && ! ~ $#logged_user 0)
|
||||
echo '<th style="display: none;"> </th>'
|
||||
echo '</tr>'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<tr>'
|
||||
for(j in $barf_items){
|
||||
echo '<td id="post_'$"j'">'
|
||||
if(~ $j img)
|
||||
print_img
|
||||
if not if(~ $j tags)
|
||||
print_tags
|
||||
if not if(~ $j title)
|
||||
print_title
|
||||
if not
|
||||
cat $a_dir/$j
|
||||
echo '</td>'
|
||||
}
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo '<td id="post_edit">'
|
||||
print_edit
|
||||
echo '</td>'
|
||||
}
|
||||
echo '</tr>'
|
||||
}
|
||||
echo '</tbody>
|
||||
</table>'
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>'
|
||||
}
|
|
@ -1,50 +0,0 @@
|
|||
fn add_post{
|
||||
redirect_bots
|
||||
a_date=`{date}
|
||||
edit_post
|
||||
}
|
||||
|
||||
fn display_paste{
|
||||
echo '<div id="center">'
|
||||
if(~ $allow_anon 1 || {check_user && ! ~ $#logged_user 0}){
|
||||
echo '<div id="paste">
|
||||
<p>
|
||||
<form method="post" action="/">
|
||||
<input type="hidden" name="fake" value="fake">
|
||||
<input type="text" name="url" style="display: none;">
|
||||
<input type="hidden" name="a_func" value="add_post">
|
||||
<textarea name="a_body" id="paste_box"></textarea><br>
|
||||
<input type="submit" name="submit" value="submit" id="paste_submit">
|
||||
</form>
|
||||
</div>'
|
||||
}
|
||||
echo '<p>
|
||||
<div id="posts">'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<div id="post">
|
||||
<div id="post_meta">'
|
||||
date=`{cat $a_dir/date}
|
||||
echo '<span id="post_date">
|
||||
<a href="/src/'$"a_id'/body" target="_b">'$"date'</a>
|
||||
</span>'
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo ' | <span id="post_edit">'
|
||||
print_edit
|
||||
echo '</span>'
|
||||
}
|
||||
echo '</div>
|
||||
<div id="post_body">'
|
||||
txt_handler $barf_root/$"barf_dir/src/$a_id/body
|
||||
echo '</div>
|
||||
</div>
|
||||
<br>'
|
||||
}
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>
|
||||
</div>
|
||||
</div>'
|
||||
}
|
|
@ -1,56 +0,0 @@
|
|||
fn display_rss{
|
||||
echo '<?xml version="1.0" encoding="UTF-8"?>'
|
||||
echo '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">'
|
||||
echo '<channel>'
|
||||
echo '<atom:link href="'$base_url^$req_path'" rel="self" type="application/rss+xml" />'
|
||||
echo '<title><![CDATA['$"siteTitle']]></title>'
|
||||
echo '<link>'$base_url^$barf_base_uri'</link>'
|
||||
echo '<description><![CDATA['$"blogDesc']]></description>'
|
||||
echo '<generator><![CDATA[barf]]></generator>'
|
||||
echo '<lastBuildDate>'
|
||||
ndate -m `{date `{mtime $barf_root/$"barf_dir/src | awk '{print $1}'}} # rfc2822 last time channel content changed.
|
||||
echo -n '</lastBuildDate>'
|
||||
echo '<language>en-us</language>'
|
||||
date=`{ndate -m} # rfc2822 publication date for content in the channel.
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<item>'
|
||||
echo '<guid isPermaLink="true">'$base_url^$barf_base_uri'?id='$"a_id'</guid>'
|
||||
echo '<pubDate>'$"date'</pubDate>'
|
||||
title=`{cat $a_dir/title}
|
||||
if(~ $title '')
|
||||
ntitle=($siteTitle $"a_id)
|
||||
if not
|
||||
ntitle=$title
|
||||
echo '<title>'$"ntitle'</title>'
|
||||
echo '<link>'$base_url^$barf_base_uri'?id='$"a_id'</link>'
|
||||
echo '<description><![CDATA['
|
||||
if(~ $obarf_type image){
|
||||
if(! ~ $#a_link 0)
|
||||
link=$"a_link
|
||||
if not
|
||||
link=$base_url^$barf_base_uri'?id='$"a_id
|
||||
echo '<p>source: <a href="'$"link'">link</a></p>'
|
||||
}
|
||||
a_tags=`{ls -p $a_dir/tags}
|
||||
if(! ~ $#a_tags 0){
|
||||
echo '<p>tags: '
|
||||
print_tags
|
||||
echo '</p>'
|
||||
echo '<p>'
|
||||
}
|
||||
# begin ugly if statements
|
||||
if(~ $obarf_type paste)
|
||||
echo '<pre>'
|
||||
if(! ~ $obarf_type image)
|
||||
cat $a_dir/body
|
||||
if(~ $obarf_type paste)
|
||||
echo '</pre>'
|
||||
if(~ $obarf_type image)
|
||||
print_img
|
||||
echo '</p>]]></description></item>'
|
||||
}
|
||||
echo '</channel></rss>'
|
||||
}
|
|
@ -1,52 +0,0 @@
|
|||
fn display_url{
|
||||
if(~ $#logged_user 0)
|
||||
a='<a href="'$base_url^$barf_base_uri'login">login</a>'
|
||||
if not
|
||||
a='<a href="'$base_url^$barf_base_uri'?a_func=edit_form">add</a>'
|
||||
echo '<div>
|
||||
<span id="add">'$"a'</span>
|
||||
<span id="search">
|
||||
<form method="get" action="/">
|
||||
<input type="text" name="tags" size="28">
|
||||
<input type="submit" value="search">
|
||||
</form>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="list">
|
||||
<table id="post_table">
|
||||
<tbody>
|
||||
<tr id="blank">
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>
|
||||
<th style="display: none;"> </th>'
|
||||
if(check_user && ! ~ $#logged_user 0)
|
||||
echo '<th style="display: none;"> </th>'
|
||||
echo '</tr>'
|
||||
get_post_list
|
||||
for(i in `{seq 1 $#posts}){
|
||||
a_id=$posts($i)
|
||||
a_dir=$barf_root/$"barf_dir/src/$a_id
|
||||
echo '<tr>
|
||||
<td id="post_title">'
|
||||
print_title
|
||||
echo '</td>
|
||||
<td id="post_tags">'
|
||||
print_tags
|
||||
echo '</td>
|
||||
<td id="post_date">'
|
||||
cat $a_dir/date
|
||||
echo '</td>'
|
||||
if(check_user && ! ~ $#logged_user 0){
|
||||
echo '<td id="post_edit">'
|
||||
print_edit
|
||||
echo '</td>'
|
||||
}
|
||||
echo '</tr>'
|
||||
}
|
||||
echo '</tbody>
|
||||
</table>'
|
||||
display_prevnext
|
||||
echo '<br><br><br><br>
|
||||
</div>'
|
||||
}
|
|
@ -1,10 +0,0 @@
|
|||
WERC=/usr/sl/www/werc
|
||||
PLAN9=$WERC/sites/plan9.stanleylieber.com
|
||||
|
||||
web:V:
|
||||
src=`{basename `{pwd}}
|
||||
rm -rf $PLAN9/werc/apps/$src
|
||||
cd $WERC/apps
|
||||
tar zcvf $PLAN9/werc/apps/$src.tgz $src
|
||||
cd $PLAN9/werc/apps
|
||||
tar zxvf $src.tgz
|
|
@ -1,344 +0,0 @@
|
|||
/* 1995 */
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/* # Header # */
|
||||
.superHeader {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
height: 1.6em;
|
||||
}
|
||||
|
||||
.superHeader img { vertical-align: bottom; }
|
||||
|
||||
.superHeader a {
|
||||
color: blue;
|
||||
background-color: transparent;
|
||||
font-size: 91%;
|
||||
margin: 0;
|
||||
padding: 0 0.5ex 0 0.25ex;
|
||||
text-decoration: underline; }
|
||||
}
|
||||
|
||||
a { text-decoration: underline; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
.superHeader div {
|
||||
position: absolute;
|
||||
top: 0.40ex;
|
||||
}
|
||||
|
||||
.superHeader .left { left: 0.4em; }
|
||||
.superHeader .right { right: 0.4em; }
|
||||
|
||||
.midHeader {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
border: solid 0 black;
|
||||
border-width: 1px 0;
|
||||
}
|
||||
|
||||
.headerTitle {
|
||||
color: black;
|
||||
font-size: 233%;
|
||||
font-weight: normal;
|
||||
margin: 0 0 0 4mm;
|
||||
padding: 0.25ex 0;
|
||||
}
|
||||
#headerSubTitle {
|
||||
font-size: 50%;
|
||||
font-style: italic;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
.headerTitle a { color: black; }
|
||||
.headerTitle a:hover { text-decoration: none; }
|
||||
|
||||
.subHeader {
|
||||
display: none;
|
||||
color: white;
|
||||
background-color: rgb(0,51,153);
|
||||
margin: 0;
|
||||
padding: 1ex 1ex 1ex 1.5mm;
|
||||
}
|
||||
|
||||
.subHeader a {
|
||||
color: white;
|
||||
background-color: transparent;
|
||||
font-weight: bold;
|
||||
margin: 0;
|
||||
padding: 0 0.75ex 0 0.5ex;
|
||||
}
|
||||
|
||||
.superHeader .highlight, .subHeader .highlight {
|
||||
color: rgb(253,160,91);
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
/* # Side # */
|
||||
#side-bar {
|
||||
width: 16em;
|
||||
float: left;
|
||||
clear: left;
|
||||
border-right: 1px solid black;
|
||||
}
|
||||
|
||||
#side-bar div {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
.sideBarTitle {
|
||||
font-weight: bold;
|
||||
margin: 0 0 0.5em 2mm;
|
||||
padding: 1em 0 0 0;
|
||||
}
|
||||
|
||||
#side-bar ul {
|
||||
list-style-type: none;
|
||||
list-style-position: outside;
|
||||
margin: 0;
|
||||
padding: 0 0 0.3em 0;
|
||||
}
|
||||
|
||||
li ul {
|
||||
padding-left: 0.6em !important;
|
||||
}
|
||||
|
||||
#side-bar li {
|
||||
margin: 0;
|
||||
padding: 0.1ex 0; /* Circumvents a rendering bug (?) in MSIE 6.0 XXX should move to iehacks.css, this causes an ugly gap */
|
||||
}
|
||||
|
||||
#side-bar a {
|
||||
color: black;
|
||||
background-color: transparent;
|
||||
margin: 0;
|
||||
padding: 0.25em 1ex 0.25em 2mm;
|
||||
display: block;
|
||||
text-transform: capitalize;
|
||||
font-weight: bold!important;
|
||||
font-size: 102%;
|
||||
border-left: blue solid 0.2em;
|
||||
}
|
||||
|
||||
.thisPage, .thisPage a {
|
||||
color: black!important;
|
||||
background-color: white;
|
||||
padding-left: 5mm;
|
||||
}
|
||||
|
||||
#side-bar a:hover {
|
||||
color: white;
|
||||
background-color: blue;
|
||||
border-left: black solid 0.2em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.sideBarText {
|
||||
line-height: 1.5em;
|
||||
margin: 0 0 1em 0;
|
||||
padding: 0 1.5ex 0 2.5mm;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#side-bar .sideBarText a {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#side-bar .sideBarText a:hover {
|
||||
color: black;
|
||||
background-color: transparent;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
|
||||
/* # Main Copy # */
|
||||
#main-copy {
|
||||
max-width: 70em;
|
||||
color: black;
|
||||
background-color: transparent;
|
||||
text-align: justify;
|
||||
line-height: 1.5em;
|
||||
margin: 0em 0 0 16em;
|
||||
padding: 0.5mm 5mm 5mm 5mm;
|
||||
border-left: 1px solid black;
|
||||
}
|
||||
|
||||
#bodyText {
|
||||
margin: 0 0 0 15.5em;
|
||||
padding: 2mm 5mm 2mm 5mm;
|
||||
}
|
||||
|
||||
#main-copy p {
|
||||
margin: 1em 1ex 1em 1ex !important; /* Need !important so troff-generated pages don't look totally squezed */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#main-copy a {
|
||||
color: blue;
|
||||
background-color: transparent;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#main-copy a:hover {
|
||||
color: blue;
|
||||
background-color: transparent;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
#main-copy h1, #main-copy h2 {
|
||||
color: black;
|
||||
background-color: transparent;
|
||||
font-size: 145.5%;
|
||||
font-weight: bold;
|
||||
margin: 2em 0 0 0;
|
||||
padding: 0.5ex 0 0.5ex 0.6ex;
|
||||
border-bottom: 2px solid black;
|
||||
}
|
||||
|
||||
#main-copy h2 {
|
||||
font-size: 115.5%;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
#main-copy .topOfPage {
|
||||
color: black;
|
||||
background-color: transparent;
|
||||
font-size: 91%;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
margin: 3ex 1ex 0 0;
|
||||
padding: 0;
|
||||
float: right;
|
||||
}
|
||||
|
||||
dl {
|
||||
margin: 1em 1ex 2em 1ex;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
margin: 0 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0 0 2em 2em;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/* # Footer # */
|
||||
#footer {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
padding: 1em;
|
||||
clear: both;
|
||||
border-color: black;
|
||||
border-width: 1px 0;
|
||||
}
|
||||
|
||||
#footer .left {
|
||||
text-align: left;
|
||||
line-height: 1.55em;
|
||||
float: left;
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#footer .right {
|
||||
text-align: right;
|
||||
line-height: 1.45em;
|
||||
}
|
||||
|
||||
#footer a {
|
||||
color: blue;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
/* GENERAL */
|
||||
|
||||
table {
|
||||
background-color: transparent;
|
||||
padding: 0px;
|
||||
border: 0px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 10px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
background: silver;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
}
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
acronym, .titleTip {
|
||||
border-bottom: 1px solid black;
|
||||
cursor: help;
|
||||
margin: 0;
|
||||
padding: 0 0 0.4px 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-left: 1px solid blue;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.smallCaps {
|
||||
font-size: 110%;
|
||||
font-variant: small-caps;
|
||||
}
|
||||
|
||||
.doNotDisplay { display: none; }
|
||||
|
||||
|
||||
.notify_errors,
|
||||
.notify_notes,
|
||||
.notify_success { padding: .8em; margin-bottom: 1em; border: 2px solid black; }
|
||||
|
||||
.notify_errors { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; }
|
||||
.notify_notes { background: #FFF6BF; color: #514721; border-color: #FFD324; }
|
||||
.notify_success { background: #E6EFC2; color: #264409; border-color: #C6D880; }
|
||||
.notify_errors a { color: #8a1f11; }
|
||||
.notify_notes a { color: #514721; }
|
||||
.notify_success a { color: #264409; }
|
||||
|
||||
|
||||
/* # Page/Handler specific # */
|
||||
h1.dir-list-head, ul.dir-list {
|
||||
text-transform: capitalize;
|
||||
font-weight: bold;
|
||||
}
|
||||
ul.sitemap-list a {
|
||||
text-transform: capitalize;
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
/* 1oct1993 */
|
||||
body {
|
||||
color: #FFFFFF;
|
||||
background-color: #000000;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: #00ADEF; }
|
||||
a:hover { color: #00ADEF; text-decoration: none; }
|
||||
li:hover { color: #00ADEF; text-decoration: none; }
|
||||
li a { color: #00ADEF }
|
||||
li a:hover { color: #00ADEF; text-decoration: none; }
|
||||
li ul { padding-left: 0.6em !important; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: #00ADEF; border: none; }
|
||||
table { border: none; }
|
||||
tr { background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: #00ADEF;
|
||||
}
|
||||
#header { flex-basis: 100%; }
|
||||
#header tr { background-color: transparent; }
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: #000000;
|
||||
color: #00ADEF;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: #00ADEF; text-decoration: none; }
|
||||
#footer a:hover { color: #00ADEF; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
#footer tr { background-color: transparent; }
|
|
@ -1,77 +0,0 @@
|
|||
/* flamesgif.com */
|
||||
body {
|
||||
color: black;
|
||||
background-color: silver;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: blue; }
|
||||
a:hover { color: purple;}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: silver;
|
||||
}
|
||||
li:hover { color: purple }
|
||||
li a { color: blue }
|
||||
li a:hover { color: purple; }
|
||||
h1 { font-size: 10pt; }
|
||||
h2, h3, h1, h4 { color : blue; }
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
input , textarea, select, option { background-color: blue; border: none; }
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
table { border: none; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
ul { list-style: none; padding-left: 0px; margin: 0px }
|
||||
#center {
|
||||
width: 600px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: silver;
|
||||
color: blue;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: blue; text-decoration: none; }
|
||||
#footer a:hover { color: purple; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
#right {
|
||||
float: right;
|
||||
position: absolute;
|
||||
top: 210px;
|
||||
right: 1px;
|
||||
width: 25%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
#sidebar {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
width: 95%;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
margin: 2px;
|
||||
background: silver;
|
||||
}
|
|
@ -1,53 +0,0 @@
|
|||
/* img.stanleylieber.com */
|
||||
body { display: flex; flex-wrap: wrap; font-family: sans; }
|
||||
header { flex-basis: 99%; flex-shrink: 0; padding-left: 1em; padding-bottom: 1em; }
|
||||
article { flex-basis: 99%; padding: 0; }
|
||||
footer { flex-basis: 99%; flex-shrink: 0; }
|
||||
header nav { display: flex; justify-content: space-between; }
|
||||
footer { display: flex; justify-content: space-between; }
|
||||
|
||||
body { margin:0; padding: 0; font-size: 10pt; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; background-color: #000000; color: #FFFFFF; }
|
||||
a { text-decoration: none; color: #FFFFFF; background-color: #000000; font-weight: bold; }
|
||||
a:hover { text-decoration: none; background-color: #FFFFFF; color: #000000; }
|
||||
|
||||
/* header and top bar */
|
||||
header h3 { padding-bottom: 2px; }
|
||||
header a img { vertical-align: bottom; padding-top: 1em; }
|
||||
|
||||
/* main copy */
|
||||
article { padding-left: 1em; padding-right: 1em; }
|
||||
article nav { padding-bottom: 2px; }
|
||||
article div { padding-top: 2px; padding-bottom: 2px; }
|
||||
article h1, article h2, article h3, article h4, article h5, article h6, article h7, article h8 {
|
||||
font-weight: bold; margin: 0; padding-bottom: 2px;
|
||||
}
|
||||
article a img { vertical-align: bottom; }
|
||||
article img { max-width: 100%!important; }
|
||||
article iframe { max-width: 100%!important; }
|
||||
article video { max-width: 100%!important; }
|
||||
article fieldset { color: #FFFFFF; border-color: #FFFFFF; }
|
||||
article legend { color: #FFFFFF; border-color: #FFFFFF; }
|
||||
|
||||
/* footer */
|
||||
footer > nav { margin-left: auto; padding: 1em; }
|
||||
|
||||
/* fixed-width fonts */
|
||||
pre, code { white-space: pre-wrap!important; }
|
||||
pre, code, blockquote {
|
||||
max-width: 100%!important;
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
}
|
||||
|
||||
/* input */
|
||||
input, textarea, select, option {
|
||||
font-family: Sans-Serif;
|
||||
font-size: 100%;
|
||||
padding: 2px;
|
||||
border-top: solid 1px #FFFFFF;
|
||||
border-bottom: solid 1px #FFFFFF;
|
||||
border-left: solid 1px #FFFFFF;
|
||||
border-right: solid 1px #FFFFFF;
|
||||
background-color: #000000;
|
||||
color: #FFFFFF;
|
||||
margin: 2px;
|
||||
}
|
|
@ -1,417 +0,0 @@
|
|||
/* inri.net */
|
||||
body {
|
||||
font-family :'Lucida Sans Unicode','Lucida Sans', 'Trebuchet MS', 'Lucida Grande', 'Bitstream Sans Vera', Verdana, Arial, Tahoma, Helvetica, Sans-Serif;
|
||||
font-style : normal;
|
||||
padding: 2px 2em;
|
||||
line-height: 1.5em;
|
||||
font-size: 70%;
|
||||
background: #FFF;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
|
||||
/* # Header # */
|
||||
.superHeader {
|
||||
color: white;
|
||||
background-color: gray;
|
||||
height: 1.6em;
|
||||
}
|
||||
|
||||
.superHeader img { vertical-align: bottom; }
|
||||
|
||||
.superHeader a {
|
||||
color: white;
|
||||
background-color: transparent;
|
||||
font-size: 91%;
|
||||
margin: 0;
|
||||
padding: 0 0.5ex 0 0.25ex;
|
||||
}
|
||||
|
||||
a { text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
.superHeader div {
|
||||
position: absolute;
|
||||
top: 0.40ex;
|
||||
}
|
||||
|
||||
.superHeader .left { left: 0.4em; }
|
||||
.superHeader .right { right: 0.4em; }
|
||||
|
||||
.midHeader {
|
||||
color: gray;
|
||||
background-color: gray;
|
||||
background-color: #ff6d06;
|
||||
border: solid 0 black;
|
||||
border-width: 2px 0;
|
||||
}
|
||||
|
||||
.headerTitle {
|
||||
color: black;
|
||||
font-size: 233%;
|
||||
font-weight: normal;
|
||||
margin: 0 0 0 4mm;
|
||||
padding: 0.25ex 0;
|
||||
}
|
||||
#headerSubTitle {
|
||||
font-size: 50%;
|
||||
font-style: italic;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
.headerTitle a { color: black; }
|
||||
.headerTitle a:hover { text-decoration: none; }
|
||||
|
||||
.subHeader {
|
||||
display: none;
|
||||
color: white;
|
||||
background-color: gray;
|
||||
margin: 0;
|
||||
padding: 1ex 1ex 1ex 1.5mm;
|
||||
}
|
||||
|
||||
.subHeader a {
|
||||
color: white;
|
||||
background-color: transparent;
|
||||
font-weight: bold;
|
||||
margin: 0;
|
||||
padding: 0 0.75ex 0 0.5ex;
|
||||
}
|
||||
|
||||
.superHeader .highlight, .subHeader .highlight {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
|
||||
/* # Side # */
|
||||
#side-bar {
|
||||
width: 16em;
|
||||
float: left;
|
||||
clear: left;
|
||||
border-right: 1px solid white;
|
||||
}
|
||||
|
||||
#side-bar div {
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
|
||||
.sideBarTitle {
|
||||
font-weight: bold;
|
||||
margin: 0 0 0.5em 2mm;
|
||||
padding: 1em 0 0 0;
|
||||
}
|
||||
|
||||
#side-bar ul {
|
||||
list-style-type: none;
|
||||
list-style-position: outside;
|
||||
margin: 0;
|
||||
padding: 0 0 0.3em 0;
|
||||
}
|
||||
|
||||
li ul {
|
||||
padding-left: 0.6em !important;
|
||||
}
|
||||
|
||||
#side-bar li {
|
||||
margin: 0;
|
||||
padding: 0.1ex 0; /* Circumvents a rendering bug (?) in MSIE 6.0 XXX should move to iehacks.css, this causes an ugly gap */
|
||||
}
|
||||
|
||||
#side-bar a {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
margin: 0;
|
||||
padding: 0.25em 1ex 0.25em 2mm;
|
||||
display: block;
|
||||
text-transform: capitalize;
|
||||
font-weight: bold!important;
|
||||
font-size: 102%;
|
||||
border-left: white solid 0.2em;
|
||||
}
|
||||
|
||||
.thisPage, .thisPage a {
|
||||
color: black!important;
|
||||
background-color: white;
|
||||
padding-left: 5mm;
|
||||
}
|
||||
|
||||
#side-bar a:hover {
|
||||
color: black;
|
||||
background-color: gray;
|
||||
border-left: gray solid 0.2em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.sideBarText {
|
||||
line-height: 1.5em;
|
||||
margin: 0 0 1em 0;
|
||||
padding: 0 1.5ex 0 2.5mm;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#side-bar .sideBarText a {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#side-bar .sideBarText a:hover {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
|
||||
/* # Main Copy # */
|
||||
#main-copy {
|
||||
max-width: 70em;
|
||||
color: black;
|
||||
background-color: transparent;
|
||||
text-align: justify;
|
||||
line-height: 1.5em;
|
||||
margin: 0em 0 0 16em;
|
||||
padding: 0.5mm 5mm 5mm 5mm;
|
||||
border-left: 1px solid white;
|
||||
}
|
||||
|
||||
#bodyText {
|
||||
margin: 0 0 0 15.5em;
|
||||
padding: 2mm 5mm 2mm 5mm;
|
||||
}
|
||||
|
||||
#main-copy p {
|
||||
margin: 1em 1ex 1em 1ex !important; /* Need !important so troff-generated pages don't look totally squezed */
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#main-copy a {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#main-copy a:hover {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#main-copy h1, #main-copy h2 {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
font-size: 145.5%;
|
||||
font-weight: bold;
|
||||
margin: 2em 0 0 0;
|
||||
padding: 0.5ex 0 0.5ex 0.6ex;
|
||||
border-bottom: 2px solid gray;
|
||||
}
|
||||
|
||||
#main-copy h2 {
|
||||
font-size: 115.5%;
|
||||
border-bottom: 1px solid gray;
|
||||
}
|
||||
|
||||
#main-copy .topOfPage {
|
||||
color: gray;
|
||||
background-color: transparent;
|
||||
font-size: 91%;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
margin: 3ex 1ex 0 0;
|
||||
padding: 0;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#post {
|
||||
position: relative;
|
||||
left: 23%;
|
||||
width: 76%;
|
||||
padding-top: 25px;
|
||||
padding-bottom: 25px;
|
||||
}
|
||||
|
||||
#post tr { background-color: transparent; }
|
||||
|
||||
#center {
|
||||
position: absolute;
|
||||
top: 210px;
|
||||
left: 1%;
|
||||
width: 65%;
|
||||
height: 100%;
|
||||
}
|
||||
#center h1 { font-size 8pt; font-family :'Lucida Sans Unicode','Lucida Sans', 'Trebuchet MS', 'Lucida Grande', 'Bitstream Sans Vera', Verdana, Arial, Tahoma, Helvetica, Sans-Serif; }
|
||||
|
||||
a { text-decoration: none; color: #000000; }
|
||||
a:hover { color: #111;}
|
||||
li:hover { color: #111 }
|
||||
li a { color: #000000 }
|
||||
li a:hover { color: #111; }
|
||||
ul { list-style: none; padding-left: 0px; margin: 0px }
|
||||
|
||||
h1 { font-size: 8pt; font-weight: normal; }
|
||||
h2 { font-size : 140%; }
|
||||
h3 { font-size: 120%; }
|
||||
h4 { font-size: 100%; }
|
||||
h2, h3, h1, h4 {
|
||||
font-family: Georgia,'Trebuchet MS', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Verdana, Arial, Tahoma, Helvetica, Sans-Serif;
|
||||
color : #000000;
|
||||
margin: 0px 0px;
|
||||
padding: 2px 0px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
input , textarea, select, option { background-color: #eee; border: none; }
|
||||
|
||||
dl {
|
||||
margin: 1em 1ex 2em 1ex;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: bold;
|
||||
margin: 0 0 0 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0 0 2em 2em;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#right {
|
||||
float: right;
|
||||
position: absolute;
|
||||
top: 210px;
|
||||
right: 1px;
|
||||
width: 34%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
/* sidebar */
|
||||
#sidebar {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
width: 95%;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
margin: 2px;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
#sidebar h2 {
|
||||
margin: 5px 0px 0px;
|
||||
padding: 4px 0px;
|
||||
font-size:100%;
|
||||
}
|
||||
#sidebar li { font-size: 8.5pt; }
|
||||
#sidebar ul { margin: 2px; }
|
||||
|
||||
/*searchform*/
|
||||
#searchform label { font-weight:bold; }
|
||||
#searchform input { width: 20%; }
|
||||
#searchform input.submit { width: 16%; }
|
||||
|
||||
#top {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 10%;
|
||||
width: 100%
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
|
||||
/* # Footer # */
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
#footer a { color: gray; text-decoration: none; }
|
||||
#footer a:hover { color: #111; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
|
||||
#footer .left {
|
||||
text-align: left;
|
||||
line-height: 1.55em;
|
||||
float: left;
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#footer .right {
|
||||
text-align: right;
|
||||
line-height: 1.45em;
|
||||
}
|
||||
|
||||
/* GENERAL */
|
||||
|
||||
table {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
tr {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
|
||||
acronym, .titleTip {
|
||||
border-bottom: 1px solid #ddd;
|
||||
cursor: help;
|
||||
margin: 0;
|
||||
padding: 0 0 0.4px 0;
|
||||
}
|
||||
|
||||
pre {
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: silver;
|
||||
}
|
||||
|
||||
.smallCaps {
|
||||
font-size: 110%;
|
||||
font-variant: small-caps;
|
||||
}
|
||||
|
||||
.doNotDisplay { display: none; }
|
||||
|
||||
|
||||
.notify_errors,
|
||||
.notify_notes,
|
||||
.notify_success { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; }
|
||||
|
||||
.notify_errors { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; }
|
||||
.notify_notes { background: #FFF6BF; color: #514721; border-color: #FFD324; }
|
||||
.notify_success { background: #E6EFC2; color: #264409; border-color: #C6D880; }
|
||||
.notify_errors a { color: #8a1f11; }
|
||||
.notify_notes a { color: #514721; }
|
||||
.notify_success a { color: #264409; }
|
||||
|
||||
|
||||
/* # Page/Handler specific # */
|
||||
h1.dir-list-head, ul.dir-list {
|
||||
text-transform: capitalize;
|
||||
font-weight: bold;
|
||||
}
|
||||
ul.sitemap-list a {
|
||||
text-transform: capitalize;
|
||||
}
|
|
@ -1,62 +0,0 @@
|
|||
/* mf */
|
||||
body {
|
||||
color: #a6a6a6;
|
||||
background-color: #626060;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: #a6a6a6; }
|
||||
a:hover { background-color: #a6a6a6; color: #626060; text-decoration: none; }
|
||||
a img { display: block; border: 0 none; }
|
||||
li:hover { background-color: #a6a6a6; color: #626060; text-decoration: none; }
|
||||
li a { color: #a6a6a6 }
|
||||
li a:hover { background-color: #a6a6a6; color: #626060; text-decoration: none; }
|
||||
li ul { padding-left: 0.6em !important; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: #a6a6a6; border: none; }
|
||||
table { border: none; background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
tr:nth-child(odd) { background-color: transparent; }
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: #a6a6a6;
|
||||
}
|
||||
#header {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: #626060;
|
||||
color: #a6a6a6;
|
||||
}
|
||||
#footer a { color: #a6a6a6; text-decoration: none; }
|
||||
#footer a:hover { color: #626060; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
|
@ -1,58 +0,0 @@
|
|||
/* okturing.com */
|
||||
body { display: flex; flex-wrap: wrap; font-family: sans; }
|
||||
header { flex-basis: 100%; flex-shrink: 0; }
|
||||
article { flex-basis: 100%; padding: 1em; }
|
||||
footer { flex-basis: 100%; flex-shrink: 0; }
|
||||
header nav { display: flex; justify-content: space-between; }
|
||||
nav a, header a { text-decoration: none ; color: inherit; }
|
||||
header h1 span { margin-left: 1em; font-size: 50%; font-style: italic; }
|
||||
body > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; }
|
||||
nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; }
|
||||
nav li ul { padding-left: 0.6em }
|
||||
footer { display: flex; justify-content: space-between; }
|
||||
|
||||
/* cut here to leave vanity behind */
|
||||
|
||||
body { margin:0; padding: 0; font-size: 84%; font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif; background-color: #FFFFFF; color: #000000; }
|
||||
a:hover { text-decoration: none; background-color: #FFFFFF; color: #000000; }
|
||||
|
||||
/* header and top bar */
|
||||
header nav { background-color: #FFFFFF; color: #000000; padding: 0em; border-bottom: 2px solid #FFFFFF; font-size: 91%; }
|
||||
header h1 { background-color: #FFFFFF; color: #000000; margin: 0; border-bottom: 2px solid #FFFFFF; font-weight: normal; padding: 0.25ex; font-size: 233%; }
|
||||
|
||||
/* sidebar */
|
||||
body > nav { border-right: 1px solid #FFFFFF; padding: 0; }
|
||||
body > nav > div { border-bottom: 1px solid #FFFFFF; }
|
||||
body > nav > div a { background-color: #00ff00; color: #000000; display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 102%}
|
||||
body > nav > div a:hover { color: #FFFFFF; background-color: #000000 border-left: #FFFFFF solid 0.2em; text-decoration: none; }
|
||||
body > nav > div p { font-weight: bold; margin: 0 0 0.5em 2mm; padding: 1em 0 0 0; }
|
||||
|
||||
/* main copy */
|
||||
article { padding: 1em; }
|
||||
article h1, article h2 { color: #000000; font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid #FFFFFF; }
|
||||
article h3, article h4, article h5 { #000000; font-weight: bold; margin: 2em 0 0 0; }
|
||||
article h6, article h7, article h8 { color: #000000; font-weight: bold; margin: 2em 0 0 0; }
|
||||
article a { background-color: #FFFFFF; color: #000000; text-decoration: none; }
|
||||
article a:hover { text-decoration: none; background-color: #000000; color: #FFFFFF; }
|
||||
article a img { display: block; border: 0 none; }
|
||||
|
||||
/* footer */
|
||||
footer { color: #000000; background-color: #FFFFFF; }
|
||||
footer a { background-color: #FFFFFF; color: #000000; }
|
||||
footer div { padding: 1em; }
|
||||
|
||||
input, textarea, select, option {
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size:100%;
|
||||
padding: 2px;
|
||||
background : #eee;
|
||||
color : #111;
|
||||
border: 1px solid #fff;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
pre, code, blockquote {
|
||||
white-space: pre-wrap;
|
||||
padding-left: 2em;
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
}
|
|
@ -1,345 +0,0 @@
|
|||
/* osx.stanleylieber.com */
|
||||
|
||||
body {
|
||||
font-family :Helvetica, Verdana, Arial, Sans-Serif;
|
||||
font-style : normal;
|
||||
padding: 2px 2em;
|
||||
line-height: 1.5em;
|
||||
font-size: 70%;
|
||||
background: #FFF;
|
||||
color: #111;
|
||||
}
|
||||
|
||||
/* font styles */
|
||||
a { text-decoration: none; color: #000000; }
|
||||
a:hover { background: #7600FC; color: #fff; }
|
||||
li:hover { color: #000000; }
|
||||
li a { color: #000000; }
|
||||
li a:hover { background: #7600FC; color: #fff; }
|
||||
ul { list-style: none; padding-left: 0px; margin: 0px }
|
||||
p {
|
||||
font-size : 100%;
|
||||
font-style : normal;
|
||||
padding: 0px;
|
||||
}
|
||||
h2 {
|
||||
font-size : 140%;
|
||||
}
|
||||
h3 {
|
||||
font-size: 120%;
|
||||
}
|
||||
h4 {
|
||||
font-size: 100%;
|
||||
}
|
||||
h2, h3, h1, h4 {
|
||||
font-family: Helvetica, Verdana, Arial, Sans-Serif;
|
||||
color : #000000;
|
||||
margin: 0px 0px;
|
||||
padding: 2px 0px;
|
||||
clear: both;
|
||||
}
|
||||
/* end font styles */
|
||||
|
||||
hr {
|
||||
border: 1px solid #fff;
|
||||
}
|
||||
|
||||
blockquote, code {
|
||||
background : #eee;
|
||||
padding: 6px;
|
||||
border-left: 3px solid #eee;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Sans-Serif;
|
||||
}
|
||||
|
||||
#admin_banner {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#admin_body {
|
||||
position: relative;
|
||||
top: 100px;
|
||||
left: 10px;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
#admin_frames {
|
||||
height: 100%;
|
||||
float: top;
|
||||
|
||||
/* for ie */
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
/* end for ie */
|
||||
|
||||
}
|
||||
|
||||
#admin_index_body {
|
||||
position: relative;
|
||||
top: 100px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
|
||||
#admin_menu {
|
||||
position: relative;
|
||||
left: 10px;
|
||||
width: 90%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#admin_table {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 90%;
|
||||
border-collapse: collapse;
|
||||
border-color: #111;
|
||||
font-family: sans-serif;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
#admin_table td {
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#admin_table th {
|
||||
background: #111;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#bottom {
|
||||
float: bottom;
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
}
|
||||
|
||||
#button input.submit {
|
||||
background: #111;
|
||||
color: gray;
|
||||
border-top: solid 1px #111;
|
||||
border-bottom: solid 1px #111;
|
||||
border-left: solid 1px #111;
|
||||
border-right: solid 1px #111;
|
||||
width: 15%;
|
||||
}
|
||||
|
||||
#center {
|
||||
position: absolute;
|
||||
top: 155px;
|
||||
left: 1%;
|
||||
width: 65%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#divider {
|
||||
background: #111;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
/*forms*/
|
||||
input , textarea, select, option {
|
||||
font-family : Helvetica, Verdana, Arial, Sans-Serif;
|
||||
font-size:100%;
|
||||
padding: 2px;
|
||||
background : #eee;
|
||||
color : #111;
|
||||
border: 1px solid #fff;
|
||||
margin: 2px;
|
||||
}
|
||||
fieldset, legend {
|
||||
background:transparent;
|
||||
color : #111;
|
||||
border: none;
|
||||
padding: 5px;
|
||||
}
|
||||
label, legend {
|
||||
font-weight:normal;
|
||||
}
|
||||
|
||||
#header {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 17%;
|
||||
height: 100%;
|
||||
font-size: 24pt;
|
||||
background: #7600FC;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
#header a {
|
||||
background: #7600FC;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#left {
|
||||
float: left;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 10%;
|
||||
width: 15%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
#meta {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#page_frames {
|
||||
width: 100%;
|
||||
float: left;
|
||||
|
||||
/* for ie */
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
/* end for ie */
|
||||
|
||||
}
|
||||
|
||||
#page_category {
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#page_list {
|
||||
text-align: right;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
#page_login {
|
||||
position: relative;
|
||||
text-align: right;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#page_upload {
|
||||
background: #111; color: #444; font-weight: bold
|
||||
}
|
||||
|
||||
#post {
|
||||
position: relative;
|
||||
left: 13%;
|
||||
width: 86%;
|
||||
padding-bottom: 100px;
|
||||
}
|
||||
|
||||
#post_body {
|
||||
position: relative;
|
||||
top: 10px;
|
||||
bottom: 10px;
|
||||
left: 10px;;
|
||||
}
|
||||
|
||||
#post_date {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_meta {
|
||||
margin-left: 2px;
|
||||
color: #111;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_tags {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_thumb {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#post_title {
|
||||
border: 1px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
#post_title a {
|
||||
background: red;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#post_title a:hover {
|
||||
background: #7600FC;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#post_title h2 {
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
#registration_body {
|
||||
left: 10px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#right {
|
||||
float: right;
|
||||
position: absolute;
|
||||
top: 150px;
|
||||
right: 1%;
|
||||
width: 33%;
|
||||
height: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#rss {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
/* sidebar */
|
||||
#sidebar {
|
||||
position: relative;
|
||||
z-index: 100;
|
||||
width: 90%;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
margin: 2px;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
#sidebar h2 {
|
||||
margin: 5px 0px 0px;
|
||||
padding: 4px 0px;
|
||||
font-size:100%;
|
||||
}
|
||||
#sidebar ul {
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
/*searchform*/
|
||||
#searchform label {
|
||||
font-weight:bold;
|
||||
}
|
||||
#searchform input#s {
|
||||
width: 40%;
|
||||
}
|
||||
#searchform input.submit {
|
||||
width: 16%;
|
||||
}
|
||||
|
||||
#top {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 10%;
|
||||
width: 100%
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.warning {
|
||||
color: #111;
|
||||
font-weight: bold;
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
/* other */
|
||||
body {
|
||||
color: blue;
|
||||
background-color: white;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
a { text-decoration: none; color: blue; }
|
||||
a:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
li:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
li a { color: blue; }
|
||||
li a:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: #eee; border: none; }
|
||||
li ul {
|
||||
padding-left: 0.6em !important;
|
||||
}
|
||||
table { border: none; background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
tr:nth-child(odd) { background-color: transparent; }
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: #eee;
|
||||
}
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
line-height: 0;
|
||||
}
|
||||
/* #center p {
|
||||
line-height: 1;
|
||||
-webkit-margin-before: 0px;
|
||||
-webkit-margin-after: 0px;
|
||||
} */
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: white;
|
||||
color: blue;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: blue; text-decoration: none; }
|
||||
#footer a:hover { color: purple; background-color: white; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
||||
#text { line-height: 1; }
|
|
@ -1,29 +0,0 @@
|
|||
/* black */
|
||||
header { flex-basis: 99%; flex-shrink: 0; padding-left: 1em; padding-bottom: 1em; }
|
||||
header h3 { padding-bottom: 2px; }
|
||||
header a img { vertical-align: bottom; padding-top: 1em; }
|
||||
body { font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; background-color: #000000; color: #FFFFFF; }
|
||||
a { text-decoration: none; color: #FFFFFF; background-color: #000000; font-weight: bold; }
|
||||
a:hover { text-decoration: none; background-color: #FFFFFF; color: #000000; }
|
||||
/* footer */
|
||||
footer > nav { margin-left: auto; padding: 1em; }
|
||||
|
||||
/* fixed-width fonts */
|
||||
pre, code { white-space: pre-wrap!important; }
|
||||
pre, code, blockquote {
|
||||
max-width: 100%!important;
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
}
|
||||
/* input */
|
||||
input, textarea, select, option {
|
||||
font-family: Sans-Serif;
|
||||
font-size: 100%;
|
||||
padding: 2px;
|
||||
border-top: solid 1px #FFFFFF;
|
||||
border-bottom: solid 1px #FFFFFF;
|
||||
border-left: solid 1px #FFFFFF;
|
||||
border-right: solid 1px #FFFFFF;
|
||||
background-color: #000000;
|
||||
color: #FFFFFF;
|
||||
margin: 2px;
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/* nothing */
|
||||
body {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
color: black;
|
||||
background-color: white;
|
||||
font-family: 'Lucida Sans Unicode', 'Lucida Sans', 'Lucida Grande', 'Bitstream Sans Vera', Sans-Serif;
|
||||
font-size: 84%; /* Enables font size scaling in MSIE */
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
header, article, footer { flex-basis: 100%; }
|
||||
a { text-decoration: none; color: gray; }
|
||||
a:hover { color: #111; text-decoration: none; }
|
||||
a img { display: block; border: 0 none; }
|
||||
li:hover { color: #111; text-decoration: none; }
|
||||
li a { color: gray }
|
||||
li a:hover { color: #111; text-decoration: none; }
|
||||
li ul { padding-left: 0.6em !important; }
|
||||
h1 { font-size: 10pt; font-weight: normal; }
|
||||
h2 { font-size: 9pt; font-weight: normal; }
|
||||
input , textarea, select, option { background-color: gray; border: none; }
|
||||
table { border: none; background-color: transparent; }
|
||||
th {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
tr:nth-child(odd) { background-color: transparent; }
|
||||
td {
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-width: 0px 0px 0.1em 0px;
|
||||
border-color: transparent;
|
||||
}
|
||||
pre, code, blockquote {
|
||||
font-family: Courier, 'Lucida Console','Courier New', Serif;
|
||||
margin-left: 2em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
blockquote {
|
||||
border-left: none;
|
||||
font-style: none;
|
||||
background-color: gray;
|
||||
}
|
||||
#center {
|
||||
width: 500px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#center h1 { font-size 9pt; }
|
||||
#footer {
|
||||
font-size: 8pt;
|
||||
background-color: white;
|
||||
color: gray;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
#footer a { color: gray; text-decoration: none; }
|
||||
#footer a:hover { color: #111; text-decoration: none; }
|
||||
#footer table { font-size: 8pt; }
|
|
@ -1,195 +0,0 @@
|
|||
/* url.stanleylieber.com */
|
||||
|
||||
body {
|
||||
font-family: Vera, Helvetica, Verdana, Arial, Sans-Serif;
|
||||
font-style: normal;
|
||||
padding: 2px 2em;
|
||||
line-height: 1.5em;
|
||||
font-size: 70%;
|
||||
background: #FFFFFF;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
a { text-decoration: none; color: #000000; }
|
||||
a:hover { background: #EEEEEE;}
|
||||
li:hover { background: #EEEEEE; }
|
||||
li a:hover { background: #EEEEEE; }
|
||||
ul { list-style: none; }
|
||||
|
||||
p {
|
||||
font-size : 100%;
|
||||
font-style : normal;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
h2 { font-size : 140%; }
|
||||
h3 { font-size: 120%; }
|
||||
h4 { font-size: 100%; }
|
||||
h2, h3, h1, h4 {
|
||||
margin: 0px 0px;
|
||||
padding: 2px 0px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
hr { border: 1px solid #fff; }
|
||||
|
||||
input {
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
|
||||
code, pre { font-family: Courier, 'Lucida Console','Courier New', Sans-Serif; }
|
||||
blockquote, code {
|
||||
background : #eee;
|
||||
padding: 6px;
|
||||
border-left: 3px solid #eee;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 10px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
background: #FFFFFF;
|
||||
}
|
||||
|
||||
textarea {
|
||||
height: 300px;
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
|
||||
tr {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #000000;
|
||||
}
|
||||
|
||||
#add {
|
||||
position: relative;
|
||||
top: 65px;
|
||||
left: 9%;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#blank {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-collapse: collapse;
|
||||
border-color: #FFFFFF;
|
||||
}
|
||||
|
||||
#bottom {
|
||||
float: bottom;
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#center {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: 130px;
|
||||
width: 90%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#edit {
|
||||
width: 750px;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#footer {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
bottom: 100px;
|
||||
}
|
||||
|
||||
#header {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: 40px;
|
||||
width: 83%;
|
||||
}
|
||||
|
||||
#logo { font-size: 40pt; color: #DDDDDD; }
|
||||
#logo a { font-size: 40pt; color: #CCCCCC; }
|
||||
#logo a:hover { background: #EEEEEE;}
|
||||
|
||||
#list {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: 90px;
|
||||
width: 90%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#meta { font-size: 8pt; }
|
||||
|
||||
#page_list {
|
||||
margin: 20px;
|
||||
text-align: right;
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
#post {
|
||||
position: relative;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
#post_meta { text-align: center; }
|
||||
|
||||
#post_date {
|
||||
width: 200px;
|
||||
text-align: center;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_edit {
|
||||
width: 100px;
|
||||
text-align: center;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_table {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
padding: 0px;
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
#post_tags {
|
||||
text-align: left;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
#post_title {
|
||||
text-align: left;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#search {
|
||||
position: absolute;
|
||||
top: 90px;
|
||||
right: 9%;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
#top {
|
||||
float: top;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 100px;
|
||||
width: 100%;
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
Trust, but verify.
|
|
@ -1 +0,0 @@
|
|||
Thu Aug 25 18:35:52 CDT 2011
|
|
@ -1 +0,0 @@
|
|||
http://plan9.stanleylieber.com/9front
|
|
@ -1 +0,0 @@
|
|||
This is a BULGE demo post.
|
|
@ -1,3 +0,0 @@
|
|||
1/tags/theory
|
||||
1/tags/random
|
||||
1/tags/demo
|
|
@ -1,148 +0,0 @@
|
|||
fn conf_enable_blog {
|
||||
blagh_uri=$conf_wd
|
||||
blagh_dirs=$*
|
||||
if(~ $#blagh_dirs 0)
|
||||
blagh_dirs=( . )
|
||||
conf_enable_app blagh
|
||||
|
||||
if(~ $"conf_blog_editors '')
|
||||
conf_blog_editors=blog-editors
|
||||
|
||||
if(~ $"conf_blog_only_pull '')
|
||||
conf_blog_only_pull=0
|
||||
|
||||
if(~ $"conf_max_posts_per_page '')
|
||||
conf_max_posts_per_page=32
|
||||
}
|
||||
|
||||
fn blagh_init {
|
||||
if(~ $#blagh_dirs 0 && ~ $req_path */[bB]log/*) {
|
||||
blagh_uri=`{echo $req_path | sed 's,(/[bB]log/).*,\1,'}
|
||||
blagh_dirs=( . )
|
||||
}
|
||||
|
||||
# Should not match sub-dirs!
|
||||
if(! ~ $#blagh_dirs 0) {
|
||||
# && test -d / `{echo '-a -d '^$blagh_root^$blagh_dirs}
|
||||
blagh_url=$base_url^$blagh_uri
|
||||
blagh_root=$sitedir^$blagh_uri
|
||||
if(check_user $conf_blog_editors && ! ~ $"conf_blog_only_pull '1') {
|
||||
editor_mode=on
|
||||
if(~ $"post_arg_date '')
|
||||
post_date=`{/bin/date -I|sed 's,-,/,g'}
|
||||
if not
|
||||
post_date=$post_arg_date
|
||||
ll_add handlers_bar_left echo '<a href="'$blagh_uri'new_post">Make a new post</a>'
|
||||
}
|
||||
|
||||
if(~ $req_path $blagh_uri) {
|
||||
handler_body_main=blagh_body
|
||||
u=$blagh_uri'index'
|
||||
extraHeaders=$"extraHeaders ^ \
|
||||
'<link rel="alternate" type="application/atom+xml" title="ATOM" href="'$"u'.atom" />
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="'$"u'.rss" />
|
||||
<link rel="alternate" type="application/json" title="JSON" href="'$"blagh_uri'feed.json" />'
|
||||
}
|
||||
if not if(~ $req_path $blagh_uri^index.atom)
|
||||
blagh_setup_feed_handlers atom.tpl 'application/atom+xml'
|
||||
|
||||
if not if(~ $req_path $blagh_uri^index.rss)
|
||||
blagh_setup_feed_handlers rss20.tpl 'text/xml; charset=utf-8'
|
||||
|
||||
if not if(~ $req_path $blagh_uri^feed.json)
|
||||
blagh_setup_feed_handlers jsonfeed.tpl 'application/json; charset=utf-8'
|
||||
|
||||
if not if(~ $req_path $blagh_uri^new_post && ! ~ $#editor_mode 0) {
|
||||
handler_body_main=( tpl_handler `{get_lib_file blagh/new_post.tpl apps/blagh/new_post.tpl} )
|
||||
if(~ $REQUEST_METHOD POST) {
|
||||
if(mkbpost $"post_arg_body $"post_date $"post_arg_title $post_arg_id)
|
||||
post_redirect $blagh_uri
|
||||
if not
|
||||
notify_errors=$status
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
fn blagh_setup_feed_handlers {
|
||||
handler_body_main=NOT_USED_by_blagh_feeds
|
||||
res_tail=()
|
||||
http_content_type=$2
|
||||
headers=()
|
||||
master_template=apps/blagh/$1 # Should we allow tempalte override?
|
||||
}
|
||||
|
||||
fn blagh_body {
|
||||
echo '<div class="bfeed">'
|
||||
if (! ~ $"blogTitle '')
|
||||
echo '<h1>'$"blogTitle'</h1>'
|
||||
|
||||
# Direct links to feeds are disabled because they are not very useful, add clutter and might waste pagerank.
|
||||
# An user can add this on their own using handlers_body_head anyway.
|
||||
#echo '<div style="text-align:right">(<a href="index.rss">RSS Feed</a>|<a href="index.atom">Atom Feed</a>)</div>'
|
||||
|
||||
# XXX Not sure why this fixes issues with blog setup, probably bug in fltr_cache!
|
||||
for(p in `{get_post_list $blagh_root^$blagh_dirs}) {
|
||||
l=`{echo -n $p|sed 's!'$sitedir^'/?(.*)([0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9])(/[^/]+/)!\2 /\1\2\3!'}
|
||||
sed '1s!.*^') ('^$l(1)^')!' < $p/index.md |
|
||||
sed 's!\([0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]\)!<div class="date">&</div>!'
|
||||
echo # Needed extra \n so markdown doesn't mess up the formatting, probably can be done in sed.
|
||||
} | $formatter
|
||||
# XXX BUG! Markdown [references] break because multiple markdown documents are merged. Should format each blog post independently.
|
||||
# TODO: use fltr_cache directly, that can fix the previous bug plus provide a perf boost by caching title generation.
|
||||
echo '</div>'
|
||||
}
|
||||
|
||||
fn get_post_list {
|
||||
# /./->/|/ done to sort -t| and order by date
|
||||
# Note: $paths in blagh_dirs should not contain '/./' or '|'
|
||||
ls -F $*^/./[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/ >[2]/dev/null | sed -n '/'^$forbidden_uri_chars^'/d; s,/\./,/|/,; /\/$/p' | sort -r '-t|' +1 | sed -e 's,/+\|/+,/,' -e $conf_max_posts_per_page^'q'
|
||||
}
|
||||
|
||||
fn mkbpost {
|
||||
bptext=$1;
|
||||
bpdate=$2;
|
||||
bptitle=$3;
|
||||
bpid=$4;
|
||||
_status=()
|
||||
if(~ $"bptext '')
|
||||
_status=($_status 'You need to provide a post body.')
|
||||
if(! ~ $"bpdate [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9])
|
||||
_status=($_status 'Invalid date: '''^$"bpdate^'''') # XXX Should make semantic check.
|
||||
|
||||
if(~ $#_status 0) {
|
||||
umask 002 # Let group write
|
||||
if(! ~ $"bpid '')
|
||||
bpid=`{echo -n '-'^$bpid | sed 's/'$forbidden_uri_chars'+/_/g; 1q'}
|
||||
|
||||
ddir=$blagh_root^$bpdate^'/'
|
||||
n=`{ls $ddir >[2]/dev/null |wc -l}
|
||||
|
||||
mkdir -p $ddir/$"n^$"bpid/
|
||||
{
|
||||
if(! ~ $"bptitle '') {
|
||||
echo $bptitle
|
||||
echo '-------------------------------------'
|
||||
}
|
||||
# TODO: Enable metadata
|
||||
#echo '* Posted:' `{date}
|
||||
#if(! ~ $#logged_user 0)
|
||||
# echo '* Author: '$logged_user
|
||||
echo
|
||||
echo $bptext
|
||||
}> $ddir/$"n^$"bpid/index.md
|
||||
|
||||
# Experimental support for http://pubsubhubbub.googlecode.com/
|
||||
if(! ~ $"conf_blog_pubsubdub_hub '') {
|
||||
ifs='' { p=`{echo $req_url|sed 's/new_post$/index.atom/'|url_encode } }
|
||||
dprint hget -p 'hub.mode=publish&hub.url='^$"p $conf_blog_pubsubdub_hub
|
||||
hget -d -h -p 'hub.mode=publish&hub.url='^$"p $conf_blog_pubsubdub_hub >[1=2] &
|
||||
}
|
||||
}
|
||||
status=$_status
|
||||
}
|
||||
|
||||
fn strip_title_from_md_file {
|
||||
sed '1N; /^.*\n===*$/N; /.*\n===*\n$/d'
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
%{
|
||||
# See for more info:http://www.tbray.org/ongoing/When/200x/2005/07/27/Atomic-RSS
|
||||
fn statpost {
|
||||
f = $1
|
||||
|
||||
post_uri=$base_url^`{cleanname `{echo $f | sed -e 's!^'$sitedir'!!'}}^'/'
|
||||
title=`{read $f/index.md}
|
||||
by=`{ls -m $f | sed 's/^\[//g; s/].*$//g' >[2]/dev/null}
|
||||
ifs=() { summary=`{cat $f/index.md | strip_title_from_md_file | ifs=$difs {$formatter} } }
|
||||
}
|
||||
# rfc3339 date when feed was last updated.
|
||||
fupdated = `{ndate -a `{date `{mtime `{ls $blagh_root$blagh_dirs/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9] | tail -1} | awk '{print $1}'}}}
|
||||
%}
|
||||
|
||||
<feed xmlns="http://www.w3.org/2005/Atom"
|
||||
xmlns:thr="http://purl.org/syndication/thread/1.0">
|
||||
|
||||
% if(! ~ $"conf_blog_pubsubdub_hub '') {
|
||||
% echo '<link rel="hub" href="'$conf_blog_pubsubdub_hub'" />'
|
||||
% }
|
||||
|
||||
<link rel="self" href="%($base_url^$req_path%)"/>
|
||||
<id>%($base_url^$req_path%)</id>
|
||||
<icon><![CDATA[/favicon.ico]]></icon>
|
||||
|
||||
<title><![CDATA[%($siteTitle%)]]></title>
|
||||
<subtitle><![CDATA[%($siteSubTitle%)]]></subtitle>
|
||||
|
||||
<updated>%($fupdated%)</updated>
|
||||
<link href="."/>
|
||||
|
||||
% for(f in `{get_post_list $blagh_root$blagh_dirs}) {
|
||||
% statpost $f
|
||||
|
||||
<entry>
|
||||
% # Maybe we should be smarter, see: http://diveintomark.org/archives/2004/05/28/howto-atom-id, example: <id>tag:intertwingly.net,2004:2899</id>
|
||||
<id>%($post_uri%)</id>
|
||||
<link href="%($post_uri%)"/>
|
||||
<title><![CDATA[%($title%)]]></title>
|
||||
% # <link rel="replies" href="2899.atom" thr:count="0"/>
|
||||
<author><name><![CDATA[%($by%)]]></name></author>
|
||||
|
||||
<content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">
|
||||
<![CDATA[%($summary%)]]>
|
||||
</div></content>
|
||||
|
||||
% # rfc3339 date when entry was last updated.
|
||||
% eupdated=`{ndate -a `{date `{mtime $f | awk '{print $1}'}}}
|
||||
<updated>%($eupdated%)</updated>
|
||||
</entry>
|
||||
|
||||
% }
|
||||
|
||||
</feed>
|
||||
|
||||
% exit
|
|
@ -1,20 +0,0 @@
|
|||
#!/usr/bin/env rc
|
||||
|
||||
path=($PLAN9/bin/ $path)
|
||||
|
||||
for(p in *.md) {
|
||||
echo
|
||||
echo '========================='
|
||||
echo p $p
|
||||
pp=`{echo $p | sed 's/^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])[\-_](.*).md$/\1 \2 \3 \4/' }
|
||||
echo pp $pp
|
||||
|
||||
d=$pp(1)^'/'^$pp(2)^'/'^$pp(3)^'/'^$pp(4)^'/'
|
||||
|
||||
mkdir -p $d
|
||||
echo $pp(4) | sed -e 's/^[0-9]_//; s/_/ /g;' > $d/index.md
|
||||
echo '=================================' >> $d/index.md
|
||||
echo >> $d/index.md
|
||||
cat $p >> $d/index.md
|
||||
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"version": "https://jsonfeed.org/version/1",
|
||||
"title": "%($siteTitle%)",
|
||||
"home_page_url": "%($"base_url%)",
|
||||
"feed_url": "%($"base_url^$"req_path%)",
|
||||
"items": [
|
||||
%{
|
||||
fn statpost {
|
||||
f = $1
|
||||
post_uri=$base_url^`{cleanname `{echo $f | sed -e 's!^'$sitedir'!!'}}^'/'
|
||||
title=`{read $f/index.md}
|
||||
#ifs=() { summary=`{cat $f/index.md | crop_text 1024 ... | $formatter } }
|
||||
ifs=() { summary=`{cat $f/index.md | strip_title_from_md_file | ifs=$difs {$formatter| sed 's/"/\\"/g' | tr -d '\012' } } }
|
||||
}
|
||||
%}
|
||||
% #for(f in `{get_post_list $blagh_root$blagh_dirs}) {
|
||||
%
|
||||
% postlist=`{get_post_list $blagh_root$blagh_dirs}
|
||||
% postcount=0
|
||||
% for(f in $postlist) {
|
||||
% statpost $f
|
||||
{
|
||||
"id": "%($post_uri%)",
|
||||
"url": "%($post_uri%)",
|
||||
"title": "%($title%)",
|
||||
"content_html": "%($summary%)"
|
||||
}
|
||||
% postcount = `{echo $postcount 1+p | dc}
|
||||
% if (! ~ $#postlist $postcount) { echo , }
|
||||
% }
|
||||
]
|
||||
}
|
||||
|
||||
% exit
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
<div>
|
||||
% notices_handler
|
||||
<form method="POST"><fieldset>
|
||||
<legend>Submit a new blog post</legend>
|
||||
<textarea cols="94" rows=16" name="body">%($"post_arg_body%)</textarea><br />
|
||||
<label>Title: <input size="64" type="text" name="title" value="%($"post_arg_title%)" /></label>
|
||||
<label>Id: <input size="8" type="text" name="id" value="%($"post_arg_id%)" /></label>
|
||||
<label>Date: <input size="10" maxlength="10" type="text" name="date" value="%($"post_date%)" /></label>
|
||||
<input type="submit" value="Post" />
|
||||
</fieldset></form>
|
||||
</div>
|
|
@ -1,43 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
%{
|
||||
fn statpost {
|
||||
f = $1
|
||||
post_uri = `{echo $f | sed 's,^'$sitedir',,'}
|
||||
title=`{read $f/index.md}
|
||||
post_uri=$base_url^`{cleanname `{echo $f | sed -e 's!^'$sitedir'!!'}}^'/'
|
||||
by=`{ls -m $f | sed 's/^\[//g; s/].*$//g' >[2]/dev/null}
|
||||
ifs=() {summary=`{ cat $f/index.md |strip_title_from_md_file| ifs=$difs {$formatter | escape_html} }}
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<atom:link href="%($base_url^$req_path%)" rel="self" type="application/rss+xml" />
|
||||
<title><![CDATA[%($siteTitle%)]]></title>
|
||||
<link>%($base_url^$req_path%)</link>
|
||||
<description><![CDATA[%($blogDesc%)]]></description>
|
||||
<language>en-us</language>
|
||||
<generator><![CDATA[werc blagh app]]></generator>
|
||||
%{
|
||||
# <webMaster>uriel99+rss@gmail.com (Uriel)</webMaster>
|
||||
# rfc2822 last time channel content changed.
|
||||
lbd=`{ndate -m `{date `{mtime `{ls $blagh_root$blagh_dirs/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/[0-9] | tail -1} | awk '{print $1}'}}}
|
||||
echo '<lastBuildDate>'$"lbd'</lastBuildDate>'
|
||||
# rfc2822 publication date for content in the channel.
|
||||
pubdate=`{ndate -m}
|
||||
for(f in `{get_post_list $blagh_root$blagh_dirs}){
|
||||
statpost $f
|
||||
%}
|
||||
<item>
|
||||
<title><![CDATA[%($title%)]]></title>
|
||||
<author><![CDATA[%($by%)]]></author>
|
||||
<link>%($post_uri%)</link>
|
||||
<guid isPermaLink="true">%($post_uri%)</guid>
|
||||
<pubDate>%($pubdate%)</pubDate>
|
||||
<description> %($summary%) </description>
|
||||
</item>
|
||||
% }
|
||||
</channel>
|
||||
</rss>
|
|
@ -1,103 +0,0 @@
|
|||
comment_file_types=(md html)
|
||||
|
||||
fn conf_enable_comments {
|
||||
if(~ $1 -n) {
|
||||
allow_new_user_comments=yes
|
||||
shift
|
||||
}
|
||||
if not if(~ $1 -a) {
|
||||
bridge_anon_comments=yes
|
||||
}
|
||||
enable_comments=yes
|
||||
groups_allowed_comments=$*
|
||||
conf_enable_app bridge
|
||||
}
|
||||
|
||||
fn bridge_init {
|
||||
if(~ $#enable_comments 1 && ! ~ `{ls $local_path.$comment_file_types >[2]/dev/null|wc -l} 0) {
|
||||
|
||||
comments_dir=$sitedir$req_path'_werc/comments'
|
||||
if(~ $REQUEST_METHOD GET && test -d $comments_dir)
|
||||
ll_add handlers_body_foot template apps/bridge/comments_list.tpl
|
||||
|
||||
if(check_user $groups_allowed_comments || {~ $#logged_user 0 && ~ 1 $#allow_new_user_comments $#bridge_anon_comments}) {
|
||||
|
||||
if(~ $#post_arg_bridge_post 1) {
|
||||
ll_add handlers_body_foot template apps/bridge/foot.tpl
|
||||
|
||||
if(mk_new_comment $comments_dir)
|
||||
post_redirect $base_url^$req_path
|
||||
if not
|
||||
saved_comment_text=$post_arg_comment_text
|
||||
}
|
||||
if not if(~ $REQUEST_METHOD GET)
|
||||
ll_add handlers_body_foot template apps/bridge/foot.tpl
|
||||
}
|
||||
if not if(~ $REQUEST_METHOD GET)
|
||||
ll_add handlers_body_foot echo '<hr><p>To post a comment you need to <a href="/_users/login">login</a> first.</p>'
|
||||
}
|
||||
}
|
||||
|
||||
fn validate_new_user {
|
||||
usr=$1; pass=$2; pass2=$3
|
||||
_status=()
|
||||
|
||||
if(~ $"usr '' || ! echo $usr |sed 1q|grep -s '^'$allowed_user_chars'+$')
|
||||
_status='Requested user name is invalid, must match: '^$allowed_user_chars^'+'
|
||||
if not if(test -d etc/users/$usr)
|
||||
_status='Sorry, user name '''^$usr^''' already taken, please pick a different one.'
|
||||
|
||||
if(~ $"pass '' || ! ~ $"pass $"pass2)
|
||||
_status=($_status 'Provided passwords don''t match.')
|
||||
|
||||
status=$_status
|
||||
}
|
||||
|
||||
|
||||
fn mk_new_comment {
|
||||
_status=()
|
||||
dir=$1
|
||||
if(~ $"post_arg_comment_text '')
|
||||
_status='Provide a comment!'
|
||||
if not if(~ $#logged_user 0) {
|
||||
if(! ~ $#allow_new_user_comments 0) {
|
||||
if(validate_new_user $"post_arg_comment_user $post_arg_comment_passwd $post_arg_comment_passwd2) {
|
||||
u=$post_arg_comment_user':'$post_arg_comment_passwd
|
||||
dir=$comments_dir^'_pending'
|
||||
# XXX: This doesn't work because we then do a redirect.
|
||||
notify_notes='Saved comment and registration info, they will be enabled when approved by an admin.'
|
||||
}
|
||||
if not
|
||||
_status=$status
|
||||
}
|
||||
if not if(! ~ $#bridge_anon_comments 0) {
|
||||
if(~ $"post_arg_ima_robot 'not')
|
||||
u='Glenda' # Anonymous
|
||||
if not
|
||||
_status='You are a robot!'
|
||||
}
|
||||
if not
|
||||
_status='You need to log in to comment.'
|
||||
}
|
||||
if not if(check_user $groups_allowed_comments)
|
||||
u=$logged_user
|
||||
if not
|
||||
_status='You are not a member of a group allowed to comment.'
|
||||
|
||||
if(~ $#_status 0) {
|
||||
umask 002
|
||||
|
||||
dir=$dir'/'`{date -n} # FIXME Obvious race
|
||||
mkdir -m 775 -p $dir &&
|
||||
echo $u > $dir/user &&
|
||||
echo $current_date_time > $dir/posted &&
|
||||
echo $post_arg_comment_text > $dir/body
|
||||
_s=$status
|
||||
if(! ~ $"_s '') {
|
||||
dprint 'ERROR XXX: Could not create comment: ' $_s
|
||||
_status='Could not post comment due internal error, sorry.'
|
||||
}
|
||||
}
|
||||
notify_errors=$_status
|
||||
status=$_status
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
<hr>
|
||||
<h2>Comments</h2>
|
||||
|
||||
% for(c in `{ls $comments_dir/}) {
|
||||
% if(test -s $c/body) {
|
||||
<div class="comment">
|
||||
<h5>By: <i>%(`{cat $c/user}%)</i></b> (%(`{cat $c/posted}%))
|
||||
</h5>
|
||||
% cat $c/body | escape_html | sed 's,$,<br>,'
|
||||
<hr></div>
|
||||
% }
|
||||
% }
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<hr>
|
||||
|
||||
% notices_handler
|
||||
<form action="" method="post">
|
||||
<textarea name="comment_text" id="comment_text">%($"saved_comment_text%)</textarea>
|
||||
<br>
|
||||
<input type="submit" name="bridge_post" value="Post a comment">
|
||||
|
||||
% if(~ $#logged_user 0) {
|
||||
% if(~ $#allow_new_user_comments 1) {
|
||||
<label>New user name:
|
||||
<input type="text" name="comment_user" value="%($"post_arg_comment_user%)">
|
||||
</label>
|
||||
|
||||
<label>Password:
|
||||
<input type="password" name="comment_passwd" value="">
|
||||
</label>
|
||||
|
||||
<label>Repeat password:
|
||||
<input type="password" name="comment_passwd2" value="">
|
||||
</label>
|
||||
<div style="font-size: 70%">
|
||||
Enter your desired user name/password and after your comment has been reviewed by an admin it will be posted and your account will be enabled. If you are already registered please <a href="/_users/login">login</a> before posting.
|
||||
</div>
|
||||
% }
|
||||
% if not if(~ $#bridge_anon_comments 1) {
|
||||
<label>Is <a href="http://glenda.cat-v.org">Glenda a cute bunny</a>?
|
||||
<select name='ima_robot'>
|
||||
<option value="yes">No</option>
|
||||
<option value="not">Yes</option>
|
||||
<option value="foobar">I hate bunnies!</option>
|
||||
<option value="robot">I'm a robot!</option>
|
||||
</select>
|
||||
</label>
|
||||
% }
|
||||
% }
|
||||
</form>
|
|
@ -1,38 +0,0 @@
|
|||
fn conf_enable_cssedit {
|
||||
enable_cssedit=yes
|
||||
cssedit_editors_groups=$*
|
||||
conf_enable_app cssedit
|
||||
css_file='_werc/style.css' # Default location, can be changed
|
||||
}
|
||||
|
||||
fn cssedit_init {
|
||||
if(! ~ $#enable_cssedit 0) {
|
||||
css_uri=`{echo $req_path | sed 's,(([^/]*)[^/]).*,\1,'}^/
|
||||
extraHeaders=$"extraHeaders ^ \
|
||||
'<link rel="stylesheet" type="text/css" href="'$css_uri'_werc/style.css">'
|
||||
}
|
||||
if(! ~ $#enable_cssedit 0 && check_user $cssedit_editors_groups && ~ $req_path $css_uri) {
|
||||
lp=$local_path
|
||||
lp=`{echo $lp | sed 's/index$//'}
|
||||
cssedit_file=$"lp$"css_file
|
||||
|
||||
if(~ 1 $#post_arg_cssedit_edit $#post_arg_cssedit_preview) {
|
||||
handler_body_main=(tpl_handler `{get_lib_file cssedit/edit.tpl apps/cssedit/edit.tpl})
|
||||
}
|
||||
|
||||
if not if(! ~ '' $"post_arg_cssedit_save $"post_arg_css_text) {
|
||||
save_css
|
||||
}
|
||||
|
||||
if not if(~ $"handler_body_main '' || {~ $REQUEST_METHOD GET && test -f $cssedit_file}) {
|
||||
ll_add handlers_bar_left tpl_handler apps/cssedit/sidebar_controls.tpl
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn save_css {
|
||||
umask 002
|
||||
echo $post_arg_css_text > $cssedit_file
|
||||
post_redirect $base_url^$req_path
|
||||
}
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
<div>
|
||||
<h1>Editing CSS: <a href="%($css_file%)">%($css_file%)</a></h1>
|
||||
<br>
|
||||
<form action="" method="POST">
|
||||
<fieldset>
|
||||
<textarea name="css_text" id="css_text" cols="80" rows="43">%{
|
||||
if(~ $#post_arg_css_text 0 && test -f $cssedit_file)
|
||||
cat $cssedit_file | escape_html
|
||||
if not
|
||||
echo -n $post_arg_css_text | escape_html
|
||||
%}</textarea>
|
||||
<br>
|
||||
<a class="bu" href="%($css_file%)" download="%(style`{date -n}.css%)">Download Stylesheet</a>
|
||||
<hr>
|
||||
<input type="submit" name="cssedit_save" value="Save">
|
||||
<small><strong>Note:</strong> Saved changes are final, historical versions of stylesheet are not kept.</small>
|
||||
</fieldset>
|
||||
</form>
|
||||
<h2>Tips</h2>
|
||||
<div class="info">
|
||||
<ul>
|
||||
<li>Pressing <code>F12</code> in your browser and editing the style.css that way is a good way to test/preview your changes out before committing to them using this tool.</li>
|
||||
<li>Using a computer is suggested for these kind of changes</li>
|
||||
<li>Learn css: <a href="https://www.w3schools.com/Css/css_intro.asp">w3schools</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
|
@ -1,3 +0,0 @@
|
|||
<form action="" method="POST">
|
||||
<input type="submit" name="cssedit_edit" value="Edit CSS" />
|
||||
</form>
|
|
@ -1,19 +0,0 @@
|
|||
# RisingThumb's build of dirdir
|
||||
|
||||
dirdir is werc's directory management tool.
|
||||
|
||||
## Features
|
||||
|
||||
This adds a few features to dirdir.
|
||||
|
||||
- Ability to edit larger text files
|
||||
- Ability to edit template files
|
||||
- Ability to upload files(optionally under a different name)
|
||||
- Ability to delete a page
|
||||
- Ability to delete a folder
|
||||
|
||||
## Roadmap
|
||||
|
||||
- Ideally take some filetype info for making new pages. Would be nice to make tpl files this way.
|
||||
- User permissioning around editing template files (default config off?)
|
||||
- Possibly allowing different markdown/formatters to be used.
|
|
@ -1,59 +0,0 @@
|
|||
fn conf_enable_wiki {
|
||||
enable_wiki=yes
|
||||
wiki_editors_groups=$*
|
||||
conf_enable_app dirdir
|
||||
|
||||
if(~ $"conf_dirdir_index_type '')
|
||||
conf_dirdir_index_type='md'
|
||||
}
|
||||
|
||||
fn dirdir_init {
|
||||
if(! ~ $#enable_wiki 0 && check_user $wiki_editors_groups) {
|
||||
lp=$local_path
|
||||
# werc.rc doesn't append /index when $local_path doesn't exist
|
||||
# maybe it should, but for now we can fix it up here.
|
||||
if(~ $lp */)
|
||||
lp=$lp^'index'
|
||||
dirdir_file=$lp.^$"conf_dirdir_index_type
|
||||
if (test -f $lp.tpl) {
|
||||
dirdir_file=$lp.tpl
|
||||
}
|
||||
dirdir_dir=$dirdir_file^'_werc/dirdir/'
|
||||
|
||||
if(~ 1 $#post_arg_dirdir_edit $#post_arg_dirdir_preview)
|
||||
handler_body_main=(tpl_handler `{get_lib_file dirdir/edit.tpl apps/dirdir/edit.tpl})
|
||||
if not if(~ 1 $#post_arg_dirdir_delete && ! ~ $#post_arg_dirdir_delete_yes 1)
|
||||
handler_body_main=(tpl_handler `{get_lib_file dirdir/delete_sure.tpl apps/dirdir/delete_sure.tpl})
|
||||
if not if(~ 1 $#post_arg_dirdir_delete_folder && ! ~ $#post_arg_dirdir_delete_yes 1)
|
||||
handler_body_main=(tpl_handler `{get_lib_file dirdir/delete_sure.tpl apps/dirdir/delete_sure.tpl})
|
||||
if not if(~ 1 $#post_arg_dirdir_delete && ! ~ $#post_arg_dirdir_delete_yes 0)
|
||||
rm $dirdir_file
|
||||
if not if(~ 1 $#post_arg_dirdir_delete_folder && ! ~ $#post_arg_dirdir_delete_yes 0)
|
||||
rm -rf `{dirname $dirdir_file}
|
||||
if not if(~ 1 $#post_arg_dirdir_add_child_file && ! ~ $#post_arg_dirdir_search 0)
|
||||
touch `{dirname $dirdir_file}^'/'^$post_arg_dirdir_search^'.md'
|
||||
if not if(~ 1 $#post_arg_dirdir_add_child_folder! ~ $#post_arg_dirdir_search 0)
|
||||
mkdir `{dirname $dirdir_file}^'/'^$post_arg_dirdir_search
|
||||
if not if(~ 1 $#post_arg_dirdir_upload_file_pressed && ! ~ $#post_arg_dirdir_file_name 0 && ! ~ $post_arg_dirdir_file_name "" && ! ~ $#post_arg_dirdir_upload_file 0)
|
||||
mv /tmp/werc_file.*.data `{dirname $dirdir_file}^'/'^$post_arg_dirdir_file_name
|
||||
if not if(~ 1 $#post_arg_dirdir_upload_file_pressed && ! ~ $#post_arg_dirdir_upload_file 0)
|
||||
mv /tmp/werc_file.*.data `{dirname $dirdir_file}^'/'^$post_arg_dirdir_upload_file
|
||||
if not if(! ~ '' $"post_arg_dirdir_save $"post_arg_edit_text)
|
||||
save_page
|
||||
|
||||
if not if(~ $"handler_body_main '' || {~ $REQUEST_METHOD GET && test -f $local_path.md} || {~ $REQUEST_METHOD GET && test -f $local_path.tpl} )
|
||||
ll_add handlers_bar_left tpl_handler apps/dirdir/sidebar_controls.tpl
|
||||
}
|
||||
}
|
||||
|
||||
fn save_page {
|
||||
dirdir_verdir=$dirdir_dir/^`{date -n}^/
|
||||
mkdir -p $dirdir_verdir
|
||||
umask 002
|
||||
|
||||
# XXX Use a tmp file and mv(1) to ensure updates are atomic?
|
||||
echo $logged_user > $dirdir_verdir/author
|
||||
echo $post_arg_edit_text | dos2unix > $dirdir_verdir/data
|
||||
echo $post_arg_edit_text | dos2unix > $dirdir_file
|
||||
post_redirect $base_url^$req_path
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
<form action="" method="POST">
|
||||
|
||||
% if(~ 1 $#post_arg_dirdir_delete ) {
|
||||
% echo '<input type="hidden" name="dirdir_delete" value="Delete page" />' }
|
||||
% if(~ 1 $#post_arg_dirdir_delete_folder ) {
|
||||
% echo '<input type="hidden" name="dirdir_delete_folder" value="Delete folder" />' }
|
||||
|
||||
<input type="submit" name="dirdir_delete_yes" value="Are you sure you want to delete?" />
|
||||
</form>
|
|
@ -1,26 +0,0 @@
|
|||
<div>
|
||||
<h1>Editing: <a href="%($req_path%)">%($req_path%)</a></h1>
|
||||
<br>
|
||||
<form action="" method="POST" enctype="multipart/form-data">
|
||||
<textarea name="edit_text" id="edit_text" cols="80" rows="43">%{
|
||||
# FIXME Extra trailing new lines get added to the content somehow, should avoid it.
|
||||
echo $dirdir_search
|
||||
if(~ $#post_arg_edit_text 0 && test -f $dirdir_file)
|
||||
cat $dirdir_file | escape_html
|
||||
if not
|
||||
echo -n $post_arg_edit_text | escape_html
|
||||
|
||||
%}</textarea>
|
||||
<br>
|
||||
<input type="submit" name="dirdir_save" value="Save">
|
||||
<input type="submit" name="dirdir_preview" value="Preview">
|
||||
<small>DirDir documents are written using <a href="http://daringfireball.net/projects/markdown/syntax">Markdown syntax</a>.</small>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
% if(! ~ $"post_arg_dirdir_preview '') {
|
||||
<h2>Preview:</h2>
|
||||
<div id="preview">
|
||||
% echo $post_arg_edit_text | dos2unix | $formatter
|
||||
</div>
|
||||
% }
|
|
@ -1,14 +0,0 @@
|
|||
<form action="" method="POST">
|
||||
<input type="submit" name="dirdir_edit" value="Edit page" /><br/>
|
||||
</form>
|
||||
<form action="" method="POST">
|
||||
<input type="search" id="test-search" name="dirdir_search" placeholder="Page or folder to add"/><br/>
|
||||
<input type="submit" name="dirdir_add_child_file" value="New Page" />
|
||||
<input type="submit" name="dirdir_add_child_folder" value="New Folder" /><hr />
|
||||
</form>
|
||||
<form action="" method="POST">
|
||||
<hr style="color: red"/><input type="submit" name="dirdir_delete_folder" value="Delete folder" />
|
||||
</form>
|
||||
<form action="" method="POST">
|
||||
<input type="submit" name="dirdir_delete" value="Delete page" /><hr style="color: red"/>
|
||||
</form>
|
|
@ -1,20 +0,0 @@
|
|||
The default path for site search is /_search/. Assuming you want to keep
|
||||
that default, you could enable site search like so:
|
||||
|
||||
|
||||
mkdir -p /www/werc/sites/MYSITE/_search/_werc/
|
||||
echo 'conf_enable_duckduckgo' > /www/werc/sites/MYSITE/_search/_werc/config
|
||||
mkdir -p /www/werc/sites/MYSITE/_werc/lib/
|
||||
cp /www/werc/apps/duckduckgo/footer.inc.sample /www/werc/sites/MYSITE/_werc/lib/footer.inc
|
||||
|
||||
Searches will POST to /_search/ and from there get redirected to Duck Duck
|
||||
Go with a site:$SERVER_NAME prefix. To have the search path URL be some-
|
||||
thing different, you'll have to edit line 23 of app.rc to point to the new
|
||||
path.
|
||||
|
||||
TODO:
|
||||
* Make it automatically work no matter which directory the app is enabled in.
|
||||
* OR make the search path a configuration option.
|
||||
* Provide a template for non-footer deployment
|
||||
* Enable the search path itself to serve a search form to GET requests
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
fn conf_enable_duckduckgo {
|
||||
enable_duckduckgo=yes
|
||||
conf_enable_app duckduckgo
|
||||
pageTitle='Site Search'
|
||||
}
|
||||
|
||||
|
||||
fn duckduckgo_init {
|
||||
get_post_args q
|
||||
if (! ~ $#q 0) {
|
||||
redirect_string = 'https://duckduckgo.com/?q=site:'$SERVER_NAME^'+'^$"q
|
||||
http_redirect $redirect_string '302 Found'
|
||||
}
|
||||
if not {
|
||||
handler_body_main='duckduckgo_body'
|
||||
}
|
||||
}
|
||||
|
||||
fn duckduckgo_body {
|
||||
echo '
|
||||
<h1>Site search</h1>
|
||||
<h2>using DuckDuckGo</h2>
|
||||
<form action="/_search/" method="POST">
|
||||
<label for="searchtext">Site search:</label>
|
||||
<input type="text" id="searchtext" name="q" placeholder="Search text...">
|
||||
<input type="submit" value="Search">
|
||||
</form>'
|
||||
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<div><a href="http://werc.cat-v.org">Powered by werc</a></div>
|
||||
|
||||
<div><form action="/_search/" method="POST"><label for="searchtext">Site search:</label> <input type="text" id="searchtext" name="q" placeholder="Enter search text..."><input type="submit" display="Search"></form></div>
|
|
@ -1 +0,0 @@
|
|||
Subproject commit 65ecf50e317daa8c463b0375f1a57bd388b5bca4
|
|
@ -1,10 +0,0 @@
|
|||
fn hello_init {
|
||||
if(~ $req_path /hello) {
|
||||
handler_body_main='hello_body'
|
||||
pageTitle='Hi title!'
|
||||
}
|
||||
}
|
||||
|
||||
fn hello_body {
|
||||
echo 'Hello world!'
|
||||
}
|
|
@ -1,144 +0,0 @@
|
|||
fn conf_enable_ico {
|
||||
ico_uri=$conf_wd
|
||||
ico_dirs=$*
|
||||
if(~ $#ico_dirs 0)
|
||||
ico_dirs=( . )
|
||||
conf_enable_app ico
|
||||
|
||||
if(~ $"conf_ico_editors '')
|
||||
conf_ico_editors=ico-editors
|
||||
|
||||
if(~ $"conf_max_posts_per_page '')
|
||||
conf_max_posts_per_page=32
|
||||
|
||||
if(~ $"conf_ico_categories '')
|
||||
conf_ico_categories=(general)
|
||||
|
||||
if(~ $"conf_ico_max_image_size '')
|
||||
conf_ico_max_image_size=5242880
|
||||
}
|
||||
|
||||
fn ico_init {
|
||||
if(~ $#ico_dirs 0 && ~ $req_path */[iI]co/*) {
|
||||
ico_uri=`{echo $req_path | sed 's,(/[iI]co/).*,\1,'}
|
||||
ico_dirs=( . )
|
||||
}
|
||||
|
||||
if(! ~ $#ico_dirs 0) {
|
||||
ico_url=$base_url^$ico_uri
|
||||
ico_root=$sitedir^$ico_uri
|
||||
if(check_user $conf_ico_editors) {
|
||||
editor_mode=on
|
||||
if(~ $"post_arg_date '')
|
||||
post_date=`{/bin/date -I|sed 's,-,/,g'}
|
||||
if not
|
||||
post_date=$post_arg_date
|
||||
ll_add handlers_foot_body template `{get_lib_file ico/foot.tpl apps/ico/foot.tpl}
|
||||
}
|
||||
|
||||
if(~ $req_path $ico_uri) {
|
||||
handler_body_main=ico_body
|
||||
u=$ico_uri'index'
|
||||
extraHeaders=$"extraHeaders ^ \
|
||||
'<link rel="alternate" type="application/atom+xml" title="ATOM" href="'$"u'.atom" />
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="'$"u'.rss" />'
|
||||
}
|
||||
if not if(~ $req_path $ico_uri^category/*) {
|
||||
category=`{echo $req_path | sed 's!.*/!!; s/_/ /g'}
|
||||
handler_body_main=ico_category_body
|
||||
}
|
||||
if not if(~ $req_path $ico_uri^index.atom)
|
||||
ico_setup_feed_handlers atom.tpl 'application/atom+xml'
|
||||
if not if(~ $req_path $ico_uri^index.rss)
|
||||
ico_setup_feed_handlers rss20.tpl 'application/rss+xml'
|
||||
if not if(~ $req_path $ico_uri^new_post && ! ~ $#editor_mode 0) {
|
||||
handler_body_main=( tpl_handler `{get_lib_file ico/new_post.tpl apps/ico/new_post.tpl} )
|
||||
if(~ $REQUEST_METHOD POST) {
|
||||
if(mkicopost $"post_arg_body $"post_date $"post_arg_title $"post_arg_categories $"post_arg_loc $"post_arg_loc_link $"post_arg_link $"post_arg_short_desc $"post_arg_poster $"post_arg_edate)
|
||||
post_redirect $ico_uri
|
||||
if not
|
||||
notify_errors=$status
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn ico_category_body {
|
||||
template apps/ico/event_list_cat.tpl
|
||||
}
|
||||
|
||||
fn ico_body {
|
||||
template apps/ico/event_list_all.tpl
|
||||
}
|
||||
|
||||
fn get_post_list {
|
||||
ls -F $*^/[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]/ >[2]/dev/null |
|
||||
sed -n '/'^$forbidden_uri_chars^'/d; /\/$/p' |
|
||||
sort -r |
|
||||
sed -e $conf_max_posts_per_page^'q'
|
||||
}
|
||||
|
||||
fn mkicopost {
|
||||
icotext=$1
|
||||
icodate=$2
|
||||
icotitle=$3
|
||||
icocategories=$4
|
||||
icolocation=$5
|
||||
icolocationlink=$6
|
||||
icoeventlink=$7
|
||||
icoshortdesc=$8
|
||||
icoposterpath=$9
|
||||
icoexpireddate=$10
|
||||
_status=()
|
||||
postdate=`{/bin/date -I|sed 's,-,/,g'}
|
||||
if(~ $"icotext '')
|
||||
_status=($_status 'You need to provide a post body.')
|
||||
if(! ~ $"postdate [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9])
|
||||
_status=($_status 'Invalid date: '''^$"postdate^'''')
|
||||
|
||||
if(~ $#_status 0) {
|
||||
umask 022
|
||||
ddir=$ico_root^$postdate^'/'
|
||||
n=`{ls $ddir >[2]/dev/null | wc -l}
|
||||
mkdir -p $ddir^$n
|
||||
|
||||
post_link='/'$postdate^'/'$n
|
||||
|
||||
category_links=''
|
||||
for(cat in `{echo $icocategories}) {
|
||||
if(! ~ $cat '') {
|
||||
cat_link=`{echo -n $cat | sed 's/ /_/g'}
|
||||
category_links=$category_links'<div>[<a href='$ico_uri'category/'$cat_link'>'$cat'</a>]</div> '
|
||||
}
|
||||
}
|
||||
|
||||
icopostlink='/'^$postdate^'/'^$n^'/'
|
||||
|
||||
template apps/ico/post.tpl > $ddir^$n^'/index.html'
|
||||
|
||||
# Create the main categories directory
|
||||
categories_dir=$ico_root^'categories'
|
||||
mkdir -p $categories_dir
|
||||
|
||||
# Update category files
|
||||
for(cat in `{echo $icocategories}) {
|
||||
if(! ~ $cat '') {
|
||||
cat_file=$categories_dir^'/'^`{echo -n $cat | sed 's/ /_/g'}^'.txt'
|
||||
echo $post_link >> $cat_file
|
||||
}
|
||||
}
|
||||
}
|
||||
status=$_status
|
||||
}
|
||||
|
||||
fn get_post_by_category {
|
||||
cat_dir=$ico_root^'categories'
|
||||
cat_file=$cat_dir^'/'^`{echo -n $1 | sed 's/ /_/g'}^'.txt'
|
||||
if(test -f $cat_file) {
|
||||
cat $cat_file | sort -r | sed $conf_max_posts_per_page^'q'
|
||||
}
|
||||
}
|
||||
|
||||
fn list_categories {
|
||||
ls $ico_root^'categories/'*.txt | sed 's!.*/!!; s!\.txt$!!; s!_! !g'
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
% if (! ~ $"icoTitle '')
|
||||
<h1>%($"icoTitle%)</h1>
|
||||
% if (! ~ $"icoDesc '')
|
||||
<p class="ico_desc">%($"icoDesc%)</p>
|
||||
<fieldset class="categories_box">
|
||||
<legend>Catagories</legend>
|
||||
<div class="categories">
|
||||
%{
|
||||
for(cat in `{list_categories}) {
|
||||
echo '<a href="'$ico_uri'category/'^`{echo -n $cat | sed 's/ /_/g'}^'">'$cat'</a> '
|
||||
}
|
||||
%}
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="icofeed">
|
||||
|
||||
%{
|
||||
for(p in `{get_post_list $ico_root^$ico_dirs}) {
|
||||
echo '<div class="post">'
|
||||
cat $p/index.html
|
||||
echo '</div>'
|
||||
}
|
||||
%}
|
||||
</div>
|
||||
<p>Check out the <a href="/archive">archive</a> to see past events.</p>
|
|
@ -1,23 +0,0 @@
|
|||
<h1>Posts in category: %($category%)</h1>
|
||||
<p class="ico_desc">You are seeing events in the <strong>%($category%)</strong> category. Click <a href="/">here</a> to go home!</p>
|
||||
<fieldset class="categories_box">
|
||||
<legend>Catagories</legend>
|
||||
<div class="categories">
|
||||
<a href="/">all</a>
|
||||
%{
|
||||
for(cat in `{list_categories}) {
|
||||
echo '<a href="'$ico_uri'category/'^`{echo -n $cat | sed 's/ /_/g'}^'">'$cat'</a> '
|
||||
}
|
||||
%}
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="icofeed">
|
||||
%{
|
||||
for(p in `{get_post_by_category $category}) {
|
||||
echo '<div class="post">'
|
||||
cat $sitedir$p/index.html
|
||||
echo '</div>'
|
||||
}
|
||||
%}
|
||||
</div>
|
||||
<p>Check out the <a href="/archive">archive</a> to see past events.</p>
|
|
@ -1 +0,0 @@
|
|||
<div><p>[ <a href="/new_post">Make a new post</a> ]</p></div>
|
|
@ -1,17 +0,0 @@
|
|||
<div>
|
||||
% notices_handler
|
||||
<form method="POST"><fieldset>
|
||||
<legend>Submit a new ico post</legend>
|
||||
<label>Title: <input size="64" type="text" name="title" value="%($"post_arg_title%)" required /></label>
|
||||
<label>Event Date (Displayed): <input size="10" type="text" name="date" value="%($"post_date%)" /></label>
|
||||
<label for="dateInput">Expire Date [YYYY-MM-DD] <small>(usually the date of the show)</small>: <input type="text" name="edate" id="dateInput" placeholder="YYYY-MM-DD" pattern="\d{4}-\d{2}-\d{2}" required value="%($"post_arg_edate%)"/></label>
|
||||
<label>Categories <small>(space-separated)</small>: <input size="64" type="text" name="categories" value="%($"post_arg_categories%)" /></label>
|
||||
<label>Location: <input size="64" type="text" name="loc" value="%($"post_arg_loc%)" /></label>
|
||||
<label>Location Link: <input size="64" type="text" name="loc_link" value="%($"post_arg_loc_link%)" /></label>
|
||||
<label>Event Link/Website: <input size="64" type="text" name="link" value="%($"post_arg_link%)" /></label>
|
||||
<label>Short Description: <textarea cols="94" rows="1" name="short_desc">%($"post_arg_short_desc%)</textarea></label>
|
||||
<label>Description: <textarea cols="94" rows="16" name="body">%($"post_arg_body%)</textarea></label>
|
||||
<label>Event Poster Image Link: <input size="64" type="text" name="poster" value="%($"post_arg_poster%)" /></label><br />
|
||||
<input type="submit" value="Post" />
|
||||
</fieldset></form>
|
||||
</div>
|
|
@ -1,20 +0,0 @@
|
|||
<!-- EXPIRES: "%($icoexpireddate%)" -->
|
||||
<div class="event_box">
|
||||
<a href="%($icopostlink%)" class="event_box_link"><span class="link_span"></span></a>
|
||||
<a href="%($icopostlink%)"><h2>%($icotitle%)</h2></a>
|
||||
<div class="event_info">
|
||||
<div class="date">%($icodate%)</div>
|
||||
<div class="location"><a href="%($icolocationlink%)">%($icolocation%)</a></div>
|
||||
<div class="event_link"><a href="%($icoeventlink%)">Event Link</a></div>
|
||||
<div class="cat_list">%($category_links%)</div>
|
||||
<div class="short_desc">%($icoshortdesc%)</div>
|
||||
</div>
|
||||
% if(! ~ $"icoposterpath '') {
|
||||
<div class="event_poster">
|
||||
<a href="%($icoeventlink%)" class="event_img_link"><img src="%($icoposterpath%)" alt="Event Poster" /></a>
|
||||
</div>
|
||||
% }
|
||||
<div class="event_body">
|
||||
%($icotext%)
|
||||
</div>
|
||||
</div>
|
|
@ -1,25 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<atom:link href="%($base_url^$req_path%)" rel="self" type="application/rss+xml" />
|
||||
<title><![CDATA[%($siteTitle%)]]></title>
|
||||
<link>%($base_url^$req_path%)</link>
|
||||
<description><![CDATA[%($icoDesc%)]]></description>
|
||||
<language>en-us</language>
|
||||
<generator>werc ico app</generator>
|
||||
<lastBuildDate>%($lastBuildDate%)</lastBuildDate>
|
||||
%{
|
||||
for(f in `{get_post_list $ico_root$ico_dirs}){
|
||||
statpost $f
|
||||
%}
|
||||
<item>
|
||||
<title><![CDATA[%($title%)]]></title>
|
||||
<link>%($post_uri%)</link>
|
||||
<guid isPermaLink="true">%($post_uri%)</guid>
|
||||
<pubDate>%($pubdate%)</pubDate>
|
||||
<description><![CDATA[%($summary%)]]></description>
|
||||
<category>%($categories%)</category>
|
||||
</item>
|
||||
% }
|
||||
</channel>
|
||||
</rss>
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue