This commit is contained in:
commit
0bbbd68dbe
13
.drone.yml
Normal file
13
.drone.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
kind: pipeline
|
||||
name: default
|
||||
|
||||
steps:
|
||||
- name: docker
|
||||
image: plugins/docker
|
||||
settings:
|
||||
registry: r.sbruder.de
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
repo: r.sbruder.de/nginx-index
|
8
Dockerfile
Normal file
8
Dockerfile
Normal file
|
@ -0,0 +1,8 @@
|
|||
FROM nginx:alpine
|
||||
|
||||
RUN mkdir /srv/www
|
||||
|
||||
COPY assets /usr/share/nginx/html/assets
|
||||
COPY default.conf /etc/nginx/conf.d/default.conf
|
||||
|
||||
EXPOSE 80
|
4
assets/header.html
Normal file
4
assets/header.html
Normal file
|
@ -0,0 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="/__assets/listing.css">
|
||||
<script src="/__assets/listing.js"></script>
|
44
assets/listing.css
Normal file
44
assets/listing.css
Normal file
|
@ -0,0 +1,44 @@
|
|||
body, html {
|
||||
background-color: #fdf6e3;
|
||||
color: #657b83;
|
||||
font-family: "TeX Gyre Heros", "Roboto", "Helvetica", "Arial", sans-serif;
|
||||
}
|
||||
|
||||
tr:nth-child(even) {
|
||||
background: #eee8d5;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding: 0.1em 0.5em;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
background: #eee8d5;
|
||||
border-bottom: 1px solid #657b83;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #586e75;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #073642;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#search-field {
|
||||
width: 100%;
|
||||
border: none;
|
||||
margin-bottom: 15px;
|
||||
background: #eee8d5;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
hr {
|
||||
display: none;
|
||||
}
|
73
assets/listing.js
Normal file
73
assets/listing.js
Normal file
|
@ -0,0 +1,73 @@
|
|||
document.addEventListener('DOMContentLoaded', () => {
|
||||
function humanFileSize(bytes) {
|
||||
const thresh = 1024
|
||||
if(Math.abs(bytes) < thresh) {
|
||||
return bytes + ' B'
|
||||
}
|
||||
const units = ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB']
|
||||
var u = -1
|
||||
do {
|
||||
bytes /= thresh
|
||||
++u
|
||||
} while(Math.abs(bytes) >= thresh && u < units.length - 1)
|
||||
return bytes.toFixed(1)+' '+units[u]
|
||||
}
|
||||
|
||||
|
||||
function textToA(line) {
|
||||
let outerElement = document.createElement('div')
|
||||
outerElement.innerHTML = line
|
||||
return outerElement.getElementsByTagName('a')[0]
|
||||
}
|
||||
|
||||
function parseLine(line) {
|
||||
const href = textToA(line).href
|
||||
const filename = href.substr(-1) === '/' ? decodeURIComponent(href.split('/').slice(-2, -1)[0]) : decodeURIComponent(href.split('/').pop())
|
||||
const size = line.split(' ').pop()
|
||||
return {
|
||||
href: href,
|
||||
filename: filename,
|
||||
size: size
|
||||
}
|
||||
}
|
||||
|
||||
function processLine(line) {
|
||||
meta = parseLine(line)
|
||||
return `<tr><td><a href="${meta.href}">${meta.filename}</a></td><td>${meta.size === '-' ? '-' : humanFileSize(meta.size)}</td></tr>`
|
||||
}
|
||||
|
||||
const collator = new Intl.Collator('kn', {numeric: true})
|
||||
|
||||
// transform plain text to table
|
||||
document.querySelector('pre').outerHTML = '<table><tr><th>Name</th><th>Size</th></tr><tr><td><a href="..">..</a></td><td>-</td></tr>' + document.querySelector('pre').innerHTML
|
||||
.split('\n')
|
||||
.filter(line => line !== '')
|
||||
.filter(line => line !== '<a href="../">../</a>')
|
||||
.map(processLine)
|
||||
.sort(collator.compare)
|
||||
.join('\n') + '</table>'
|
||||
|
||||
let searchField = document.createElement('input')
|
||||
searchField.id = 'search-field'
|
||||
searchField.autofocus = true
|
||||
document.querySelector('body').insertBefore(searchField, document.querySelector('table'))
|
||||
|
||||
const rows = [...document.querySelectorAll('tr:not(:first-child)')]
|
||||
|
||||
document.querySelector('#search-field').addEventListener("input", e => {
|
||||
const searchValue = e.target.value.toLowerCase()
|
||||
rows.forEach(row => {
|
||||
const file = row.querySelector('td:nth-child(1) a').innerText
|
||||
if (!file.toLowerCase().includes(searchValue)) {
|
||||
row.style.display = 'none'
|
||||
} else {
|
||||
row.style.display = 'table-row'
|
||||
}
|
||||
})
|
||||
|
||||
const visibleRows = rows.filter(row => row.style.display === 'table-row')
|
||||
if (visibleRows.length === 1) {
|
||||
window.location = visibleRows[0].querySelector('td a').href
|
||||
}
|
||||
})
|
||||
})
|
17
default.conf
Normal file
17
default.conf
Normal file
|
@ -0,0 +1,17 @@
|
|||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
access_log off;
|
||||
|
||||
location / {
|
||||
root /srv/www/;
|
||||
autoindex on;
|
||||
autoindex_exact_size on;
|
||||
add_before_body /__assets/header.html;
|
||||
}
|
||||
|
||||
location /__assets/ {
|
||||
alias /usr/share/nginx/html/assets/;
|
||||
}
|
||||
}
|
Reference in a new issue