Advertisement
Guest User

Untitled

a guest
Apr 11th, 2024
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env node
  2. const stdin = process.stdin
  3. const stdout = process.stdout
  4.  
  5. let page
  6. let history = []
  7. let scroll = 0
  8.  
  9. stdin.setRawMode(true)
  10. stdout.write('\033[2J\033[H\033[?25l')
  11. stdin.resume()
  12. stdin.setEncoding( 'utf8' )
  13.  
  14. stdin.on( 'data',async function( key ){
  15.     switch(key){
  16.         case 'q':
  17.         case '\u0003':{
  18.             stdout.write('\033[?25h')
  19.             stdin.setRawMode(false)
  20.             process.exit();
  21.             break
  22.         }
  23.         case 'j':{
  24.             page.activeLink++
  25.             if(page.activeLink===page.links.length) page.activeLink--
  26.             render()
  27.             break
  28.         }
  29.         case 'k':{
  30.             page.activeLink--
  31.             if(page.activeLink===-1) page.activeLink = 0
  32.             render()
  33.             break          
  34.         }
  35.         case 'b':{
  36.             if(history.length){
  37.                 scroll = 0
  38.                 page = history.pop()
  39.                 render()
  40.             }
  41.             break
  42.         }
  43.         case 'h':{
  44.             scroll--
  45.             if(scroll<0)scroll=0
  46.             render()
  47.             break
  48.         }
  49.         case 'l':{
  50.             scroll++
  51.             if(scroll===page.markup.length)scroll--
  52.             render()
  53.             break
  54.         }
  55.         case "\r":{
  56.             scroll = 0
  57.             history.push(page)
  58.             await load(page.links[page.activeLink])
  59.             render()
  60.             break
  61.         }
  62.     }
  63. })
  64.  
  65. async function load(id){
  66.     let response = await fetch('https://pastebin.com/raw/'+id)
  67.     let text = await response.text()
  68.     let markup = []
  69.     let links = []
  70.  
  71.     for(let line of text.split('\r\n')){
  72.         if(line[0] === '#'){
  73.             markup.push(['header', line.substr(1)])
  74.         }else if(line[0] === '>'){
  75.             let words = line.substr(1).split(' ')
  76.             let address = words.shift()
  77.             links.push(address)
  78.             markup.push(['link', words.join(' '), address])
  79.         }else if(line[0] === ' '){
  80.             markup.push(['code',line])
  81.         }else{
  82.             markup.push(['text', line])
  83.         }
  84.     }
  85.     page = {markup,activeLink:0,links,id}
  86. }
  87.  
  88. function render(){
  89.     let rows = 0
  90.     stdout.write('\033[2J\033[H')
  91.     let linkscounter = 0
  92.     for(let element of page.markup.slice(scroll)){
  93.         let [type,text] = element
  94.         let height = Math.ceil(text.length/stdout.columns)
  95.         if(rows+height>stdout.rows) text = text.substr(0,(stdout.rows-rows)*stdout.columns)
  96.         rows += height
  97.         switch(type){
  98.             case 'header':{
  99.                 stdout.write('\033[1m'+text+'\033[0m\n')
  100.                 break
  101.             }
  102.             case 'link':{
  103.                 let style = linkscounter === page.activeLink ? '\033[30;42m' : '\033[32m'
  104.                 stdout.write(style+text+'\033[0m\n')               
  105.                
  106.                 linkscounter++
  107.                 break
  108.             }
  109.             case 'code':{
  110.                 stdout.write('\033[36m'+text+'\033[0m\n')                              
  111.                 break
  112.             }
  113.             default: console.log(text)
  114.         }
  115.         if(rows === stdout.rows) break
  116.     }
  117. }
  118.  
  119.  
  120.  
  121. load(process.argv[2]).then(_=>{
  122.     render()
  123.     setInterval(render,500)
  124. })
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement