wiki_thsf_2015/db_git.js

194 lines
4.8 KiB
JavaScript

var FS = require('fs');
var Path = require('path');
//var Markdown = require("marked");
//var MdRenderer=require("./md-override")
var knex = require("knex");
var Bookshelf = require('bookshelf');
var async = require('async');
var textile = require('textile-js')
var Markdown = textile //Markdown = require('js-markdown-extra').Markdown
function orderize(files){
var pageObjs = []
for (var i = 0; i<files.length; i++){
var file = files[i].name
var order = parseInt(file.split("_")[0])
if(!isNaN(order)) {
var divId = file.split("_")[1].split(".markdown")[0]
var md = files[i].markdown
var html = files[i].html
pageObjs.push ({name: file.split(".markdown")[0], order:order, divId:divId, markdown:md, html:html })
}
}
return pageObjs.sort(function(a,b){ return a.order - b.order });
}
// This function is used to map wiki page names to files
// on the real filesystem.
function pathFromNameMd(name) {
return Path.join(__dirname, "pages", name + ".markdown");
}
function pathFromName(name) {
return Path.join(__dirname, "pages", name);
}
function pathFromDir() {
return Path.join(__dirname, "pages");
}
function fullPath(files) {
var paths = []
for (var i= 0; i < files.length; i++)
paths.push(pathFromName(files[i]))
return paths
}
// Load a file, parse the title and generate the HTML
exports.loadPage = function (name, callback) {
var path = pathFromNameMd(name);
// if (name != "home"){
// return callback(null,{exists: false})
// }
FS.readdir(pathFromDir(), function(err,files){
var pathfiles=fullPath(files)
var fileObj = []
async.map(pathfiles, FS.readFile, function(err, data){
for( var i = 0; i < files.length; i++){
//console.log(files[i])
try{
var html = Markdown(data[i].toString().replace(/\r/g,""))
fileObj.push({name : files[i], markdown:data[i].toString(), html:html} )
}
catch (err){ }
}
var torender = orderize(fileObj)
callback(null,{exists:true, torender:torender})
})
})
};
exports.editPage = function (name, callback) {
var path = pathFromNameMd(name);
FS.readFile(path, 'utf8', function (err, markdown) {
var exists = true;
if (err) {
if (err.code === "ENOENT") {
// Generate a placeholder body.
markdown = "# " + name.replace(/_/g, " ") +
"\n\n" + "This page does not exist yet.";
exists = false;
} else {
// Forward on all other errors.
return callback(err);
}
}
// Parse and render the markdown.
/*var tree = Markdown.parse(markdown);
var title = name;
for (var i = 1, l = tree.length; i < l; i++) {
if (tree[i] && tree[i][0] === "header") {
title = tree[i][2];
tree.splice(i, 1);
break;
}
}*/
var html = Markdown(markdown);
callback(null, {
name: name,
title: null,
exists: exists,
markdown: unescape(markdown),
html: html,
});
});
};
// Saving is simple. Just put the markdown in the file
exports.savePage = function (name, value, callback) {
var path = pathFromNameMd(name);
FS.writeFile(path, value.replace(/\r/g,""), callback);
nodegit.Repository.open("pages")
.then(function (){
return repo.openIndex();
})
.then(function(indexResult) {
index = indexResult;
return index.read(1);
})
.then(function() {
// this file is in the root of the directory and doesn't need a full path
return index.addByPath(name);
})
.then(function() {
// this will write both files to the index
return index.write();
})
.then(function() {
return index.writeTree();
})
.then(function(oidResult) {
oid = oidResult;
return nodegit.Reference.nameToId(repo, "HEAD");
})
.then(function(head) {
return repo.getCommit(head);
})
.then(function(parent) {
var author = nodegit.Signature.create("BOB",
"BOBHASHH", 123456789, 60);
var committer = nodegit.Signature.create("ALICE COMMIT",
"alicehash", 987654321, 90);
return repo.createCommit("HEAD", author, committer, "message", oid, [parent]);
})
.done(function(commitId) {
console.log("New Commit: ", commitId);
});
};
var dbFile = Path.join(__dirname, 'app.db');
var DB = Bookshelf(knex({
client: 'sqlite3',
connection: { filename: dbFile }
}));
FS.exists(dbFile, function(exists) {
if (!exists) {
console.log("create a new DB")
DB.knex.schema.createTable('Users', function(table) {
table.increments("id")
table.string('username')
table.string('password')
}).then( function(){ console.log("DB created") })
}
})
exports.DB = DB;