Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env node
- const stdin = process.stdin
- const stdout = process.stdout
- let page
- let history = []
- let scroll = 0
- stdin.setRawMode(true)
- stdout.write('\033[2J\033[H\033[?25l')
- stdin.resume()
- stdin.setEncoding( 'utf8' )
- stdin.on( 'data',async function( key ){
- switch(key){
- case 'q':
- case '\u0003':{
- stdout.write('\033[?25h')
- stdin.setRawMode(false)
- process.exit();
- break
- }
- case 'j':{
- page.activeLink++
- if(page.activeLink===page.links.length) page.activeLink--
- render()
- break
- }
- case 'k':{
- page.activeLink--
- if(page.activeLink===-1) page.activeLink = 0
- render()
- break
- }
- case 'b':{
- if(history.length){
- scroll = 0
- page = history.pop()
- render()
- }
- break
- }
- case 'h':{
- scroll--
- if(scroll<0)scroll=0
- render()
- break
- }
- case 'l':{
- scroll++
- if(scroll===page.markup.length)scroll--
- render()
- break
- }
- case "\r":{
- scroll = 0
- history.push(page)
- await load(page.links[page.activeLink])
- render()
- break
- }
- }
- })
- async function load(id){
- let response = await fetch('https://pastebin.com/raw/'+id)
- let text = await response.text()
- let markup = []
- let links = []
- for(let line of text.split('\r\n')){
- if(line[0] === '#'){
- markup.push(['header', line.substr(1)])
- }else if(line[0] === '>'){
- let words = line.substr(1).split(' ')
- let address = words.shift()
- links.push(address)
- markup.push(['link', words.join(' '), address])
- }else if(line[0] === ' '){
- markup.push(['code',line])
- }else{
- markup.push(['text', line])
- }
- }
- page = {markup,activeLink:0,links,id}
- }
- function render(){
- let rows = 0
- stdout.write('\033[2J\033[H')
- let linkscounter = 0
- for(let element of page.markup.slice(scroll)){
- let [type,text] = element
- let height = Math.ceil(text.length/stdout.columns)
- if(rows+height>stdout.rows) text = text.substr(0,(stdout.rows-rows)*stdout.columns)
- rows += height
- switch(type){
- case 'header':{
- stdout.write('\033[1m'+text+'\033[0m\n')
- break
- }
- case 'link':{
- let style = linkscounter === page.activeLink ? '\033[30;42m' : '\033[32m'
- stdout.write(style+text+'\033[0m\n')
- linkscounter++
- break
- }
- case 'code':{
- stdout.write('\033[36m'+text+'\033[0m\n')
- break
- }
- default: console.log(text)
- }
- if(rows === stdout.rows) break
- }
- }
- load(process.argv[2]).then(_=>{
- render()
- setInterval(render,500)
- })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement