First commit
This commit is contained in:
commit
8fb8415e0a
2 changed files with 135 additions and 0 deletions
122
app.js
Normal file
122
app.js
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
var net = require( 'net' );
|
||||||
|
var fs = require( 'fs' );
|
||||||
|
var path = require( 'path' );
|
||||||
|
var os = require( 'os' );
|
||||||
|
|
||||||
|
var config = require( './configuration.json' );
|
||||||
|
|
||||||
|
var TAB = "\t";
|
||||||
|
var EOF = ".\r\n";
|
||||||
|
var NL = "\r\n";
|
||||||
|
|
||||||
|
if ( config.jsonPath[0] === "~" ) {
|
||||||
|
config.jsonPath = path.join( os.homedir(), config.jsonPath.slice( 1 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
var hugoJson = null;
|
||||||
|
|
||||||
|
loadJson();
|
||||||
|
|
||||||
|
function loadJson() {
|
||||||
|
fs.readFile( config.jsonPath, 'utf8', function( err, data ) {
|
||||||
|
if ( err ) {
|
||||||
|
console.log( err );
|
||||||
|
} else {
|
||||||
|
hugoJson = JSON.parse( data );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
function processQuery( query, sock ) {
|
||||||
|
if ( query.length == 0 ) {
|
||||||
|
writeInfo( sock, '------------------------------------------------------------------------' );
|
||||||
|
writeInfo( sock, config.siteName );
|
||||||
|
|
||||||
|
config.siteDescription.split( NL ).forEach( function( line ) {
|
||||||
|
writeInfo( sock, line );
|
||||||
|
} );
|
||||||
|
|
||||||
|
writeInfo( sock, '------------------------------------------------------------------------' );
|
||||||
|
writeInfo( sock, '' );
|
||||||
|
|
||||||
|
hugoJson.forEach( function( blog ) {
|
||||||
|
writeFile( sock, '0', blog[ config.titleAttr ].charAt( 0 ).toUpperCase() + blog[ config.titleAttr ].slice( 1 ), blog[ config.urlAttr ] );
|
||||||
|
} );
|
||||||
|
|
||||||
|
sock.end();
|
||||||
|
} else {
|
||||||
|
|
||||||
|
sock.write( query + NL );
|
||||||
|
|
||||||
|
var hasBlog = false;
|
||||||
|
|
||||||
|
hugoJson.forEach( function( blog ) {
|
||||||
|
if ( blog[ config.urlAttr ].trim().toLowerCase() == query.trim().toLowerCase() ) {
|
||||||
|
blog[ config.bodyAttr ].split( ".\n" ).forEach( function( line ) {
|
||||||
|
sock.write( line + "." + NL + NL );
|
||||||
|
} );
|
||||||
|
|
||||||
|
sock.end();
|
||||||
|
hasBlog = true;
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
if ( hasBlog === false ) {
|
||||||
|
sock.write( "No such file" );
|
||||||
|
sock.end();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeFile( sock, type, title, path ) {
|
||||||
|
sock.write( type + title + TAB + path + TAB + config.gopherDomain + TAB + config.gopherPort + NL );
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeInfo( sock, text ) {
|
||||||
|
sock.write( 'i' + text + TAB + TAB + TAB + NL );
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeError( sock, text ) {
|
||||||
|
sock.end( '3' + text + EOF );
|
||||||
|
}
|
||||||
|
|
||||||
|
var server = net.createServer( function( sock ) {
|
||||||
|
var query = "";
|
||||||
|
|
||||||
|
console.log( 'Connection from', sock.remoteAddress, sock.remotePort );
|
||||||
|
|
||||||
|
sock.on( 'data', function( buf ) {
|
||||||
|
var ready = false;
|
||||||
|
|
||||||
|
for ( var i = 0; i < buf.length; i++ ) {
|
||||||
|
var bChar = buf.readUInt8( i );
|
||||||
|
switch (bChar) {
|
||||||
|
case 0x0:
|
||||||
|
ready = false;
|
||||||
|
break;
|
||||||
|
case 0xD:
|
||||||
|
ready = true;
|
||||||
|
break;
|
||||||
|
case 0xA:
|
||||||
|
if ( ready === true) {
|
||||||
|
processQuery( query, sock );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ready = false;
|
||||||
|
query += String.fromCharCode( bChar );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
server.listen( {
|
||||||
|
"host": config.gopherInterface,
|
||||||
|
"port": config.gopherPort,
|
||||||
|
"exclusive": true
|
||||||
|
}, function() {
|
||||||
|
console.log( 'hugo-gopher ready' );
|
||||||
|
console.log( config.gopherDomain + ' at gopher://' + config.gopherInterface + ":" + config.gopherPort );
|
||||||
|
console.log( 'JSON: ' + config.jsonPath );
|
||||||
|
});
|
13
configuration.json
Normal file
13
configuration.json
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
"jsonPath": "~/source/ginnegappen/ginnegappen/public/index.json",
|
||||||
|
"siteName": "Ginnegappen.nl",
|
||||||
|
"siteDescription": "\r\nAls je het niet te serieus neemt, dan valt er misschien nog wat te leren op dit blog.\r\nWe schrijven over van alles en nog wat, zo lang er maar wat over valt te ginnegappen.\r\nVan opinie tot wetenschap, van online privacy tot koffie.",
|
||||||
|
|
||||||
|
"gopherDomain": "ginnegappen.nl",
|
||||||
|
"gopherPort": "1070",
|
||||||
|
"gopherInterface": "0.0.0.0",
|
||||||
|
|
||||||
|
"titleAttr": "title",
|
||||||
|
"urlAttr": "id",
|
||||||
|
"bodyAttr": "body"
|
||||||
|
}
|
Reference in a new issue