Compare commits
	
		
			4 Commits 
		
	
	
		
			548075696c
			...
			af9d6d6eb9
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | af9d6d6eb9 | 3 years ago | 
|  | 43e119f12c | 3 years ago | 
|  | 16e3583927 | 3 years ago | 
|  | 51c4837aaf | 3 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 | ||||
| 
 | ||||
| go 1.13 | ||||
| go 1.18 | ||||
| 
 | ||||
| require ( | ||||
| 	git.stephensearles.com/stephen/acedoc v0.0.0-20170928122432-96da2793a59d | ||||
| 	git.stephensearles.com/stephen/idleshut v0.0.0-20180107224249-cde7779f51c8 | ||||
| 	github.com/PuerkitoBio/goquery v1.5.0 | ||||
| 	github.com/caddyserver/caddy v1.0.3 | ||||
| 	github.com/gobuffalo/envy v1.7.0 // indirect | ||||
| 	github.com/gohugoio/hugo v0.58.1 | ||||
| 	github.com/caddyserver/caddy/v2 v2.1.1 | ||||
| 	github.com/caddyserver/xcaddy v0.3.0 | ||||
| 	github.com/gohugoio/hugo v0.74.4-0.20200822075643-d39636a5fc6b | ||||
| 	github.com/gorilla/websocket v1.4.1 | ||||
| 	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 | ||||
| 	github.com/peterbourgon/diskv v2.0.1+incompatible | ||||
| 	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 | ||||
| 	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