character_width_dots = { -- all characters are currently 1 to 6 dots wide "!',.:;i|", "`l", " \"()*I[]t{}", "<>fk", "AaBbCcDdEeFGgHhJjKLMmNnOoPpQqRrSsTUuVvWwXxYyZz1234567890#$£%^&_-+=\\?/", "@~", } character_spacing_width_dots = 1 default_character_width = 5 compatible = { max_dots_per_line: 114, max_lines_per_page: 14, max_characters_per_page: 798, } bedrock = { max_characters_per_book: 12800, max_pages_per_book: 50, } java = { max_characters_per_book: 79800, max_pages_per_book: 100, } copy = (...) -> output = {} for i = 1, select "#", ... for key, value in pairs select i, ... output[key] = value return output -- rebuild character_width_dots into a quicker/easier form character = {} character.default = default_character_width character["\n"] = -character_spacing_width_dots for i = 1, #character_width_dots line = character_width_dots[i] for j = 1, #line character[line\sub j, j] = i input = "" lines = {} for line in io.lines "input.txt" table.insert lines, line\gsub("\t", " ") input = table.concat lines, "\n" limits = copy compatible, bedrock -- lengths start at -1 to account for first extra dot lines = {} current_line_text = "" current_line_length = -character_spacing_width_dots next_line_text = "" next_line_length = -character_spacing_width_dots whitespace_encountered = false while #input > 0 current_character = input\sub 1, 1 current_character_dots = (character[current_character] or character.default) + character_spacing_width_dots if current_character == " " whitespace_encountered = true current_line_text ..= current_character current_line_length += current_character_dots input = input\sub 2 if current_character == "\n" -- table.insert lines, current_line_text\sub(1, #current_line_text - 1) .. "\\n" table.insert lines, current_line_text current_line_text = next_line_text current_line_length = next_line_length next_line_text = "" next_line_length = -character_spacing_width_dots whitespace_encountered = false continue if current_line_length > limits.max_dots_per_line while " " != current_line_text\sub #current_line_text current_character = current_line_text\sub #current_line_text current_character_dots = (character[current_character] or character.default) + character_spacing_width_dots next_line_text = current_character .. next_line_text next_line_length += current_character_dots current_line_text = current_line_text\sub 1, #current_line_text - 1 current_line_length -= current_character_dots unless whitespace_encountered -- print "Broke a huge line: #{current_line_text}" break table.insert lines, current_line_text current_line_text = next_line_text current_line_length = next_line_length next_line_text = "" next_line_length = -character_spacing_width_dots whitespace_encountered = false continue if #current_line_text > 0 table.insert lines, current_line_text page_number = 1 output = { string.rep("-", 40) .. " PAGE #{page_number}" } current_line = "" for i = 1, #lines line = lines[i] current_line ..= line if "\n" == line\sub #line table.insert output, current_line current_line = "" -- table.insert output, line if i % limits.max_lines_per_page == 0 table.insert output, current_line\sub(1, #current_line - 1) if i < #lines current_line = "" page_number += 1 table.insert output, string.rep("-", 40) .. " PAGE #{page_number}" if #current_line > 0 table.insert output, current_line -- for line in *output -- print line -- print table.concat output file = io.open "output.txt", "w" file\write table.concat output, "\n" file\close!