Compare commits
4 Commits
548075696c
...
af9d6d6eb9
Author | SHA1 | Date |
---|---|---|
Stephen Searles | af9d6d6eb9 | 2 years ago |
Stephen Searles | 43e119f12c | 2 years ago |
Stephen Searles | 16e3583927 | 2 years ago |
Stephen Searles | 51c4837aaf | 2 years ago |
@ -0,0 +1,30 @@ |
|||||||
|
package frontend |
||||||
|
|
||||||
|
import "embed" |
||||||
|
|
||||||
|
//go:embed templates
|
||||||
|
var templates embed.FS |
||||||
|
|
||||||
|
func readFilename(filename string) string { |
||||||
|
f, err := templates.ReadFile(filename) |
||||||
|
if err != nil { |
||||||
|
panic(err) |
||||||
|
} |
||||||
|
return string(f) |
||||||
|
} |
||||||
|
|
||||||
|
func EditPage() string { |
||||||
|
return readFilename("templates/edit.html.tmpl") |
||||||
|
} |
||||||
|
|
||||||
|
func AdminPage() string { |
||||||
|
return readFilename("templates/admin.html.tmpl") |
||||||
|
} |
||||||
|
|
||||||
|
func AuthorPage() string { |
||||||
|
return readFilename("templates/author.html.tmpl") |
||||||
|
} |
||||||
|
|
||||||
|
func UploadPage() string { |
||||||
|
return readFilename("templates/upload.html.tmpl") |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
<html><body>not implemented</body></html> |
@ -0,0 +1,44 @@ |
|||||||
|
<html> |
||||||
|
<head> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
{{ $timeFormat := "Jan _2 15:04:05" }} |
||||||
|
<p>Create content:</p> |
||||||
|
<form action="/hugo/edit/new" method="POST"> |
||||||
|
<label>Name: <input type="text" name="name" /></label> |
||||||
|
<select name="type"> |
||||||
|
{{- range .ContentTypes }} |
||||||
|
<option value="{{ . }}">{{ . }}</option> |
||||||
|
{{- end }} |
||||||
|
</select> |
||||||
|
<input type="submit" /> |
||||||
|
</form> |
||||||
|
|
||||||
|
<p>Edit content:</p> |
||||||
|
<table>{{ range .Content }} |
||||||
|
<tr> |
||||||
|
{{ if .Metadata }} |
||||||
|
<td> |
||||||
|
<a href="/hugo/edit/{{ .Filename }}"> |
||||||
|
{{ .Metadata.Title }} |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
<td> |
||||||
|
{{ .Metadata.Date.Format $timeFormat }} |
||||||
|
{{ if not (.Metadata.Lastmod.Equal .Metadata.Date) }} |
||||||
|
(last modified {{.Metadata.Lastmod.Format $timeFormat }}) |
||||||
|
{{end}} |
||||||
|
</td> |
||||||
|
{{ else }} |
||||||
|
<td> |
||||||
|
<a href="/hugo/edit/{{ .Filename }}"> |
||||||
|
{{ .Filename }} |
||||||
|
</a> |
||||||
|
</td> |
||||||
|
<td>(unable to load metadata)</td> |
||||||
|
{{ end }} |
||||||
|
</tr> |
||||||
|
{{- end }} |
||||||
|
</table> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,316 @@ |
|||||||
|
<html> |
||||||
|
<head> |
||||||
|
<script src="/hugo/simplemde.js"></script> |
||||||
|
<style type="text/css" media="screen"> |
||||||
|
#editor-wrapper { |
||||||
|
position: absolute; |
||||||
|
top: 50px; |
||||||
|
right: 0; |
||||||
|
bottom: 150px; |
||||||
|
left: 40%; |
||||||
|
} |
||||||
|
#draft { |
||||||
|
position: absolute; |
||||||
|
top: 50px; |
||||||
|
right: 60%; |
||||||
|
bottom: 0; |
||||||
|
left: 0; |
||||||
|
|
||||||
|
} |
||||||
|
#draft > iframe { |
||||||
|
height: 100%; |
||||||
|
width: 100%; |
||||||
|
border: none; |
||||||
|
} |
||||||
|
a { |
||||||
|
text-decoration: underline; |
||||||
|
text-decoration-style: dotted; |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
</style> |
||||||
|
<link rel="stylesheet" href="/hugo/simplemde.css" /> |
||||||
|
<script src="/hugo/vue.js"></script> |
||||||
|
<script src="/hugo/moment.js"></script> |
||||||
|
|
||||||
|
|
||||||
|
<body> |
||||||
|
<div id="container" > |
||||||
|
<div id="header"> |
||||||
|
<div id="lastSaved"> |
||||||
|
<span v-if="sendQueue.length > 0 || Object.keys(needConfirmation).length > 0">last saved ${ lastSaved.from(now) }, saving</span> |
||||||
|
<span v-else>saved</span> |
||||||
|
<span v-if="connectionError">, ${connectionError}</span> |
||||||
|
</div> |
||||||
|
<div> |
||||||
|
<a id="sideview-toggle-media">media</a> |
||||||
|
<a id="sideview-toggle-draft">draft</a> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<div id="editor-wrapper"> |
||||||
|
<textarea id="editor">{{ .LoadContent }}</textarea> |
||||||
|
</div> |
||||||
|
<div id="draft"><iframe src="{{ .IframeSource }}">Loading draft...</iframe></div> |
||||||
|
</div> |
||||||
|
<script> |
||||||
|
|
||||||
|
var iframe = document.querySelector("#draft > iframe"); |
||||||
|
|
||||||
|
document.onclick = function (event) { |
||||||
|
var iframe = document.querySelector("#draft > iframe"); |
||||||
|
switch (event.target.id) { |
||||||
|
case "sideview-toggle-media": |
||||||
|
iframe.src = "/hugo/media"; |
||||||
|
break; |
||||||
|
case "sideview-toggle-draft": |
||||||
|
iframe.src = "{{ .IframeSource }}"; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var uiBindings = { |
||||||
|
ltime: {{ .LTime }}, |
||||||
|
serverLtime: 0, |
||||||
|
lastSaved: moment(), |
||||||
|
now: moment(), |
||||||
|
connectionError: null, |
||||||
|
sendQueue: [], |
||||||
|
sentRecently: [], |
||||||
|
needConfirmation: {}, |
||||||
|
}; |
||||||
|
|
||||||
|
var app = new Vue({ |
||||||
|
el: "#container", |
||||||
|
data: uiBindings, |
||||||
|
delimiters: ["${", "}"], |
||||||
|
}); |
||||||
|
|
||||||
|
function getLtime() { |
||||||
|
uiBindings.ltime++ |
||||||
|
return uiBindings.ltime |
||||||
|
} |
||||||
|
|
||||||
|
function observeServer(l, confirmed) { |
||||||
|
uiBindings.serverLtime = l; |
||||||
|
if (confirmed && confirmed.length > 0) { |
||||||
|
confirmed.forEach(function (e) { |
||||||
|
delete uiBindings.needConfirmation[e]; |
||||||
|
}) |
||||||
|
} |
||||||
|
observe(l); |
||||||
|
} |
||||||
|
|
||||||
|
function observe(l) { |
||||||
|
if (l > uiBindings.ltime) { |
||||||
|
uiBindings.now = moment(); |
||||||
|
uiBindings.lastSaved = moment(); |
||||||
|
uiBindings.ltime = l; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var selectedImage; |
||||||
|
var editorElem = document.getElementById("editor"); |
||||||
|
var editor = new SimpleMDE({ |
||||||
|
element: editorElem, |
||||||
|
forceSync: true, |
||||||
|
insertTexts: { |
||||||
|
image: ["{\{% thumb filename=\"", "#url#\" width=\"200\" %}}"] |
||||||
|
}, |
||||||
|
imageURLFn: function () { |
||||||
|
return selectedImage; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
window.onmessage = function (evt) { |
||||||
|
selectedImage = evt.data; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Create WebSocket connection. |
||||||
|
var socket = connect(); |
||||||
|
|
||||||
|
|
||||||
|
const sawChangesBumpsTo = 10; |
||||||
|
|
||||||
|
var sentinelSrc = 'about:blank'; |
||||||
|
var oldSrc = ''; |
||||||
|
|
||||||
|
var sawChanges = -1; |
||||||
|
window.setInterval(function () { |
||||||
|
if (sawChanges >= 0) { |
||||||
|
sawChanges--; |
||||||
|
if (sawChanges == 0) { |
||||||
|
if (iframe.contentWindow) { |
||||||
|
iframe.contentWindow.location.reload(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
uiBindings.now = moment(); |
||||||
|
if (uiBindings.connectionError) { |
||||||
|
socket = connect(); |
||||||
|
} else if (uiBindings.sendQueue.length > 0) { |
||||||
|
var ltime = getLtime(); |
||||||
|
|
||||||
|
// record lowest pending |
||||||
|
// ltime at the time this message |
||||||
|
// was serialized |
||||||
|
var lowestPending = ltime; |
||||||
|
for (c in uiBindings.needConfirmation) { |
||||||
|
c = parseInt(c, 10); |
||||||
|
if (lowestPending === 0 || c < lowestPending) { |
||||||
|
lowestPending = c; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
var msg = JSON.stringify({ |
||||||
|
"deltas": uiBindings.sendQueue, |
||||||
|
"ltime": ltime, |
||||||
|
"lowestPending": lowestPending, |
||||||
|
}); |
||||||
|
uiBindings.sendQueue = []; |
||||||
|
uiBindings.needConfirmation[ltime] = msg; |
||||||
|
} |
||||||
|
|
||||||
|
for (ltime in uiBindings.needConfirmation) { |
||||||
|
var msg = uiBindings.needConfirmation[ltime]; |
||||||
|
socket.send(msg); |
||||||
|
} |
||||||
|
}, 500); |
||||||
|
|
||||||
|
function connect() { |
||||||
|
const socket = new WebSocket((location.protocol == "https:" ? 'wss://' : 'ws://') + location.host + location.pathname); |
||||||
|
|
||||||
|
// Listen for messages |
||||||
|
socket.addEventListener('message', function (event) { |
||||||
|
var message = JSON.parse(event.data); |
||||||
|
observeServer(message.ltime, message.confirmed); |
||||||
|
|
||||||
|
var deltas = []; |
||||||
|
deltas.push.apply(deltas, message.deltas); |
||||||
|
|
||||||
|
deltas.forEach(function(aceDelta) { |
||||||
|
var cmDelta = aceDeltaToCM(aceDelta) |
||||||
|
|
||||||
|
var content = "" |
||||||
|
var to = { |
||||||
|
line: aceDelta.start.row, |
||||||
|
ch: aceDelta.start.column, |
||||||
|
} |
||||||
|
|
||||||
|
if (aceDelta.action == "insert") { |
||||||
|
content = aceDelta.lines.join("\n"); |
||||||
|
to = null; |
||||||
|
} |
||||||
|
|
||||||
|
editor.codemirror.doc.replaceRange(content, cmDelta.from, to, "dontreflect"); |
||||||
|
sawChanges = sawChangesBumpsTo; |
||||||
|
}) |
||||||
|
}); |
||||||
|
|
||||||
|
socket.addEventListener('open', function () { |
||||||
|
uiBindings.connectionError = null; |
||||||
|
}); |
||||||
|
|
||||||
|
socket.addEventListener('close', function () { |
||||||
|
if (!uiBindings.connectionError) { |
||||||
|
getLtime(); |
||||||
|
uiBindings.connectionError = "server connection closed, reconnecting..."; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
socket.addEventListener('error', function (err) { |
||||||
|
if (!uiBindings.connectionError) { |
||||||
|
uiBindings.connectionError = err; |
||||||
|
getLtime(); |
||||||
|
} |
||||||
|
console.log(err); |
||||||
|
}); |
||||||
|
|
||||||
|
|
||||||
|
return socket; |
||||||
|
} |
||||||
|
|
||||||
|
editor.codemirror.on("change", function (cm, cmDelta) { |
||||||
|
if (cmDelta.origin == "dontreflect") { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
var aceDelta = cmDeltaToAce(cmDelta); |
||||||
|
console.log(cmDelta, "=>", aceDelta) |
||||||
|
|
||||||
|
sawChanges = sawChangesBumpsTo; |
||||||
|
uiBindings.sendQueue.push.apply(uiBindings.sendQueue, aceDelta); |
||||||
|
}) |
||||||
|
|
||||||
|
function cmDeltaToAce(cmDelta) { |
||||||
|
var isRemove = (cmDelta.removed.length > 0 && cmDelta.removed[0].length > 0) || cmDelta.removed.length > 1; |
||||||
|
var lines = isRemove ? cmDelta.removed : cmDelta.text; |
||||||
|
var aceDelta = { |
||||||
|
action: isRemove ? "remove" : "insert", |
||||||
|
lines: lines, |
||||||
|
start: { |
||||||
|
row: cmDelta.from.line, |
||||||
|
column: cmDelta.from.ch, |
||||||
|
}, |
||||||
|
end: { |
||||||
|
row: cmDelta.from.line + (isRemove ? lines.length - 1 : lines.length - 1 ), |
||||||
|
column: lines[lines.length-1].length, |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
if (aceDelta.start.row == aceDelta.end.row) { |
||||||
|
aceDelta.end.column += cmDelta.from.ch; |
||||||
|
} |
||||||
|
|
||||||
|
if (false && isRemove && aceDelta.start.row == aceDelta.end.row) { |
||||||
|
var origStart = aceDelta.start; |
||||||
|
aceDelta.start = aceDelta.end; |
||||||
|
aceDelta.end = origStart; |
||||||
|
aceDelta.start.column += cmDelta.from.ch; |
||||||
|
} |
||||||
|
|
||||||
|
if (isRemove && ((cmDelta.text.length > 0 && cmDelta.text[0].length > 0) || cmDelta.text.length > 1)) { |
||||||
|
cmDelta.removed = [""]; |
||||||
|
var ret = [aceDelta]; |
||||||
|
ret.push.apply(ret, cmDeltaToAce(cmDelta)); |
||||||
|
return ret; |
||||||
|
} |
||||||
|
|
||||||
|
return [aceDelta]; |
||||||
|
} |
||||||
|
|
||||||
|
function aceDeltaToCM(aceDelta) { |
||||||
|
|
||||||
|
var cmDelta = { |
||||||
|
text: [], |
||||||
|
removed: [], |
||||||
|
from: { |
||||||
|
line: aceDelta.start.row, |
||||||
|
ch: aceDelta.start.column, |
||||||
|
}, |
||||||
|
to: { |
||||||
|
// cm deltas are weird. to refers to the selection end, which |
||||||
|
// with a simple blinking cursor with no selection, is always |
||||||
|
// the same as from |
||||||
|
line: aceDelta.start.row, |
||||||
|
ch: aceDelta.start.column, |
||||||
|
}, |
||||||
|
} |
||||||
|
|
||||||
|
if (aceDelta.action == "remove") { |
||||||
|
var origStart = aceDelta.start; |
||||||
|
aceDelta.start = aceDelta.end; |
||||||
|
aceDelta.end = origStart; |
||||||
|
|
||||||
|
cmDelta.removed = aceDelta.lines |
||||||
|
cmDelta.text = [""] |
||||||
|
} else { |
||||||
|
cmDelta.text = aceDelta.lines |
||||||
|
cmDelta.removed = [""] |
||||||
|
} |
||||||
|
|
||||||
|
return cmDelta; |
||||||
|
} |
||||||
|
</script> |
||||||
|
</body> |
||||||
|
</html> |
@ -0,0 +1,70 @@ |
|||||||
|
<input type="file" style="display: hidden;" id="{{.ElemName}}" /> |
||||||
|
<div id="{{.ElemName}}_dropzone" ondrop="dropHandler(event);" ondragover="draghandler(event);" ondragenter="draghandler(event);" ondragleave="draghandler(event);" style="background-color: rgba(0,0,0,0.5); visibility: hidden; opacity:0; position: fixed; top: 0; bottom: 0; left: 0; right: 0; width: 100%; height: 100%; ; transition: visibility 175ms, opacity 175ms; z-index: 9999999;"></div> |
||||||
|
<script> |
||||||
|
document.addEventListener("DOMContentLoaded", function () { |
||||||
|
var fileInput = document.getElementById('{{.ElemName}}'); |
||||||
|
var dropzone = document.getElementById('{{.ElemName}}_dropzone'); |
||||||
|
|
||||||
|
fileInput.onchange = function () { |
||||||
|
var formData = new FormData(); |
||||||
|
fileInput.files.forEach(function (file) { |
||||||
|
formData.append(file.name, file); |
||||||
|
}); |
||||||
|
upload(formData); |
||||||
|
} |
||||||
|
|
||||||
|
var lastTarget = null; |
||||||
|
|
||||||
|
window.addEventListener("dragenter", function(e) |
||||||
|
{ |
||||||
|
lastTarget = e.target; // cache the last target here |
||||||
|
// unhide our dropzone overlay |
||||||
|
dropzone.style.visibility = ""; |
||||||
|
dropzone.style.opacity = 1; |
||||||
|
}); |
||||||
|
|
||||||
|
window.addEventListener("dragleave", function(e) |
||||||
|
{ |
||||||
|
// this is the magic part. when leaving the window, |
||||||
|
// e.target happens to be exactly what we want: what we cached |
||||||
|
// at the start, the dropzone we dragged into. |
||||||
|
// so..if dragleave target matches our cache, we hide the dropzone. |
||||||
|
if(e.target === lastTarget) |
||||||
|
{ |
||||||
|
dropzone.style.visibility = "hidden"; |
||||||
|
dropzone.style.opacity = 0; |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
function draghandler(evt) { |
||||||
|
evt.preventDefault(); |
||||||
|
} |
||||||
|
|
||||||
|
function dropHandler(evt) { |
||||||
|
evt.preventDefault(); |
||||||
|
|
||||||
|
var files = evt.dataTransfer.files; |
||||||
|
var formData = new FormData(); |
||||||
|
|
||||||
|
for (var i = 0; i < files.length; i++) { |
||||||
|
formData.append(files[i].name, files[i]); |
||||||
|
} |
||||||
|
|
||||||
|
upload(formData); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
function upload(formData) { |
||||||
|
var xhr = new XMLHttpRequest(); |
||||||
|
xhr.onreadystatechange = function(e) { |
||||||
|
if ( 4 == this.readyState ) { |
||||||
|
window.location.reload(true); |
||||||
|
} |
||||||
|
} |
||||||
|
xhr.open('POST', '/hugo/upload'); |
||||||
|
xhr.send(formData); |
||||||
|
} |
||||||
|
|
||||||
|
</script> |
@ -1,18 +1,142 @@ |
|||||||
module git.stephensearles.com/stephen/caddy-hugo2 |
module git.stephensearles.com/stephen/caddy-hugo2 |
||||||
|
|
||||||
go 1.13 |
go 1.18 |
||||||
|
|
||||||
require ( |
require ( |
||||||
git.stephensearles.com/stephen/acedoc v0.0.0-20170928122432-96da2793a59d |
git.stephensearles.com/stephen/acedoc v0.0.0-20170928122432-96da2793a59d |
||||||
git.stephensearles.com/stephen/idleshut v0.0.0-20180107224249-cde7779f51c8 |
git.stephensearles.com/stephen/idleshut v0.0.0-20180107224249-cde7779f51c8 |
||||||
github.com/PuerkitoBio/goquery v1.5.0 |
github.com/PuerkitoBio/goquery v1.5.0 |
||||||
github.com/caddyserver/caddy v1.0.3 |
github.com/caddyserver/caddy/v2 v2.1.1 |
||||||
github.com/gobuffalo/envy v1.7.0 // indirect |
github.com/caddyserver/xcaddy v0.3.0 |
||||||
github.com/gohugoio/hugo v0.58.1 |
github.com/gohugoio/hugo v0.74.4-0.20200822075643-d39636a5fc6b |
||||||
github.com/gorilla/websocket v1.4.1 |
github.com/gorilla/websocket v1.4.1 |
||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 |
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 |
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible |
github.com/peterbourgon/diskv v2.0.1+incompatible |
||||||
github.com/spf13/afero v1.2.2 |
github.com/spf13/afero v1.2.2 |
||||||
github.com/spf13/viper v1.4.0 |
github.com/spf13/viper v1.6.1 |
||||||
github.com/tajtiattila/metadata v0.0.0-20180130123038-1ef25f4c37ea |
github.com/tajtiattila/metadata v0.0.0-20180130123038-1ef25f4c37ea |
||||||
|
go.uber.org/zap v1.15.0 |
||||||
|
) |
||||||
|
|
||||||
|
require ( |
||||||
|
cloud.google.com/go v0.54.0 // indirect |
||||||
|
github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 // indirect |
||||||
|
github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect |
||||||
|
github.com/BurntSushi/toml v0.3.1 // indirect |
||||||
|
github.com/DataDog/zstd v1.4.1 // indirect |
||||||
|
github.com/Masterminds/goutils v1.1.0 // indirect |
||||||
|
github.com/Masterminds/semver/v3 v3.1.1 // indirect |
||||||
|
github.com/Masterminds/sprig/v3 v3.1.0 // indirect |
||||||
|
github.com/PuerkitoBio/purell v1.1.1 // indirect |
||||||
|
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect |
||||||
|
github.com/alecthomas/chroma v0.8.0 // indirect |
||||||
|
github.com/andybalholm/cascadia v1.0.0 // indirect |
||||||
|
github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f // indirect |
||||||
|
github.com/armon/go-radix v1.0.0 // indirect |
||||||
|
github.com/bep/debounce v1.2.0 // indirect |
||||||
|
github.com/bep/gitmap v1.1.2 // indirect |
||||||
|
github.com/bep/golibsass v0.6.0 // indirect |
||||||
|
github.com/bep/tmc v0.5.1 // indirect |
||||||
|
github.com/caddyserver/certmagic v0.11.2 // indirect |
||||||
|
github.com/cenkalti/backoff/v4 v4.0.0 // indirect |
||||||
|
github.com/cespare/xxhash v1.1.0 // indirect |
||||||
|
github.com/cheekybits/genny v1.0.0 // indirect |
||||||
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect |
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect |
||||||
|
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect |
||||||
|
github.com/dgraph-io/badger v1.5.3 // indirect |
||||||
|
github.com/dgraph-io/badger/v2 v2.0.1-rc1.0.20200413122845-09dd2e1a4195 // indirect |
||||||
|
github.com/dgraph-io/ristretto v0.0.2-0.20200115201040-8f368f2f2ab3 // indirect |
||||||
|
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect |
||||||
|
github.com/disintegration/gift v1.2.1 // indirect |
||||||
|
github.com/dlclark/regexp2 v1.2.0 // indirect |
||||||
|
github.com/dustin/go-humanize v1.0.1-0.20200219035652-afde56e7acac // indirect |
||||||
|
github.com/evanw/esbuild v0.6.5 // indirect |
||||||
|
github.com/fsnotify/fsnotify v1.4.9 // indirect |
||||||
|
github.com/getkin/kin-openapi v0.14.0 // indirect |
||||||
|
github.com/ghodss/yaml v1.0.0 // indirect |
||||||
|
github.com/go-acme/lego/v3 v3.7.0 // indirect |
||||||
|
github.com/go-sql-driver/mysql v1.5.0 // indirect |
||||||
|
github.com/gobuffalo/envy v1.7.0 // indirect |
||||||
|
github.com/gobwas/glob v0.2.3 // indirect |
||||||
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect |
||||||
|
github.com/golang/protobuf v1.4.2 // indirect |
||||||
|
github.com/golang/snappy v0.0.1 // indirect |
||||||
|
github.com/google/btree v1.0.0 // indirect |
||||||
|
github.com/google/cel-go v0.5.1 // indirect |
||||||
|
github.com/google/go-cmp v0.5.0 // indirect |
||||||
|
github.com/google/uuid v1.1.1 // indirect |
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5 // indirect |
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect |
||||||
|
github.com/huandu/xstrings v1.3.1 // indirect |
||||||
|
github.com/imdario/mergo v0.3.8 // indirect |
||||||
|
github.com/jdkato/prose v1.1.1 // indirect |
||||||
|
github.com/joho/godotenv v1.3.0 // indirect |
||||||
|
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a // indirect |
||||||
|
github.com/klauspost/cpuid v1.3.0 // indirect |
||||||
|
github.com/kyokomi/emoji v2.2.1+incompatible // indirect |
||||||
|
github.com/libdns/libdns v0.0.0-20200501023120-186724ffc821 // indirect |
||||||
|
github.com/lucas-clemente/quic-go v0.18.0 // indirect |
||||||
|
github.com/lunixbochs/vtclean v1.0.0 // indirect |
||||||
|
github.com/magiconair/properties v1.8.1 // indirect |
||||||
|
github.com/manifoldco/promptui v0.3.1 // indirect |
||||||
|
github.com/markbates/inflect v1.0.0 // indirect |
||||||
|
github.com/marten-seemann/qpack v0.2.0 // indirect |
||||||
|
github.com/marten-seemann/qtls v0.10.0 // indirect |
||||||
|
github.com/marten-seemann/qtls-go1-15 v0.1.0 // indirect |
||||||
|
github.com/mattn/go-colorable v0.1.6 // indirect |
||||||
|
github.com/mattn/go-isatty v0.0.12 // indirect |
||||||
|
github.com/mattn/go-runewidth v0.0.7 // indirect |
||||||
|
github.com/miekg/dns v1.1.30 // indirect |
||||||
|
github.com/miekg/mmark v1.3.6 // indirect |
||||||
|
github.com/mitchellh/copystructure v1.0.0 // indirect |
||||||
|
github.com/mitchellh/hashstructure v1.0.0 // indirect |
||||||
|
github.com/mitchellh/mapstructure v1.1.2 // indirect |
||||||
|
github.com/mitchellh/reflectwalk v1.0.0 // indirect |
||||||
|
github.com/muesli/smartcrop v0.3.0 // indirect |
||||||
|
github.com/nicksnyder/go-i18n v1.10.0 // indirect |
||||||
|
github.com/niklasfasching/go-org v1.3.1 // indirect |
||||||
|
github.com/olekukonko/tablewriter v0.0.4 // indirect |
||||||
|
github.com/pelletier/go-toml v1.6.0 // indirect |
||||||
|
github.com/pkg/errors v0.9.1 // indirect |
||||||
|
github.com/rogpeppe/go-internal v1.5.1 // indirect |
||||||
|
github.com/russross/blackfriday v1.5.3-0.20200218234912-41c5fccfd6f6 // indirect |
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 // indirect |
||||||
|
github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd // indirect |
||||||
|
github.com/samfoo/ansi v0.0.0-20160124022901-b6bd2ded7189 // indirect |
||||||
|
github.com/sanity-io/litter v1.2.0 // indirect |
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect |
||||||
|
github.com/smallstep/certificates v0.15.0-rc.1.0.20200506212953-e855707dc274 // indirect |
||||||
|
github.com/smallstep/cli v0.14.4 // indirect |
||||||
|
github.com/smallstep/nosql v0.3.0 // indirect |
||||||
|
github.com/smallstep/truststore v0.9.5 // indirect |
||||||
|
github.com/spf13/cast v1.3.1 // indirect |
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect |
||||||
|
github.com/spf13/pflag v1.0.5 // indirect |
||||||
|
github.com/subosito/gotenv v1.2.0 // indirect |
||||||
|
github.com/tdewolff/minify/v2 v2.6.2 // indirect |
||||||
|
github.com/tdewolff/parse/v2 v2.4.2 // indirect |
||||||
|
github.com/urfave/cli v1.22.2 // indirect |
||||||
|
github.com/yuin/goldmark v1.1.32 // indirect |
||||||
|
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 // indirect |
||||||
|
go.etcd.io/bbolt v1.3.2 // indirect |
||||||
|
go.opencensus.io v0.22.3 // indirect |
||||||
|
go.uber.org/atomic v1.6.0 // indirect |
||||||
|
go.uber.org/multierr v1.5.0 // indirect |
||||||
|
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect |
||||||
|
golang.org/x/image v0.0.0-20191214001246-9130b4cfad52 // indirect |
||||||
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect |
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect |
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect |
||||||
|
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 // indirect |
||||||
|
golang.org/x/text v0.3.2 // indirect |
||||||
|
google.golang.org/api v0.20.0 // indirect |
||||||
|
google.golang.org/appengine v1.6.5 // indirect |
||||||
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect |
||||||
|
google.golang.org/grpc v1.27.1 // indirect |
||||||
|
google.golang.org/protobuf v1.25.0 // indirect |
||||||
|
gopkg.in/ini.v1 v1.51.1 // indirect |
||||||
|
gopkg.in/square/go-jose.v2 v2.4.0 // indirect |
||||||
|
gopkg.in/yaml.v2 v2.3.0 // indirect |
||||||
|
howett.net/plist v0.0.0-20200419221736-3b63eb3a43b5 // indirect |
||||||
) |
) |
||||||
|
@ -0,0 +1,8 @@ |
|||||||
|
.PHONY: run |
||||||
|
run: CADDY_DEBUG=1 |
||||||
|
run: |
||||||
|
xcaddy build --with git.stephensearles.com/stephen/caddy-hugo2@latest=./ && cd testdir && ../caddy run --config Caddyfile
|
||||||
|
|
||||||
|
.PHONY: build |
||||||
|
build: |
||||||
|
xcaddy build --with github.com/caddy-dns/digitalocean --with git.stephensearles.com/stephen/caddy-hugo2@latest=./
|
@ -0,0 +1,17 @@ |
|||||||
|
{ |
||||||
|
order hugo last |
||||||
|
} |
||||||
|
|
||||||
|
http://localhost:8080 { |
||||||
|
hugo { |
||||||
|
comments test |
||||||
|
} |
||||||
|
root ./testdir/testsite |
||||||
|
log |
||||||
|
} |
||||||
|
|
||||||
|
http://localhost:8081, http://localhost:8082 { |
||||||
|
root ./testdir/testsite2 |
||||||
|
hugo |
||||||
|
log |
||||||
|
} |
@ -1,14 +0,0 @@ |
|||||||
localhost:8080 { |
|
||||||
hugo { |
|
||||||
comments test |
|
||||||
} |
|
||||||
root ./testsite |
|
||||||
errors { * } |
|
||||||
pprof |
|
||||||
} |
|
||||||
|
|
||||||
localhost:8081, localhost:8082 { |
|
||||||
root ./testsite2 |
|
||||||
hugo |
|
||||||
errors { * } |
|
||||||
} |
|
Loading…
Reference in new issue