vdoc: remove http doc server (#7984)
parent
e79695e8fc
commit
362c21de06
|
@ -127,23 +127,24 @@ fn (vd VDoc) render_search_index(out Output) {
|
||||||
os.write_file(out_file_path, js_search_index.str() + js_search_data.str())
|
os.write_file(out_file_path, js_search_index.str() + js_search_data.str())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut vd VDoc) render_static_html(serve_via_http bool, out Output) {
|
fn (mut vd VDoc) render_static_html(out Output) {
|
||||||
vd.assets = {
|
vd.assets = {
|
||||||
'doc_css': vd.get_resource(css_js_assets[0], true, out)
|
'doc_css': vd.get_resource(css_js_assets[0], out)
|
||||||
'normalize_css': vd.get_resource(css_js_assets[1], true, out)
|
'normalize_css': vd.get_resource(css_js_assets[1], out)
|
||||||
'doc_js': vd.get_resource(css_js_assets[2], !serve_via_http, out)
|
'doc_js': vd.get_resource(css_js_assets[2], out)
|
||||||
'dark_mode_js': vd.get_resource(css_js_assets[3], !serve_via_http, out)
|
'dark_mode_js': vd.get_resource(css_js_assets[3], out)
|
||||||
'light_icon': vd.get_resource('light.svg', true, out)
|
'light_icon': vd.get_resource('light.svg', out)
|
||||||
'dark_icon': vd.get_resource('dark.svg', true, out)
|
'dark_icon': vd.get_resource('dark.svg', out)
|
||||||
'menu_icon': vd.get_resource('menu.svg', true, out)
|
'menu_icon': vd.get_resource('menu.svg', out)
|
||||||
'arrow_icon': vd.get_resource('arrow.svg', true, out)
|
'arrow_icon': vd.get_resource('arrow.svg', out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (vd VDoc) get_resource(name string, minify bool, out Output) string {
|
fn (vd VDoc) get_resource(name string, out Output) string {
|
||||||
cfg := vd.cfg
|
cfg := vd.cfg
|
||||||
path := os.join_path(res_path, name)
|
path := os.join_path(res_path, name)
|
||||||
mut res := os.read_file(path) or { panic('vdoc: could not read $path') }
|
mut res := os.read_file(path) or { panic('vdoc: could not read $path') }
|
||||||
|
/*
|
||||||
if minify {
|
if minify {
|
||||||
if name.ends_with('.js') {
|
if name.ends_with('.js') {
|
||||||
res = js_compress(res)
|
res = js_compress(res)
|
||||||
|
@ -151,6 +152,7 @@ fn (vd VDoc) get_resource(name string, minify bool, out Output) string {
|
||||||
res = res.split_into_lines().map(it.trim_space()).join('')
|
res = res.split_into_lines().map(it.trim_space()).join('')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
// TODO: Make SVG inline for now
|
// TODO: Make SVG inline for now
|
||||||
if cfg.inline_assets || path.ends_with('.svg') {
|
if cfg.inline_assets || path.ends_with('.svg') {
|
||||||
return res
|
return res
|
||||||
|
@ -482,6 +484,7 @@ fn html_tag_escape(str string) string {
|
||||||
return str.replace_each(['<', '<', '>', '>'])
|
return str.replace_each(['<', '<', '>', '>'])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
fn js_compress(str string) string {
|
fn js_compress(str string) string {
|
||||||
mut js := strings.new_builder(200)
|
mut js := strings.new_builder(200)
|
||||||
lines := str.split_into_lines()
|
lines := str.split_into_lines()
|
||||||
|
@ -503,7 +506,7 @@ fn js_compress(str string) string {
|
||||||
js.free()
|
js.free()
|
||||||
return js_str
|
return js_str
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
fn write_toc(dn doc.DocNode, mut toc strings.Builder) {
|
fn write_toc(dn doc.DocNode, mut toc strings.Builder) {
|
||||||
mut toc_slug := if dn.name.len == 0 || dn.content.len == 0 { '' } else { slug(dn.name) }
|
mut toc_slug := if dn.name.len == 0 || dn.content.len == 0 { '' } else { slug(dn.name) }
|
||||||
if toc_slug == '' && dn.children.len > 0 {
|
if toc_slug == '' && dn.children.len > 0 {
|
||||||
|
|
|
@ -1,95 +0,0 @@
|
||||||
module main
|
|
||||||
|
|
||||||
import io
|
|
||||||
import net
|
|
||||||
import strings
|
|
||||||
|
|
||||||
fn (mut vd VDoc) serve_html(out Output) {
|
|
||||||
cfg := vd.cfg
|
|
||||||
if out.typ == .html {
|
|
||||||
vd.render_static_html(true, out)
|
|
||||||
}
|
|
||||||
docs := vd.render(out)
|
|
||||||
dkeys := docs.keys()
|
|
||||||
if dkeys.len < 1 {
|
|
||||||
eprintln('no documentation created, the module has no `pub` functions')
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
def_name := docs.keys()[0]
|
|
||||||
server_url := 'http://localhost:' + cfg.server_port.str()
|
|
||||||
server := net.listen_tcp(cfg.server_port) or { panic(err) }
|
|
||||||
println('Serving docs on: $server_url')
|
|
||||||
if cfg.open_docs {
|
|
||||||
open_url(server_url)
|
|
||||||
}
|
|
||||||
content_type := match out.typ {
|
|
||||||
.html { 'text/html' }
|
|
||||||
.markdown { 'text/markdown' }
|
|
||||||
.json { 'application/json' }
|
|
||||||
else { 'text/plain' }
|
|
||||||
}
|
|
||||||
server_context := VdocHttpServerContext{
|
|
||||||
docs: docs
|
|
||||||
content_type: content_type
|
|
||||||
default_filename: def_name
|
|
||||||
}
|
|
||||||
for {
|
|
||||||
mut conn := server.accept() or {
|
|
||||||
server.close() or { }
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
handle_http_connection(mut conn, server_context)
|
|
||||||
conn.close() or { eprintln('error closing the connection: $err') }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct VdocHttpServerContext {
|
|
||||||
docs map[string]string
|
|
||||||
content_type string
|
|
||||||
default_filename string
|
|
||||||
}
|
|
||||||
|
|
||||||
fn handle_http_connection(mut con net.TcpConn, ctx &VdocHttpServerContext) {
|
|
||||||
mut reader := io.new_buffered_reader(reader: io.make_reader(con))
|
|
||||||
first_line := reader.read_line() or {
|
|
||||||
send_http_response(mut con, 501, ctx.content_type, 'bad request')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
request_parts := first_line.split(' ')
|
|
||||||
if request_parts.len != 3 {
|
|
||||||
send_http_response(mut con, 501, ctx.content_type, 'bad request')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
urlpath := request_parts[1]
|
|
||||||
filename := if urlpath == '/' {
|
|
||||||
ctx.default_filename.trim_left('/')
|
|
||||||
} else {
|
|
||||||
urlpath.trim_left('/')
|
|
||||||
}
|
|
||||||
if ctx.docs[filename].len == 0 {
|
|
||||||
send_http_response(mut con, 404, ctx.content_type, 'file not found')
|
|
||||||
return
|
|
||||||
}
|
|
||||||
send_http_response(mut con, 200, ctx.content_type, ctx.docs[filename])
|
|
||||||
}
|
|
||||||
|
|
||||||
fn send_http_response(mut con net.TcpConn, http_code int, content_type string, html string) {
|
|
||||||
content_length := html.len.str()
|
|
||||||
shttp_code := http_code.str()
|
|
||||||
mut http_response := strings.new_builder(20000)
|
|
||||||
http_response.write('HTTP/1.1 ')
|
|
||||||
http_response.write(shttp_code)
|
|
||||||
http_response.write(' OK\r\n')
|
|
||||||
http_response.write('Server: VDoc\r\n')
|
|
||||||
http_response.write('Content-Type: ')
|
|
||||||
http_response.write(content_type)
|
|
||||||
http_response.write('\r\n')
|
|
||||||
http_response.write('Content-Length: ')
|
|
||||||
http_response.write(content_length)
|
|
||||||
http_response.write('\r\n')
|
|
||||||
http_response.write('Connection: close\r\n')
|
|
||||||
http_response.write('\r\n')
|
|
||||||
http_response.write(html)
|
|
||||||
sresponse := http_response.str()
|
|
||||||
con.write_str(sresponse) or { eprintln('error sending http response: $err') }
|
|
||||||
}
|
|
|
@ -47,14 +47,11 @@ mut:
|
||||||
local_filename string
|
local_filename string
|
||||||
local_pos int
|
local_pos int
|
||||||
show_loc bool // for plaintext
|
show_loc bool // for plaintext
|
||||||
serve_http bool // for html
|
|
||||||
is_multi bool
|
is_multi bool
|
||||||
is_vlib bool
|
is_vlib bool
|
||||||
is_verbose bool
|
is_verbose bool
|
||||||
include_readme bool
|
include_readme bool
|
||||||
include_examples bool = true
|
include_examples bool = true
|
||||||
open_docs bool
|
|
||||||
server_port int = 8046
|
|
||||||
inline_assets bool
|
inline_assets bool
|
||||||
no_timestamp bool
|
no_timestamp bool
|
||||||
output_path string
|
output_path string
|
||||||
|
@ -336,14 +333,10 @@ fn (mut vd VDoc) generate_docs_from_file() {
|
||||||
docs << vd.docs.filter(it.head.name != 'builtin')
|
docs << vd.docs.filter(it.head.name != 'builtin')
|
||||||
vd.docs = docs
|
vd.docs = docs
|
||||||
}
|
}
|
||||||
if cfg.serve_http {
|
|
||||||
vd.serve_html(out)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
vd.vprintln('Rendering docs...')
|
vd.vprintln('Rendering docs...')
|
||||||
if out.path.len == 0 || out.path == 'stdout' {
|
if out.path.len == 0 || out.path == 'stdout' {
|
||||||
if out.typ == .html {
|
if out.typ == .html {
|
||||||
vd.render_static_html(cfg.serve_http, out)
|
vd.render_static_html(out)
|
||||||
}
|
}
|
||||||
outputs := vd.render(out)
|
outputs := vd.render(out)
|
||||||
if outputs.len == 0 {
|
if outputs.len == 0 {
|
||||||
|
@ -370,7 +363,7 @@ fn (mut vd VDoc) generate_docs_from_file() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if out.typ == .html {
|
if out.typ == .html {
|
||||||
vd.render_static_html(cfg.serve_http, out)
|
vd.render_static_html(out)
|
||||||
}
|
}
|
||||||
vd.render_parallel(out)
|
vd.render_parallel(out)
|
||||||
println('Creating search index...')
|
println('Creating search index...')
|
||||||
|
@ -433,9 +426,6 @@ fn parse_arguments(args []string) Config {
|
||||||
cfg.output_path = if opath == 'stdout' { opath } else { os.real_path(opath) }
|
cfg.output_path = if opath == 'stdout' { opath } else { os.real_path(opath) }
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
'-open' {
|
|
||||||
cfg.open_docs = true
|
|
||||||
}
|
|
||||||
'-pos' {
|
'-pos' {
|
||||||
if !cfg.is_local {
|
if !cfg.is_local {
|
||||||
eprintln('vdoc: `-pos` is only allowed with `-filename` flag.')
|
eprintln('vdoc: `-pos` is only allowed with `-filename` flag.')
|
||||||
|
@ -444,27 +434,6 @@ fn parse_arguments(args []string) Config {
|
||||||
cfg.local_pos = cmdline.option(current_args, '-pos', '').int()
|
cfg.local_pos = cmdline.option(current_args, '-pos', '').int()
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
'-p' {
|
|
||||||
s_port := cmdline.option(current_args, '-p', '')
|
|
||||||
s_port_int := s_port.int()
|
|
||||||
if s_port.len == 0 {
|
|
||||||
eprintln('vdoc: No port number specified on "-p".')
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
if s_port != s_port_int.str() {
|
|
||||||
eprintln('vdoc: Invalid port number.')
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
cfg.server_port = s_port_int
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
'-s' {
|
|
||||||
cfg.inline_assets = true
|
|
||||||
cfg.serve_http = true
|
|
||||||
if cfg.output_type == .unset {
|
|
||||||
cfg.output_type = .html
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'-no-timestamp' {
|
'-no-timestamp' {
|
||||||
cfg.no_timestamp = true
|
cfg.no_timestamp = true
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue