Commit Briefs
refactor the parsing into the module
change the mscan format string to siplify the parsing, and refactor the parsing code into the module for reuse. pe is an exception in that it doesn't care about the format string, it just need to decide if the current line starts a new thread or not, that's why it doesn't use the newly introduced `parse'. The new format simplifies pe too though.
render only the threads list in the indexes, not the full threads
suggested by Stefan, thanks!
print a pagination before *and* after the listing
suggested by Stefan. to do this, rework the way index pages are done. Instead of generating the first half and then appending the navigation and the footer, generate only the body and change how fixfiles works to prepend the heading. this dance with temporary index files is needed because we don't know how many pages there are until we've consumed all the input.
use move from File::Copy instead of rename
i was reminded that rename doesn't work across filesystems. `move' from File::Copy attempts to use rename and falls back to a copy+unlink, which is the thing we need.