release
This commit is contained in:
13
README.md
Normal file
13
README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# V Documentation Server
|
||||||
|
|
||||||
|
Synopsis:
|
||||||
|
|
||||||
|
```
|
||||||
|
generate and serve HTML documentation for V module
|
||||||
|
|
||||||
|
usage: vdocs [-l addr:port] [<dir>]
|
||||||
|
|
||||||
|
options:
|
||||||
|
-help print this help message and exit
|
||||||
|
-l, -listen listen address, 127.0.0.1:4000 by default
|
||||||
|
```
|
22
UNLICENSE
Normal file
22
UNLICENSE
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
|
||||||
|
software, either in source code form or as a compiled binary, for any purpose,
|
||||||
|
commercial or non-commercial, and by any means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors of this
|
||||||
|
software dedicate any and all copyright interest in the software to the public
|
||||||
|
domain. We make this dedication for the benefit of the public at large and to
|
||||||
|
the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of relinquishment in
|
||||||
|
perpetuity of all present and future rights to this software under copyright
|
||||||
|
law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
||||||
|
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
6
v.mod
6
v.mod
@ -1,7 +1,7 @@
|
|||||||
Module {
|
Module {
|
||||||
name: 'vdocserve'
|
name: 'vdocs'
|
||||||
description: 'Generate and serve module documentation'
|
description: 'Generate and serve V module documentation'
|
||||||
version: '0.1.0'
|
version: '0.1.0'
|
||||||
license: 'MIT'
|
license: 'Unlicense'
|
||||||
dependencies: []
|
dependencies: []
|
||||||
}
|
}
|
||||||
|
60
vdocs.v
Normal file
60
vdocs.v
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
module main
|
||||||
|
|
||||||
|
import flag
|
||||||
|
import log
|
||||||
|
import net.http.file
|
||||||
|
import os
|
||||||
|
import rand
|
||||||
|
import v.vmod
|
||||||
|
|
||||||
|
struct FlagConfig {
|
||||||
|
mut:
|
||||||
|
help bool
|
||||||
|
listen string = '127.0.0.1:4000' @[short: l]
|
||||||
|
dir string @[ignore]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
mut flags, no_matches := flag.to_struct[FlagConfig](os.args, skip: 1, style: .go_flag) or {
|
||||||
|
eprintln('cmdline parsing error, see -help for info')
|
||||||
|
exit(2)
|
||||||
|
}
|
||||||
|
if no_matches.len == 0 {
|
||||||
|
flags.dir = '.'
|
||||||
|
} else if no_matches.len == 1 {
|
||||||
|
flags.dir = no_matches[0]
|
||||||
|
} else {
|
||||||
|
eprintln('unrecognized arguments: ${no_matches[1..]}')
|
||||||
|
exit(2)
|
||||||
|
}
|
||||||
|
if flags.help {
|
||||||
|
println('generate and serve HTML documentation for V module')
|
||||||
|
println('')
|
||||||
|
println('usage: vdocs [-l addr:port] [<dir>]')
|
||||||
|
println('')
|
||||||
|
println('options:')
|
||||||
|
println(' -help print this help message and exit')
|
||||||
|
println(' -l, -listen listen address, 127.0.0.1:4000 by default')
|
||||||
|
exit(0)
|
||||||
|
}
|
||||||
|
mut cache := vmod.get_cache()
|
||||||
|
modfile := cache.get_by_folder(os.getwd())
|
||||||
|
modname := vmod.from_file(modfile.vmod_file)!.name
|
||||||
|
tmp_dir := os.join_path(os.temp_dir(), os.geteuid().str(), modname + '_docs_' + rand.u32().hex())
|
||||||
|
log.info('generate HTML docs...')
|
||||||
|
os.mkdir_all(tmp_dir, mode: 0o755)!
|
||||||
|
os.execute_or_exit('v doc -f html -o ${tmp_dir} -m ${flags.dir} ')
|
||||||
|
signal_callback := fn [tmp_dir] (_ os.Signal) {
|
||||||
|
eprintln('\rCleanup...')
|
||||||
|
os.rmdir_all(tmp_dir) or {
|
||||||
|
log.error('unable to delete temporary dir ${tmp_dir}')
|
||||||
|
exit(1)
|
||||||
|
}
|
||||||
|
exit(0)
|
||||||
|
}
|
||||||
|
os.signal_opt(.int, signal_callback)!
|
||||||
|
os.signal_opt(.term, signal_callback)!
|
||||||
|
log.info('docs stored in temporary dir ${tmp_dir}')
|
||||||
|
log.info('use ^C to quit server')
|
||||||
|
file.serve(folder: tmp_dir, index_file: modname + '.html', on: flags.listen)
|
||||||
|
}
|
42
vdocserve.v
42
vdocserve.v
@ -1,42 +0,0 @@
|
|||||||
module main
|
|
||||||
|
|
||||||
import flag
|
|
||||||
import log
|
|
||||||
import net.http.file
|
|
||||||
import os
|
|
||||||
import rand
|
|
||||||
import v.vmod
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
mut fp := flag.new_flag_parser(os.args)
|
|
||||||
fp.application('vdocserve')
|
|
||||||
fp.description('generate and serve V module HTML documentation')
|
|
||||||
fp.version('0.1.0')
|
|
||||||
fp.skip_executable()
|
|
||||||
fp.limit_free_args(0, 2)!
|
|
||||||
listen := fp.string('listen', u8(`l`), '127.0.0.1:4000', 'HTTP server listen address:port')
|
|
||||||
fp.finalize() or {
|
|
||||||
eprintln(err)
|
|
||||||
println(fp.usage())
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
mut cache := vmod.get_cache()
|
|
||||||
modfile := cache.get_by_folder(os.getwd())
|
|
||||||
modname := vmod.from_file(modfile.vmod_file)!.name
|
|
||||||
docs_dir := os.join_path(os.temp_dir(), os.geteuid().str(), modname + '_docs_' +
|
|
||||||
rand.u16().hex())
|
|
||||||
log.info('generating HTML docs in temporary dir ${docs_dir}')
|
|
||||||
os.mkdir_all(docs_dir, mode: 0o755)!
|
|
||||||
os.execute_or_exit('v doc -f html -o ${docs_dir} -m . ')
|
|
||||||
sigint_callback := fn [docs_dir] (_ os.Signal) {
|
|
||||||
os.rmdir_all(docs_dir) or {
|
|
||||||
log.error('unable to delete temporary dir ${docs_dir}')
|
|
||||||
exit(1)
|
|
||||||
}
|
|
||||||
eprintln('cleanup temporary data')
|
|
||||||
exit(0)
|
|
||||||
}
|
|
||||||
os.signal_opt(.int, sigint_callback)!
|
|
||||||
log.info('starting docs server, use ^C to quit')
|
|
||||||
file.serve(folder: docs_dir, index_file: modname + '.html', on: listen)
|
|
||||||
}
|
|
Reference in New Issue
Block a user