TangentFox icon

Minecraft book text formatter (will be moved to github.com/TangentFoxy later)

TangentFox | PRO | 07/02/23 02:47:38 AM UTC (Edited) | 0 ⭐ | 1567 👁️ | Never ⏰ | []
Lua |

3.81 KB

|

None

|

0 👍

/

0 👎

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