Advertisement
nitrogenfingers

paginate

Feb 9th, 2013
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Splits a string according to a pattern into a table              
  2. local function split(str, pattern)
  3.   local t = { }
  4.   local fpat = "(.-)" .. pattern
  5.   local last_end = 1
  6.   local s, e, cap = str:find(fpat, 1)
  7.   while s do
  8.     if s ~= 1 or cap ~= "" then
  9.       table.insert(t,cap)
  10.     end
  11.     last_end = e+1
  12.     s, e, cap = str:find(fpat, last_end)
  13.   end
  14.   if last_end <= #str then
  15.     cap = str:sub(last_end)
  16.     table.insert(t, cap)
  17.   end
  18.   return t
  19. end
  20.  
  21. --[[ Main code ]]--
  22.  
  23. textStore = { }
  24. --The number of characters on the present line, and the number of lines on the present page
  25. local charCount, lineCount = 0, 0
  26. --The maximum char and line count
  27. local charMax, lineMax = 25, 21
  28. --The command line arguments
  29. local tArgs = {...}
  30. --The wrapped peripheral
  31. local printer = nil
  32.  
  33. --We locate the printer first
  34. for k,v in pairs(rs.getSides()) do
  35.     if peripheral.getType(v) == "printer" then
  36.         printer = peripheral.wrap(v)
  37.     end
  38. end
  39. if not printer then
  40.     print("No printer attached!")
  41.     return
  42. end
  43.  
  44. --Catching missing arguments
  45. if #tArgs == 0 then
  46.     print("Usage: printpage <filename>")
  47.     return
  48. end
  49.  
  50. local filePath = shell.resolve(".").."/"..tArgs[1]
  51.  
  52. --Files use relative pathing, catching missing files
  53. if not fs.exists(filePath) then
  54.     print("File not found")
  55.     return
  56. end
  57. --Catches trying to print entire directories
  58. if fs.isDir(filePath) then
  59.     print("Cannot print directory")
  60.     return
  61. end
  62.  
  63. --We rip the file open and cut it up here
  64. local file = fs.open(filePath, "r")
  65. textStore = split(file.readAll(), "\n")
  66. file.close()
  67.  
  68. --Finishes the page, fires the new page down and keeps going
  69. function finishPage()
  70.     printer.endPage()
  71.     lineCount = 0
  72.     wordCount = 0
  73.    
  74.     rs.setOutput("bottom", true)
  75.     sleep(0.1)
  76.     rs.setOutput("bottom", false)
  77.     sleep(1)
  78.    
  79.     printer.newPage()
  80.     charMax, lineMax = printer.getPageSize()
  81. end
  82.  
  83. --This will print the word with a basic write command but updates
  84. --the char and line fields, and starts a new page if it needs to
  85. function safePrint(word)
  86.     printer.write(word)
  87.     charCount = charCount + #word
  88.     if charCount >= charMax then
  89.         nextLine()
  90.     end
  91. end
  92.  
  93. --Moves to the next line, or the next page if need be
  94. function nextLine()
  95.     charCount = 0
  96.     lineCount = lineCount + 1
  97.     if lineCount >= lineMax then
  98.         finishPage()
  99.     else
  100.         local _,oy = printer.getCursorPos()
  101.         printer.setCursorPos(1,oy + 1)
  102.     end
  103. end
  104.  
  105. --The pagination script.
  106.  
  107. printer.newPage()
  108.  
  109. charMax, lineMax = printer.getPageSize()
  110. for i=1,#textStore do
  111.     local word = textStore[i]
  112.     --We replace tab characters with spaces, for convenience
  113.     string.gsub(word, "\t", " ")
  114.     --We split by space for each subword
  115.     local subwords = split(word, " ")
  116.     for j=1,#subwords do
  117.         local subword = subwords[j]
  118.        
  119.         --If the word goes over the line, we just print as much of it as we can
  120.         --until it's short enough to fit on one line
  121.         while #subword > charMax do
  122.             safePrint(subword)
  123.             subword = string.sub(subword, charMax - charCount + 1)
  124.         end
  125.    
  126.         --If the word is blocked by other stuff on the line, we just go to the next line
  127.         if #subword + charCount > charMax then
  128.             nextLine()
  129.         end
  130.    
  131.         --We then print our word (or what's left of it)
  132.         safePrint(subword)
  133.        
  134.         --Finally, if there's room a space character is added
  135.         if charCount < charMax then
  136.             safePrint(" ")
  137.         end
  138.     end
  139.     nextLine()
  140. end
  141.  
  142. printer.endPage()
  143. rs.setOutput("bottom", true)
  144. sleep(0.1)
  145. rs.setOutput("bottom", false)
  146. sleep(1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement