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!
Comments