UNPKG

fidoedit

Version:

FidoEdit: FGHI-compatible Fidonet editor.

79 lines (66 loc) 2.59 kB
/*global $, emojify: true, nw, autosize, twemoji */ var fs = nw.require('fs'); var os = nw.require('os'); var async = nw.require('async'); var escapeHTML = nw.require('lodash.escape'); var fiunis = nw.require('fiunis'); var iconv = nw.require('iconv-lite'); /* var; TODO: use it */ emojify = () => { if( twemoji ) twemoji.parse( $('body')[0] ); }; var errorCLI = errHTML => $('.purposeMain').html([ '<div class="alert alert-danger" role="alert">', errHTML, '</div>' ].join('')); var convertFileToText = (filePath, fileDone) => async.waterfall([ callback => fs.readFile(filePath, callback), (fileBuf, callback) => callback(null, fiunis.decode( iconv.decode(fileBuf, 'cp866') ) ) ], fileDone); var convertTextareaToFile = ($textarea, filePath, fileDone) => fs.writeFile( filePath, fiunis.encode( $textarea.val().replace(/\n/g, os.EOL), 'cp866' ), fileDone ); var textareaGoToLine = ($textarea, lineNum) => { var prevCharCount = $textarea.val().split( /(\n)/ ).reduce( (prevCnt, nextItem, idx) => ( idx < (lineNum - 1 ) * 2 ) ? prevCnt + nextItem.length : prevCnt, 0 ); $textarea.focus()[0].setSelectionRange(prevCharCount, prevCharCount); }; $(() => { var paramsCLI = nw.App.argv; var msgFilePath = paramsCLI.find( param => param.startsWith('--file=') ); if( typeof msgFilePath === 'undefined') return errorCLI( 'Filename has not been given.' ); msgFilePath = msgFilePath.slice( '--file='.length ); var lineNum = paramsCLI.find( param => param.startsWith('--line=') ); if( typeof lineNum === 'undefined') return errorCLI( 'Line number has not been given.' ); lineNum = lineNum.slice( '--line='.length ); if( ! /^\d+$/.test(''+lineNum) || lineNum < 1 ) lineNum = 1; convertFileToText(msgFilePath, (err, fileText) => { if( err ) return errorCLI( `Error reading «${ escapeHTML(msgFilePath) }».` ); nw.Window.get().maximize(); $('.purposeMain').html(`<textarea>${fileText}</textarea>`); autosize($('.purposeMain textarea')); textareaGoToLine( $('.purposeMain textarea'), lineNum ); nw.Window.get().on('close', function(){ var thisWin = this; thisWin.hide(); // imitate closing, prevent futher `close` events convertTextareaToFile( $('.purposeMain textarea'), msgFilePath, ( /* err */ ) => thisWin.close(true) // ignore `err`, force close ); }); }); });