mirror of https://github.com/nealey/foneworx.git
Shipping this
This commit is contained in:
commit
be5362136f
|
@ -0,0 +1,26 @@
|
||||||
|
# This file specifies files that are *not* uploaded to Google Cloud Platform
|
||||||
|
# using gcloud. It follows the same syntax as .gitignore, with the addition of
|
||||||
|
# "#!include" directives (which insert the entries of the given .gitignore-style
|
||||||
|
# file at that point).
|
||||||
|
#
|
||||||
|
# For more information, run:
|
||||||
|
# $ gcloud topic gcloudignore
|
||||||
|
#
|
||||||
|
fetch-static.sh
|
||||||
|
.gcloudignore
|
||||||
|
# If you would like to upload your .git directory, .gitignore file or files
|
||||||
|
# from your .gitignore file, remove the corresponding line
|
||||||
|
# below:
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
# Test binary, build with `go test -c`
|
||||||
|
*.test
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
|
@ -0,0 +1,5 @@
|
||||||
|
static/FeisWorxLogo2.gif
|
||||||
|
static/bg8.jpg
|
||||||
|
static/cards.jpg
|
||||||
|
static/favicon.ico
|
||||||
|
static/feisworx.css
|
|
@ -0,0 +1,22 @@
|
||||||
|
This site adds a few simple tweaks to the feisworx web site,
|
||||||
|
in order to make it look better on a phone.
|
||||||
|
|
||||||
|
The iPhone doesn't allow browser plugins.
|
||||||
|
So I had to create a whole app just to drop in some JavaScript.
|
||||||
|
|
||||||
|
Hopefully one day feisworx integrates this and I can take my site down.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
First you should download static content,
|
||||||
|
so you're not hammering away at the feisworx site
|
||||||
|
for static resources.
|
||||||
|
|
||||||
|
./fetch-static.sh
|
||||||
|
|
||||||
|
|
||||||
|
Then you can test with
|
||||||
|
|
||||||
|
go run .
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
runtime: go113
|
||||||
|
handlers:
|
||||||
|
- url: /images
|
||||||
|
static_dir: static
|
||||||
|
- url: /share
|
||||||
|
static_dir: static
|
|
@ -0,0 +1,14 @@
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd $(dirname $0)/static
|
||||||
|
while read url; do
|
||||||
|
wget -c $url
|
||||||
|
done <<EOD
|
||||||
|
https://www.feisworx.com/favicon.ico
|
||||||
|
https://www.feisworx.com/images/bg8.jpg
|
||||||
|
https://www.feisworx.com/images/cards.jpg
|
||||||
|
https://www.feisworx.com/images/FeisWorxLogo2.gif
|
||||||
|
https://www.feisworx.com/share/feisworx.css
|
||||||
|
EOD
|
|
@ -0,0 +1,70 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"regexp"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func copyHeader(dst, src http.Header) {
|
||||||
|
for k, vv := range src {
|
||||||
|
for _, v := range vv {
|
||||||
|
dst.Add(k, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var HeadTag = regexp.MustCompile("<head>")
|
||||||
|
const NewHead = `<head>
|
||||||
|
<script src="/share/foneworx.js"></script>
|
||||||
|
`
|
||||||
|
|
||||||
|
func Handler(w http.ResponseWriter, r *http.Request) {
|
||||||
|
r.URL.Scheme = "https"
|
||||||
|
r.URL.Host = "www.feisworx.com"
|
||||||
|
r.Host = "www.feisworx.com"
|
||||||
|
|
||||||
|
resp, err := http.DefaultTransport.RoundTrip(r)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
contentType := resp.Header.Get("Content-Type")
|
||||||
|
tamperBody := body
|
||||||
|
if strings.HasPrefix(contentType, "text/html") {
|
||||||
|
tamperBody = HeadTag.ReplaceAll(body, []byte(NewHead))
|
||||||
|
}
|
||||||
|
|
||||||
|
copyHeader(w.Header(), resp.Header)
|
||||||
|
w.Header().Set("Content-Length", fmt.Sprintf("%d", len(tamperBody)))
|
||||||
|
w.WriteHeader(resp.StatusCode)
|
||||||
|
w.Write(tamperBody)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
http.HandleFunc("/", Handler)
|
||||||
|
http.Handle("/share/", http.StripPrefix("/share/", http.FileServer(http.Dir("static/"))))
|
||||||
|
http.Handle("/images/", http.StripPrefix("/images/", http.FileServer(http.Dir("static/"))))
|
||||||
|
|
||||||
|
port := os.Getenv("PORT")
|
||||||
|
if port == "" {
|
||||||
|
port = "8080"
|
||||||
|
log.Printf("Defaulting to port %s", port)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("Listening on port %s", port)
|
||||||
|
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,154 @@
|
||||||
|
// ==UserScript==
|
||||||
|
// @name PhoneWorx
|
||||||
|
// @namespace https://gist.githubusercontent.com/nealey/3af026cc34ddf502419aa16eee3a4caa/
|
||||||
|
// @version 0.4
|
||||||
|
// @description Subtly change Feisworks for narrow screens
|
||||||
|
// @author Neale Pickett <neale@woozle.org>
|
||||||
|
// @match http*://*.feisworx.com/*
|
||||||
|
// @match http*://feisworx.com/*
|
||||||
|
// @grant none
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
// jshint asi:true
|
||||||
|
|
||||||
|
// Most of what we're doing here is trying to make content flow.
|
||||||
|
// Quite a lot of pages are set up to do this pretty well already,
|
||||||
|
// they just need some hints removed.
|
||||||
|
|
||||||
|
var foneworxCss = `
|
||||||
|
body {
|
||||||
|
background: rgb(127,216,192);
|
||||||
|
background: linear-gradient(0deg, #1fc6f4 0%, #7fd8c0 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
#foneworx-contact p {
|
||||||
|
float: right;
|
||||||
|
padding: 0 1em;
|
||||||
|
font-size: small;
|
||||||
|
}
|
||||||
|
|
||||||
|
#foneworx-logo {
|
||||||
|
font-family: 'Uncial Antiqua', cursive;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
#foneworx-logo a:link {
|
||||||
|
text-decoration: none;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
h1, h2, h3, p {
|
||||||
|
margin: 0.5em;
|
||||||
|
}
|
||||||
|
#foneworx-title h1 {
|
||||||
|
margin: 0em 0.5em;
|
||||||
|
}
|
||||||
|
body > table:nth-of-type(1) tr {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
#foneworx-nav tr {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
a.sel {
|
||||||
|
padding: 0.5em;
|
||||||
|
margin: 0.1em;
|
||||||
|
}
|
||||||
|
form > table:nth-of-type(1) tr {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
form > table:nth-of-type(1) td {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
var foneworxNotice = `
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
FoneWorx is an unofficial wrapper around FeisWorx.
|
||||||
|
We have reached out to the FeisWorx people
|
||||||
|
about integrating this functionality,
|
||||||
|
and remain hopeful that something like this can make it to the
|
||||||
|
official site.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If you have problems with FoneWorx,
|
||||||
|
try the <a href="https://www.feisworx.com/">FeisWorx Site</a>
|
||||||
|
instead.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="mailto:neale@woozle.org">FoneWorx Contact</a>
|
||||||
|
|
|
||||||
|
<a href="https://github.com/nealey/foneworx">Source</a>
|
||||||
|
<p>
|
||||||
|
`
|
||||||
|
|
||||||
|
function foneworxTag(path, id) {
|
||||||
|
let e = document.querySelector(path)
|
||||||
|
if (e) {
|
||||||
|
e.id = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function foneworxInit() {
|
||||||
|
let viewport = document.createElement("meta")
|
||||||
|
viewport.name = "viewport"
|
||||||
|
viewport.content = "width=device-width, initial-scale=1"
|
||||||
|
document.head.appendChild(viewport)
|
||||||
|
|
||||||
|
let fontlink = document.createElement("link")
|
||||||
|
fontlink.href="https://fonts.googleapis.com/css?family=Uncial+Antiqua&display=swap"
|
||||||
|
fontlink.rel="stylesheet"
|
||||||
|
document.head.appendChild(fontlink)
|
||||||
|
|
||||||
|
// Remove forced width on anything that forces it
|
||||||
|
for (let e of document.querySelectorAll("[width]")) {
|
||||||
|
e.width = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tag some things to make CSS more readable
|
||||||
|
foneworxTag("body > table:first-child [align='left']", "foneworx-logo")
|
||||||
|
foneworxTag("body > table:first-child [align='center']", "foneworx-title")
|
||||||
|
foneworxTag("body > table:first-child [align='right']", "foneworx-contact")
|
||||||
|
foneworxTag("table[align='center']", "foneworx-nav")
|
||||||
|
|
||||||
|
// Do a lot of things to prevent people from pestering FeisWorx.
|
||||||
|
// If you are the FeisWorx people, I would love to
|
||||||
|
// give you whatever support you need to integrate this code,
|
||||||
|
// absolutely free of charge. neale@woozle.org
|
||||||
|
|
||||||
|
// Change out the logo so it's clear this isn't FeisWorx
|
||||||
|
let logo = document.querySelector("#foneworx-logo")
|
||||||
|
if (logo) {
|
||||||
|
logo.innerHTML = "<a href='/'>FoneWorx</a>"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tamper heavily with "contact us"
|
||||||
|
// so the feisworx people don't get a ton of mail
|
||||||
|
// about something they didn't make.
|
||||||
|
let contact = document.querySelector("#foneworx-contact")
|
||||||
|
if (contact) {
|
||||||
|
// Move it to the bottom
|
||||||
|
document.querySelector(".copyright").insertAdjacentElement("beforebegin", contact)
|
||||||
|
contact.innerHTML = foneworxNotice
|
||||||
|
}
|
||||||
|
|
||||||
|
let style = document.createElement("style")
|
||||||
|
style.textContent = foneworxCss
|
||||||
|
document.head.appendChild(style)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (document.readyState === "loading") {
|
||||||
|
document.addEventListener("DOMContentLoaded", foneworxInit)
|
||||||
|
} else {
|
||||||
|
foneworxInit()
|
||||||
|
}
|
Loading…
Reference in New Issue