Interactive Display of slides

1

Interactive Display of slides

2
@Add(global elements)
bool interactive = false;
@End(global elements)
3
@Add(global elements)
std::map<std::string, Input>::iterator curInput;
std::vector<Block>::iterator curBlock;
@End(global elements)
4
@Add(global elements)
bool write_files = true;
@End(global elements)
5
@Add(global elements)
bool process_files = true;
@End(global elements)
6
@Add(global elements)
bool html_files = true;
@End(global elements)
7
@Add(process argument)
if (arg == "-i" || arg == "--interactive") {
interactive = true;
write_files = false;
process_files = false;
html_files = false;
continue;
}
@End(process argument)
8
@Add(main body)
if (interactive) {
@Put(interactive);
}
@End(main body)
9
@Def(interactive)
curInput = inputs.begin();
std::cerr << "curInput == " << curInput->first << "; is end == " <<
(curInput == inputs.end()) << "\n";
curBlock = curInput->second.blocks.begin();
std::cerr << "curBlock == " << &*curBlock << "; is end == " <<
(curBlock == curInput->second.blocks.end()) << "\n";
@End(interactive)
10
@Add(global elements)
void draw_block() {
@put(draw block);
}
@End(global elements)
11
@Add(interactive)
draw_block();
for (;;) {
@Put(run loop);
}
@End(interactive)
12
@Add(global elements)
void draw_position() {
@put(draw position);
}
@End(global elements)
13
@Add(global elements)
void trim(std::string &s) {
while (! s.empty() && (s[0] & 0xff) <= ' ') {
s.erase(0, 1);
}
}
@End(global elements)
14
@Def(run loop)
std::string cmd;
draw_position();
std::cout << "> ";
std::getline(std::cin, cmd);
trim(cmd);
if (cmd.empty()) { continue; }
@Put(do range);
@End(run loop)
15
@Add(run loop)
if (cmd == "q" || cmd == "quit") {
break;
}
@End(run loop)
16
@Add(run loop)
if (cmd == "n" || cmd == "next") {
@put(do next cmd);
draw_block();
continue;
}
@End(run loop)
17
@def(do next cmd)
int next = (curBlock - curInput->second.blocks.begin()) + 1;
while (next >= static_cast<int>(curInput->second.blocks.size())) {
--next;
}
@Mul(do block range);
curBlock = curInput->second.blocks.begin() + next;
@end(do next cmd)
18
@Add(run loop)
if (cmd == "p" || cmd == "prev") {
@put(do prev cmd);
draw_block();
continue;
}
@End(run loop)
19
@def(do prev cmd)
int next =curBlock - curInput->second.blocks.begin();
if (next > 0) {
--next;
}
@Mul(do block range);
curBlock = curInput->second.blocks.begin() + next;
@end(do prev cmd)
20
@def(draw block)
if (curBlock->state == RS::header) {
@put(draw header);
}
@end(draw block)
21
@def(draw header)
int i = 0;
for (const auto &l : curBlock->value) {
std::cout << ++i << ": ";
@put(draw header level);
std::cout << ' ' << l << "\n\n";
}
@end(draw header)
22
@def(draw header level)
for (int i = 0; i < curBlock->level; ++i) {
std::cout << '#';
}
@end(draw header level)
23
@add(draw block)
if (curBlock->state == RS::code) {
@put(draw code);
}
@end(draw block)
24
@def(draw code)
std::cout << "```\n";
int i = 0;
for (const auto &l : curBlock->value) {
std::cout << ++i << ": " << l << '\n';
}
std::cout << "```\n\n";
@end(draw code)
25
@add(draw block)
if (curBlock->state == RS::para) {
@put(draw para);
}
@end(draw block)
26
@def(draw para)
int i = 0;
for (const auto &l : curBlock->value) {
std::cout << ++i << ": " << l << "\n\n";
}
@end(draw para)
27
@add(draw block)
int j = 0;
for (const auto &l : curBlock->notes) {
std::cout << ++j << ": * " << l << '\n';
}
std::cout << '\n';
@end(draw block)
28
@def(draw position)
auto &bs { curInput->second.blocks };
std::cout << curInput->first << ':';
int idx = (curBlock - bs.begin()) + 1;
std::cout << idx;
if (idx == static_cast<int>(bs.size())) {
std::cout << " = $";
}
@end(draw position)
29
@Add(run loop)
if (cmd == "f" || cmd == "forward") {
@put(do forward cmd);
draw_block();
continue;
}
@End(run loop)
30
@def(do forward cmd)
int next = 1;
for (const auto &xx : inputs) {
if (xx.first == curInput->first) { break; }
++next;
}
while (next >= static_cast<int>(inputs.size())) {
--next;
}
@Mul(do inputs range);
curInput = inputs.begin();
for (; next > 0 && curInput != inputs.end(); --next) {
++curInput;
}
curBlock = curInput->second.blocks.begin();
@end(do forward cmd)
31
@Add(run loop)
if (cmd == "b" || cmd == "backward") {
@put(do backward cmd);
draw_block();
continue;
}
@End(run loop)
32
@def(do backward cmd)
int next = 0;
for (const auto &xx : inputs) {
if (xx.first == curInput->first) { break; }
++next;
}
if (next) {
--next;
}
@Mul(do inputs range);
curInput = inputs.begin();
for (; next > 0 && curInput != inputs.end(); --next) {
++curInput;
}
curBlock = curInput->second.blocks.begin();
@end(do backward cmd)