blob: 97d68d6dc1b5ec2ff7f5a1bdc9537dc368392aee [file] [log] [blame]
def documentation_attributes():
return [
"toc2",
'newline="\\n"',
'asterisk="*"',
'plus="+"',
'caret="^"',
'startsb="["',
'endsb="]"',
'tilde="~"',
"last-update-label!",
"source-highlighter=prettify",
"stylesheet=DEFAULT",
"linkcss=true",
"prettifydir=.",
# Just a placeholder, will be filled in asciidoctor java binary:
"revnumber=%s",
]
def _replace_macros_impl(ctx):
cmd = [
ctx.file._exe.path,
"--suffix",
ctx.attr.suffix,
"-s",
ctx.file.src.path,
"-o",
ctx.outputs.out.path,
]
if ctx.attr.searchbox:
cmd.append("--searchbox")
else:
cmd.append("--no-searchbox")
ctx.actions.run_shell(
inputs = [ctx.file._exe, ctx.file.src],
outputs = [ctx.outputs.out],
command = cmd,
use_default_shell_env = True,
progress_message = "Replacing macros in %s" % ctx.file.src.short_path,
)
_replace_macros = rule(
attrs = {
"_exe": attr.label(
default = Label("//Documentation:replace_macros.py"),
allow_single_file = True,
),
"src": attr.label(
mandatory = True,
allow_single_file = [".txt"],
),
"suffix": attr.string(mandatory = True),
"searchbox": attr.bool(default = True),
"out": attr.output(mandatory = True),
},
implementation = _replace_macros_impl,
)
def _generate_asciidoc_args(ctx):
args = []
if ctx.attr.backend:
args.extend(["-b", ctx.attr.backend])
revnumber = False
for attribute in ctx.attr.attributes:
if attribute.startswith("revnumber="):
revnumber = True
else:
args.extend(["-a", attribute])
if revnumber:
args.extend([
"--revnumber-file",
ctx.file.version.path,
])
for src in ctx.files.srcs:
args.append(src.path)
return args
def _invoke_replace_macros(name, src, suffix, searchbox):
fn = src
if fn.startswith(":"):
fn = src[1:]
_replace_macros(
name = "macros_%s_%s" % (name, fn),
src = src,
out = fn + suffix,
suffix = suffix,
searchbox = searchbox,
)
return ":" + fn + suffix, fn.replace(".txt", ".html")
def _asciidoc_impl(ctx):
args = [
"--bazel",
"--in-ext",
".txt" + ctx.attr.suffix,
"--out-ext",
".html",
]
args.extend(_generate_asciidoc_args(ctx))
ctx.actions.run(
inputs = ctx.files.srcs + [ctx.executable._exe, ctx.file.version],
outputs = ctx.outputs.outs,
executable = ctx.executable._exe,
arguments = args,
progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
)
_asciidoc_attrs = {
"_exe": attr.label(
default = Label("//java/com/google/gerrit/asciidoctor:asciidoc"),
cfg = "host",
allow_files = True,
executable = True,
),
"srcs": attr.label_list(
mandatory = True,
allow_files = True,
),
"version": attr.label(
default = Label("//:version.txt"),
allow_single_file = True,
),
"suffix": attr.string(mandatory = True),
"backend": attr.string(),
"attributes": attr.string_list(),
}
_asciidoc = rule(
attrs = dict(_asciidoc_attrs.items() + {
"outs": attr.output_list(mandatory = True),
}.items()),
implementation = _asciidoc_impl,
)
def _genasciidoc_htmlonly(
name,
srcs = [],
attributes = [],
backend = None,
searchbox = True,
**kwargs):
SUFFIX = "." + name + "_macros"
new_srcs = []
outs = ["asciidoctor.css"]
for src in srcs:
new_src, html_name = _invoke_replace_macros(name, src, SUFFIX, searchbox)
new_srcs.append(new_src)
outs.append(html_name)
_asciidoc(
name = name + "_gen",
srcs = new_srcs,
suffix = SUFFIX,
backend = backend,
attributes = attributes,
outs = outs,
)
native.filegroup(
name = name,
data = outs,
**kwargs
)
def genasciidoc(
name,
srcs = [],
attributes = [],
backend = None,
searchbox = True,
resources = True,
**kwargs):
SUFFIX = "_htmlonly"
_genasciidoc_htmlonly(
name = name + SUFFIX if resources else name,
srcs = srcs,
attributes = attributes,
backend = backend,
searchbox = searchbox,
**kwargs
)
if resources:
htmlonly = ":" + name + SUFFIX
native.filegroup(
name = name,
srcs = [
htmlonly,
"//Documentation:resources",
],
**kwargs
)
def _asciidoc_html_zip_impl(ctx):
args = [
"--mktmp",
"-z",
ctx.outputs.out.path,
"--in-ext",
".txt" + ctx.attr.suffix,
"--out-ext",
".html",
]
args.extend(_generate_asciidoc_args(ctx))
ctx.actions.run(
inputs = ctx.files.srcs + [ctx.file.version],
outputs = [ctx.outputs.out],
tools = [ctx.executable._exe],
executable = ctx.executable._exe,
arguments = args,
progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
)
_asciidoc_html_zip = rule(
attrs = _asciidoc_attrs,
outputs = {
"out": "%{name}.zip",
},
implementation = _asciidoc_html_zip_impl,
)
def _genasciidoc_htmlonly_zip(
name,
srcs = [],
attributes = [],
backend = None,
searchbox = True,
**kwargs):
SUFFIX = "." + name + "_expn"
new_srcs = []
for src in srcs:
new_src, _ = _invoke_replace_macros(name, src, SUFFIX, searchbox)
new_srcs.append(new_src)
_asciidoc_html_zip(
name = name,
srcs = new_srcs,
suffix = SUFFIX,
backend = backend,
attributes = attributes,
)
def _asciidoc_zip_impl(ctx):
tmpdir = ctx.outputs.out.path + "_tmpdir"
cmd = [
"p=$PWD",
"rm -rf %s" % tmpdir,
"mkdir -p %s/%s/" % (tmpdir, ctx.attr.directory),
"unzip -q %s -d %s/%s/" % (ctx.file.src.path, tmpdir, ctx.attr.directory),
]
for r in ctx.files.resources:
if r.path == r.short_path:
cmd.append("tar -cf- %s | tar -C %s -xf-" % (r.short_path, tmpdir))
else:
parent = r.path[:-len(r.short_path)]
cmd.append(
"tar -C %s -cf- %s | tar -C %s -xf-" % (parent, r.short_path, tmpdir),
)
cmd.extend([
"cd %s" % tmpdir,
"zip -qr $p/%s *" % ctx.outputs.out.path,
])
ctx.actions.run_shell(
inputs = [ctx.file.src] + ctx.files.resources,
outputs = [ctx.outputs.out],
command = " && ".join(cmd),
progress_message =
"Generating asciidoctor zip file %s" % ctx.outputs.out.short_path,
)
_asciidoc_zip = rule(
attrs = {
"src": attr.label(
mandatory = True,
allow_single_file = [".zip"],
),
"resources": attr.label_list(
mandatory = True,
allow_files = True,
),
"directory": attr.string(mandatory = True),
},
outputs = {
"out": "%{name}.zip",
},
implementation = _asciidoc_zip_impl,
)
def genasciidoc_zip(
name,
srcs = [],
attributes = [],
directory = None,
backend = None,
searchbox = True,
resources = True,
**kwargs):
SUFFIX = "_htmlonly"
_genasciidoc_htmlonly_zip(
name = name + SUFFIX if resources else name,
srcs = srcs,
attributes = attributes,
backend = backend,
searchbox = searchbox,
**kwargs
)
if resources:
htmlonly = ":" + name + SUFFIX
_asciidoc_zip(
name = name,
src = htmlonly,
resources = ["//Documentation:resources"],
directory = directory,
)