This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub AlexanderNekrasov/Youthful-Passion-Fruit-teambook
#!/usr/bin/env python2
# encoding: utf-8
# Source code preprocessor for KACTL build process. Compatible with both Python 2 and 3;
# currently 2 is used because it has better startup overhead (5% faster builds).
# License: CC0
from __future__ import print_function
import sys
import getopt
import subprocess
def escape(input):
input = input.replace('<', r'\ensuremath{<}')
input = input.replace('>', r'\ensuremath{>}')
return input
def pathescape(input):
input = input.replace('\\', r'\\')
input = input.replace('_', r'\_')
input = escape(input)
return input
def codeescape(input):
input = input.replace('_', r'\_')
input = input.replace('\n', '\\\\\n')
input = input.replace('{', r'\{')
input = input.replace('}', r'\}')
input = input.replace('^', r'\ensuremath{\hat{\;}}')
input = escape(input)
return input
def ordoescape(input, esc=True):
if esc:
input = escape(input)
start = input.find("O(")
if start >= 0:
bracketcount = 1
end = start+1
while end+1<len(input) and bracketcount>0:
end = end + 1
if input[end] == '(':
bracketcount = bracketcount + 1
elif input[end] == ')':
bracketcount = bracketcount - 1
if bracketcount == 0:
return r"%s\bigo{%s}%s" % (input[:start], input[start+2:end], ordoescape(input[end+1:], False))
return input
def addref(caption, outstream):
caption = pathescape(caption).strip()
print(r"\kactlref{%s}" % caption, file=outstream)
with open('header.tmp', 'a') as f:
f.write(caption + "\n")
COMMENT_TYPES = [
('/**', '*/'),
("'''", "'''"),
('"""', '"""'),
]
def find_start_comment(source, start=None):
first = (-1, -1, None)
for s, e in COMMENT_TYPES:
i = source.find(s, start)
if i != -1 and (i < first[0] or first[0] == -1):
first = (i, i + len(s), e)
return first
def processwithcomments(caption, instream, outstream, listingslang):
knowncommands = ['Author', 'Date', 'Description', 'Source', 'Time', 'Memory', 'License', 'Status', 'Usage', 'Details']
requiredcommands = ['Author', 'Description']
includelist = []
error = ""
warning = ""
# Read lines from source file
try:
lines = instream.readlines()
except:
error = "Could not read source."
nlines = list()
for line in lines:
if 'exclude-line' in line:
continue
if 'include-line' in line:
line = line.replace('// ', '', 1)
had_comment = "///" in line
keep_include = 'keep-include' in line
# Remove /// comments
line = line.split("///")[0].rstrip()
# Remove '#pragma once' lines
if line == "#pragma once":
continue
if had_comment and not line:
continue
# Check includes
include = parse_include(line)
if include is not None and not keep_include:
includelist.append(include)
continue
nlines.append(line)
# Remove and process multiline comments
source = '\n'.join(nlines)
nsource = ''
start, start2, end_str = find_start_comment(source)
end = 0
commands = {}
while start >= 0 and not error:
nsource = nsource.rstrip() + source[end:start]
end = source.find(end_str, start2)
if end<start:
error = "Invalid %s %s comments." % (source[start:start2], end_str)
break
comment = source[start2:end].strip()
end += len(end_str)
start, start2, end_str = find_start_comment(source, end)
commentlines = comment.split('\n')
command = None
value = ""
for cline in commentlines:
allow_command = False
cline = cline.strip()
if cline.startswith('*'):
cline = cline[1:].strip()
allow_command = True
ind = cline.find(':')
if allow_command and ind != -1 and ' ' not in cline[:ind] and cline[0].isalpha() and cline[0].isupper():
if command:
if command not in knowncommands:
error = error + "Unknown command: " + command + ". "
commands[command] = value.lstrip()
command = cline[:ind]
value = cline[ind+1:].strip()
else:
value = value + '\n' + cline
if command:
if command not in knowncommands:
error = error + "Unknown command: " + command + ". "
commands[command] = value.lstrip()
for rcommand in sorted(set(requiredcommands) - set(commands)):
error = error + "Missing command: " + rcommand + ". "
if end>=0:
nsource = nsource.rstrip() + source[end:]
nsource = nsource.strip()
if listingslang in ['C++', 'Java']:
hash_script = 'hash'
p = subprocess.Popen(['sh', 'content/contest/%s.sh' % hash_script], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
hsh, _ = p.communicate(nsource)
hsh = hsh.split(None, 1)[0]
hsh = hsh + ', '
else:
hsh = ''
# Produce output
out = []
if warning:
out.append(r"\kactlwarning{%s: %s}" % (caption, warning))
if error:
out.append(r"\kactlerror{%s: %s}" % (caption, error))
else:
addref(caption, outstream)
if commands.get("Description"):
out.append(r"\defdescription{%s}" % escape(commands["Description"]))
if commands.get("Usage"):
out.append(r"\defusage{%s}" % codeescape(commands["Usage"]))
if commands.get("Time"):
out.append(r"\deftime{%s}" % ordoescape(commands["Time"]))
if commands.get("Memory"):
out.append(r"\defmemory{%s}" % ordoescape(commands["Memory"]))
if includelist:
out.append(r"\leftcaption{%s}" % pathescape(", ".join(includelist)))
if nsource:
out.append(r"\rightcaption{%s%d lines}" % (hsh, len(nsource.split("\n"))))
langstr = ", language="+listingslang
out.append(r"\begin{lstlisting}[caption={%s}%s]" % (pathescape(caption), langstr))
out.append(nsource)
out.append(r"\end{lstlisting}")
for line in out:
print(line, file=outstream)
def processraw(caption, instream, outstream, listingslang = 'raw'):
try:
source = instream.read().strip()
addref(caption, outstream)
print(r"\rightcaption{%d lines}" % len(source.split("\n")), file=outstream)
print(r"\begin{lstlisting}[language=%s,caption={%s}]" % (listingslang, pathescape(caption)), file=outstream)
print(source, file=outstream)
print(r"\end{lstlisting}", file=outstream)
except:
print("\kactlerror{Could not read source.}", file=outstream)
def parse_include(line):
line = line.strip()
if line.startswith("#include"):
return line[8:].strip()
return None
def getlang(input):
return input.rsplit('.',1)[-1]
def getfilename(input):
return input.rsplit('/',1)[-1]
def print_header(data, outstream):
parts = data.split('|')
until = parts[0].strip() or parts[1].strip()
if not until:
# Nothing on this page, skip it.
return
with open('header.tmp') as f:
lines = [x.strip() for x in f.readlines()]
if until not in lines:
# Nothing new on the page.
return
ind = lines.index(until) + 1
header_length = len("".join(lines[:ind]))
def adjust(name):
return name if name.startswith('.') else name.split('.')[0]
output = r"\enspace{}".join(map(adjust, lines[:ind]))
font_size = 10
if header_length > 150:
font_size = 8
output = r"\hspace{3mm}\textbf{" + output + "}"
output = "\\fontsize{%d}{%d}" % (font_size, font_size) + output
print(output, file=outstream)
with open('header.tmp', 'w') as f:
for line in lines[ind:]:
f.write(line + "\n")
def main():
language = None
caption = None
instream = sys.stdin
outstream = sys.stdout
print_header_value = None
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:i:l:c:", ["help", "output=", "input=", "language=", "caption=", "print-header="])
for option, value in opts:
if option in ("-h", "--help"):
print("This is the help section for this program")
print()
print("Available commands are:")
print("\t -o --output")
print("\t -h --help")
print("\t -i --input")
print("\t -l --language")
print("\t --print-header")
return
if option in ("-o", "--output"):
outstream = open(value, "w")
if option in ("-i", "--input"):
instream = open(value)
if language == None:
language = getlang(value)
if caption == None:
caption = getfilename(value)
if option in ("-l", "--language"):
language = value
if option in ("-c", "--caption"):
caption = value
if option == "--print-header":
print_header_value = value
if print_header_value is not None:
print_header(print_header_value, outstream)
return
print(" * \x1b[1m{}\x1b[0m".format(caption))
if language in ["cpp", "cc", "c", "h", "hpp"]:
processwithcomments(caption, instream, outstream, 'C++')
elif language in ["java", "kt"]:
processwithcomments(caption, instream, outstream, 'Java')
elif language == "ps":
processraw(caption, instream, outstream) # PostScript was added in listings v1.4
elif language == "raw":
processraw(caption, instream, outstream)
elif language == "rawcpp":
processraw(caption, instream, outstream, 'C++')
elif language == "sh":
processraw(caption, instream, outstream, 'bash')
elif language == "py":
processwithcomments(caption, instream, outstream, 'Python')
elif language == "rawpy":
processraw(caption, instream, outstream, 'Python')
else:
raise ValueError("Unkown language: " + str(language))
except (ValueError, getopt.GetoptError, IOError) as err:
print(str(err), file=sys.stderr)
print("\t for help use --help", file=sys.stderr)
return 2
if __name__ == "__main__":
exit(main())
Traceback (most recent call last):
File "/home/alex/.local/lib/python3.11/site-packages/onlinejudge_verify/documentation/build.py", line 71, in _render_source_code_stat
bundled_code = language.bundle(stat.path, basedir=basedir, options={'include_paths': [basedir]}).decode()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/alex/.local/lib/python3.11/site-packages/onlinejudge_verify/languages/python.py", line 96, in bundle
raise NotImplementedError
NotImplementedError