TangentFox

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

Jul 1st, 2023 (edited)
1,344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.81 KB | None | 0 0
  1. character_width_dots = { -- all characters are currently 1 to 6 dots wide
  2.   "!',.:;i|",
  3.   "`l",
  4.   " \"()*I[]t{}",
  5.   "<>fk",
  6.   "AaBbCcDdEeFGgHhJjKLMmNnOoPpQqRrSsTUuVvWwXxYyZz1234567890#$£%^&_-+=\\?/",
  7.   "@~",
  8. }
  9. character_spacing_width_dots = 1
  10. default_character_width = 5
  11.  
  12. compatible = {
  13.   max_dots_per_line: 114,
  14.   max_lines_per_page: 14,
  15.   max_characters_per_page: 798,
  16. }
  17. bedrock = {
  18.   max_characters_per_book: 12800,
  19.   max_pages_per_book: 50,
  20. }
  21. java = {
  22.   max_characters_per_book: 79800,
  23.   max_pages_per_book: 100,
  24. }
  25.  
  26.  
  27.  
  28. copy = (...) ->
  29.   output = {}
  30.   for i = 1, select "#", ...
  31.     for key, value in pairs select i, ...
  32.       output[key] = value
  33.   return output
  34.  
  35. -- rebuild character_width_dots into a quicker/easier form
  36. character = {}
  37. character.default = default_character_width
  38. character["\n"] = -character_spacing_width_dots
  39. for i = 1, #character_width_dots
  40.   line = character_width_dots[i]
  41.   for j = 1, #line
  42.     character[line\sub j, j] = i
  43.  
  44.  
  45.  
  46. input = ""
  47. lines = {}
  48. for line in io.lines "input.txt"
  49.   table.insert lines, line\gsub("\t", "   ")
  50. input = table.concat lines, "\n"
  51.  
  52.  
  53.  
  54. limits = copy compatible, bedrock
  55.  
  56. -- lengths start at -1 to account for first extra dot
  57. lines = {}
  58. current_line_text = ""
  59. current_line_length = -character_spacing_width_dots
  60. next_line_text = ""
  61. next_line_length = -character_spacing_width_dots
  62. whitespace_encountered = false
  63.  
  64. while #input > 0
  65.   current_character = input\sub 1, 1
  66.   current_character_dots = (character[current_character] or character.default) + character_spacing_width_dots
  67.   if current_character == " "
  68.     whitespace_encountered = true
  69.  
  70.   current_line_text ..= current_character
  71.   current_line_length += current_character_dots
  72.   input = input\sub 2
  73.  
  74.   if current_character == "\n"
  75.     -- table.insert lines, current_line_text\sub(1, #current_line_text - 1) .. "\\n"
  76.     table.insert lines, current_line_text
  77.     current_line_text = next_line_text
  78.     current_line_length = next_line_length
  79.     next_line_text = ""
  80.     next_line_length = -character_spacing_width_dots
  81.  
  82.     whitespace_encountered = false
  83.     continue
  84.  
  85.   if current_line_length > limits.max_dots_per_line
  86.     while " " != current_line_text\sub #current_line_text
  87.       current_character = current_line_text\sub #current_line_text
  88.       current_character_dots = (character[current_character] or character.default) + character_spacing_width_dots
  89.  
  90.       next_line_text = current_character .. next_line_text
  91.       next_line_length += current_character_dots
  92.       current_line_text = current_line_text\sub 1, #current_line_text - 1
  93.       current_line_length -= current_character_dots
  94.  
  95.       unless whitespace_encountered
  96.         -- print "Broke a huge line: #{current_line_text}"
  97.         break
  98.  
  99.     table.insert lines, current_line_text
  100.     current_line_text = next_line_text
  101.     current_line_length = next_line_length
  102.     next_line_text = ""
  103.     next_line_length = -character_spacing_width_dots
  104.  
  105.     whitespace_encountered = false
  106.     continue
  107.  
  108. if #current_line_text > 0
  109.   table.insert lines, current_line_text
  110.  
  111.  
  112.  
  113. page_number = 1
  114. output = {
  115.   string.rep("-", 40) .. " PAGE #{page_number}"
  116. }
  117. current_line = ""
  118. for i = 1, #lines
  119.   line = lines[i]
  120.   current_line ..= line
  121.   if "\n" == line\sub #line
  122.     table.insert output, current_line
  123.     current_line = ""
  124.   -- table.insert output, line
  125.   if i % limits.max_lines_per_page == 0
  126.     table.insert output, current_line\sub(1, #current_line - 1)
  127.     if i < #lines
  128.       current_line = ""
  129.       page_number += 1
  130.       table.insert output, string.rep("-", 40) .. " PAGE #{page_number}"
  131.  
  132. if #current_line > 0
  133.   table.insert output, current_line
  134.  
  135. -- for line in *output
  136. --   print line
  137. -- print table.concat output
  138. file = io.open "output.txt", "w"
  139. file\write table.concat output, "\n"
  140. file\close!
  141.  
Advertisement
Add Comment
Please, Sign In to add comment