Files
dev/script/__Lib/diffcalc-snapshot/diffcmd/make_manual.py
2019-03-20 13:52:00 +01:00

146 lines
4.0 KiB
Python

from StringIO import StringIO
from IPython import get_ipython
import sys
from diffcalc.dc.help import format_commands_for_rst_table
TEST_INPUT="""
Diffcalc's Scannables
=====================
Please see :ref:`moving-in-hkl-space` and :ref:`scanning-in-hkl-space` for some relevant examples.
To list and show the current positions of your beamline's scannables
use ``pos`` with no arguments::
>>> pos wl
should do nought, but this should be replaced::
==> pos wl 2
should do the thing
==> abcd
"""
def echorun(magic_cmd):
print "\n>>> " + str(magic_cmd)
def make_manual(input_file_path,
output_file_path,
ub_commands_for_help,
hkl_commands_for_help):
# Read input file (should be .rst file)
with open(input_file_path, 'r') as f:
input_string = f.read()
# Parse input string
output_lines = []
for lineno, line in enumerate(input_string.split('\n')):
process = '==>' in line
if process and 'STOP' in line:
print "'==> STOP' found on line. STOPPING", lineno + 1
return
elif process and 'UB_HELP_TABLE' in line:
print 'Creating UB help table'
output_lines_from_line = format_commands_for_rst_table(
'', ub_commands_for_help)
elif process and 'HKL_HELP_TABLE' in line:
print 'Creating HKL help table'
output_lines_from_line = format_commands_for_rst_table(
'', hkl_commands_for_help)
else:
output_lines_from_line = parse_line(
line, lineno + 1, input_file_path)
# print '\n'.join(output_lines_from_line)
output_lines.extend(output_lines_from_line)
# Write output file
if output_file_path:
with open(output_file_path, 'w') as f:
f.write('\n'.join(output_lines))
print "Wrote file:", output_file_path
# try:
# if output_file_path:
# orig_stdout = sys.stdout
# f = file(output_file_path, 'w')
# sys.stdout = f
#
#
#
# finally:
# if output_file_path:
# sys.stdout = orig_stdout
# f.close()
def parse_line(linein, lineno, filepath):
output_lines = []
if '==>' in linein:
pre, cmd = linein.split('==>')
_check_spaces_only(pre, lineno, filepath)
cmd = cmd.strip() # strip whitespace
output_lines.append(pre + ">>> " + cmd)
result_lines = _capture_magic_command_output(cmd, lineno, filepath)
# append to output
for line in result_lines:
output_lines.append(pre + line)
else:
output_lines.append(linein)
return output_lines
def _check_spaces_only(s, lineno, filepath):
for c in s:
if c != ' ':
raise Exception('Error on line %i of %s :\n text proceeding --> must be '
'spaces only' % (lineno, filepath))
def _capture_magic_command_output(magic_cmd, lineno, filepath):
orig_stdout = sys.stdout
result = StringIO()
sys.stdout = result
def log_error():
msg = "Error on line %i of %s evaluating '%s'" % (lineno, filepath, magic_cmd)
sys.stderr.write('\n' + '=' * 79 + '\n' + msg + '\n' +'v' * 79 + '\n')
return msg
try:
line_magics = get_ipython().magics_manager.magics['line']
magic = magic_cmd.split(' ')[0]
if magic not in line_magics:
msg = log_error()
raise Exception(msg + " ('%s' is not a magic command)" % magic)
get_ipython().magic(magic_cmd)
except:
log_error()
raise
finally:
sys.stdout = orig_stdout
result_lines = result.getvalue().split('\n')
# trim trailing lines which are whitespace only
while result_lines and (result_lines[-1].isspace() or not result_lines[-1]):
result_lines.pop()
return result_lines