upd
This commit is contained in:
parent
493d23c2f3
commit
038d8d0859
7
Dockerfile
Normal file
7
Dockerfile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
FROM thevlang/vlang:latest AS builder
|
||||||
|
COPY . .
|
||||||
|
RUN v -prod -cc gcc -cflags -static -cflags -s -d habraview_version=$(git describe --tags) . -o /habraview
|
||||||
|
|
||||||
|
FROM scratch AS prod
|
||||||
|
COPY --from=builder /habraview .
|
||||||
|
ENTRYPOINT ["/habraview"]
|
9
Makefile
9
Makefile
@ -1,7 +1,2 @@
|
|||||||
all: build
|
bin:
|
||||||
|
v -prod -cflags -static -d habraview_version=$$(git describe --tags) .
|
||||||
build:
|
|
||||||
v -o habraview src
|
|
||||||
|
|
||||||
prod:
|
|
||||||
v -o habraview -prod -cc clang -compress src
|
|
||||||
|
@ -47,5 +47,5 @@ http://localhost:8888?id=853062
|
|||||||
Нужны компиляторы `gcc` и [v](https://vlang.io):
|
Нужны компиляторы `gcc` и [v](https://vlang.io):
|
||||||
|
|
||||||
```
|
```
|
||||||
v -prod -cflags -static -cflags -s .
|
make
|
||||||
```
|
```
|
||||||
|
58
habraview.v
58
habraview.v
@ -2,6 +2,9 @@ module main
|
|||||||
|
|
||||||
import cli
|
import cli
|
||||||
import habr
|
import habr
|
||||||
|
import net
|
||||||
|
import net.urllib
|
||||||
|
import net.http.mime
|
||||||
import os
|
import os
|
||||||
import veb
|
import veb
|
||||||
|
|
||||||
@ -17,6 +20,22 @@ struct Response {
|
|||||||
msg string
|
msg string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const embedded = {
|
||||||
|
'style.css': $embed_file('assets/style.css')
|
||||||
|
'highlight.min.css': $embed_file('assets/highlight.min.css')
|
||||||
|
'highlight.min.js': $embed_file('assets/highlight.min.js')
|
||||||
|
'habrfixer.js': $embed_file('assets/habrfixer.js')
|
||||||
|
'favicon.ico': $embed_file('assets/favicon.ico')
|
||||||
|
}
|
||||||
|
|
||||||
|
@['/assets/:filename']
|
||||||
|
fn (a &App) assets(mut ctx Context, filename string) veb.Result {
|
||||||
|
asset := embedded[filename] or { return ctx.not_found() }
|
||||||
|
mimetype := mime.get_mime_type(os.file_ext(filename).trim_left('.'))
|
||||||
|
ctx.set_content_type(mimetype)
|
||||||
|
return ctx.text(asset.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
@[get]
|
@[get]
|
||||||
fn (a &App) index(mut ctx Context) veb.Result {
|
fn (a &App) index(mut ctx Context) veb.Result {
|
||||||
article_id := ctx.query['id'] or { habr.get_id_from_url(ctx.query['url']) or { '' } }
|
article_id := ctx.query['id'] or { habr.get_id_from_url(ctx.query['url']) or { '' } }
|
||||||
@ -32,35 +51,42 @@ fn (a &App) index(mut ctx Context) veb.Result {
|
|||||||
return $veb.html()
|
return $veb.html()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn runserver(port int) ! {
|
fn runserver(host string, port int) ! {
|
||||||
os.chdir(os.dir(@FILE))!
|
|
||||||
mut app := &App{}
|
mut app := &App{}
|
||||||
app.handle_static('assets', false)!
|
mut ipversion := net.AddrFamily.ip
|
||||||
app.serve_static('/favicon.ico', 'assets/favicon.ico')!
|
if host.contains(':') {
|
||||||
veb.run[App, Context](mut app, port)
|
ipversion = net.AddrFamily.ip6
|
||||||
|
}
|
||||||
|
params := veb.RunParams{
|
||||||
|
host: host
|
||||||
|
port: port
|
||||||
|
family: ipversion
|
||||||
|
}
|
||||||
|
veb.run_at[App, Context](mut app, params)!
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
mut app := cli.Command{
|
mut app := cli.Command{
|
||||||
name: 'habraview'
|
name: 'habraview'
|
||||||
|
usage: '[host][:port]'
|
||||||
description: 'Habr.com posts viewer.'
|
description: 'Habr.com posts viewer.'
|
||||||
version: $d('habraview_version', '0.0.0')
|
version: $d('habraview_version', '0.0.0')
|
||||||
defaults: struct {
|
defaults: struct {
|
||||||
man: false
|
man: false
|
||||||
}
|
}
|
||||||
execute: fn (cmd cli.Command) ! {
|
execute: fn (cmd cli.Command) ! {
|
||||||
port := cmd.flags.get_int('port') or { 8080 }
|
mut host, mut port := '0.0.0.0', '8888'
|
||||||
runserver(port)!
|
if cmd.args.len == 1 {
|
||||||
|
host, port = urllib.split_host_port(cmd.args[0])
|
||||||
|
if host.is_blank() {
|
||||||
|
host = '0.0.0.0'
|
||||||
|
}
|
||||||
|
if port.is_blank() {
|
||||||
|
port = '8888'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
runserver(host, port.int())!
|
||||||
}
|
}
|
||||||
flags: [
|
|
||||||
cli.Flag{
|
|
||||||
flag: .int
|
|
||||||
name: 'port'
|
|
||||||
abbrev: 'p'
|
|
||||||
description: 'Listen port [default: 8888].'
|
|
||||||
default_value: ['8888']
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
app.setup()
|
app.setup()
|
||||||
app.parse(os.args)
|
app.parse(os.args)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>@{article.title}</title>
|
<title>@{article.title}</title>
|
||||||
|
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico">
|
||||||
@css '/assets/style.css'
|
@css '/assets/style.css'
|
||||||
@css '/assets/highlight.min.css'
|
@css '/assets/highlight.min.css'
|
||||||
</head>
|
</head>
|
||||||
@ -49,7 +50,7 @@
|
|||||||
</main>
|
</main>
|
||||||
<footer>
|
<footer>
|
||||||
</footer>
|
</footer>
|
||||||
@js '/assets/habr-fixer.js'
|
@js '/assets/habrfixer.js'
|
||||||
@js '/assets/highlight.min.js'
|
@js '/assets/highlight.min.js'
|
||||||
<script>hljs.highlightAll();</script>
|
<script>hljs.highlightAll();</script>
|
||||||
</body>
|
</body>
|
||||||
|
Loading…
Reference in New Issue
Block a user