@@ -4,3 +4,5 @@ node_modules |
||
| 4 | 4 |
.DS_Store |
| 5 | 5 |
|
| 6 | 6 |
*/.DS_Store |
| 7 |
+ |
|
| 8 |
+codex/Research/* |
@@ -9,12 +9,14 @@ |
||
| 9 | 9 |
<link rel="stylesheet" href="../css/codex.css"> |
| 10 | 10 |
|
| 11 | 11 |
<!-- Javascript --> |
| 12 |
+ <script src="../bower_components/jquery/dist/jquery.js"></script> |
|
| 12 | 13 |
<script src="../bower_components/ace-builds/src-min-noconflict/ace.js"></script> |
| 13 | 14 |
<script src="../bower_components/angular/angular.js"></script> |
| 14 | 15 |
<script src="../bower_components/angular-ui-router/release/angular-ui-router.js"></script> |
| 15 | 16 |
<script src="../bower_components/angular-sanitize/angular-sanitize.js"></script> |
| 16 | 17 |
<script src="../bower_components/angular-ui-ace/ui-ace.js"></script> |
| 17 | 18 |
|
| 19 |
+ |
|
| 18 | 20 |
<script src="scripts/codex-app.js"></script> |
| 19 | 21 |
<script src="scripts/controllers/app-ctrl.js"></script> |
| 20 | 22 |
<script src="scripts/controllers/header-ctrl.js"></script> |
@@ -25,7 +27,7 @@ |
||
| 25 | 27 |
<script src="scripts/services/date-formatter.js" charset="utf-8"></script> |
| 26 | 28 |
|
| 27 | 29 |
<script> |
| 28 |
- var remote = require('remote');
|
|
| 30 |
+ var remote = require('remote');
|
|
| 29 | 31 |
var dialog = remote.require('dialog');
|
| 30 | 32 |
</script> |
| 31 | 33 |
</head> |
@@ -36,9 +38,26 @@ |
||
| 36 | 38 |
<header class="toolbar toolbar-header" ng-controller="HeaderCtrl"> |
| 37 | 39 |
<h1 class="title">Codex</h1> |
| 38 | 40 |
<div class="toolbar-actions"> |
| 41 |
+ <button class="btn btn-default" ng-click="goToHome()"> |
|
| 42 |
+ <span class="icon icon-home"></span> |
|
| 43 |
+ </button> |
|
| 44 |
+ |
|
| 45 |
+ <div class="btn-group"> |
|
| 46 |
+ <button class="btn btn-default" ng-class="noteEditBtnClass" ng-click="goBack()"> |
|
| 47 |
+ <span class="icon icon-left"></span> |
|
| 48 |
+ </button> |
|
| 49 |
+ <button class="btn btn-default" ng-class="noteViewBtnClass" ng-click="goForward()"> |
|
| 50 |
+ <span class="icon icon-right"></span> |
|
| 51 |
+ </button> |
|
| 52 |
+ </div> |
|
| 53 |
+ |
|
| 39 | 54 |
<button class="btn btn-default" ng-click="createNewNote()"> |
| 40 | 55 |
<span class="icon icon-plus"></span> |
| 41 | 56 |
</button> |
| 57 |
+ <button class="btn btn-default" ng-click="toogleSidebar()"> |
|
| 58 |
+ <span class="icon icon-list"></span> |
|
| 59 |
+ </button> |
|
| 60 |
+ |
|
| 42 | 61 |
<div class="btn-group pull-right"> |
| 43 | 62 |
<button class="btn btn-default" ng-class="noteEditBtnClass" ng-click="activateNoteEdit()"> |
| 44 | 63 |
<span class="icon icon-pencil"></span> |
@@ -47,6 +66,7 @@ |
||
| 47 | 66 |
<span class="icon icon-eye"></span> |
| 48 | 67 |
</button> |
| 49 | 68 |
</div> |
| 69 |
+ |
|
| 50 | 70 |
</div> |
| 51 | 71 |
</header> |
| 52 | 72 |
|
@@ -54,7 +74,7 @@ |
||
| 54 | 74 |
<!-- Your app's content goes inside .window-content --> |
| 55 | 75 |
<div class="window-content" id="holder"> |
| 56 | 76 |
<div class="pane-group"> |
| 57 |
- <div class="pane pane-sm sidebar" ng-controller="SidebarCtrl"> |
|
| 77 |
+ <div class="pane pane-sm sidebar" ng-controller="SidebarCtrl" ng-show="showSidebar"> |
|
| 58 | 78 |
<nav class="nav-group"> |
| 59 | 79 |
<h5 class="nav-group-title">My Notes</h5> |
| 60 | 80 |
<span class="nav-group-item active" ng-click="goToAllNotes()"> |
@@ -31,6 +31,12 @@ angular.module('codexApp.header', [])
|
||
| 31 | 31 |
}); |
| 32 | 32 |
} |
| 33 | 33 |
|
| 34 |
+ // Toogle sidebar |
|
| 35 |
+ |
|
| 36 |
+ $scope.toogleSidebar = function() {
|
|
| 37 |
+ $rootScope.$broadcast('sidebar:toogle');
|
|
| 38 |
+ } |
|
| 39 |
+ |
|
| 34 | 40 |
// Note View active button |
| 35 | 41 |
|
| 36 | 42 |
$scope.activateNoteView = function() {
|
@@ -11,28 +11,40 @@ angular.module('codexApp.noteView', [])
|
||
| 11 | 11 |
.controller('NoteViewCtrl',['$scope', '$rootScope', '$state', 'FileService', function ($scope, $rootScope, $state, FileService) {
|
| 12 | 12 |
|
| 13 | 13 |
var marked = require('marked');
|
| 14 |
+ marked.setOptions({
|
|
| 15 |
+ renderer: new marked.Renderer(), |
|
| 16 |
+ gfm: true, |
|
| 17 |
+ tables: true, |
|
| 18 |
+ breaks: false, |
|
| 19 |
+ pedantic: true, |
|
| 20 |
+ sanitize: false, |
|
| 21 |
+ smartLists: true, |
|
| 22 |
+ smartypants: true |
|
| 23 |
+ }); |
|
| 14 | 24 |
var filesystem = require("fs");
|
| 15 | 25 |
|
| 16 | 26 |
console.log('-> Note View opened!')
|
| 17 | 27 |
|
| 18 | 28 |
$scope.note = FileService.getCurrentNote(); |
| 19 | 29 |
$scope.container = "note-container"; |
| 20 |
- $scope.raw_data = ""; |
|
| 30 |
+ $scope.html_data = ""; |
|
| 21 | 31 |
|
| 22 | 32 |
|
| 23 | 33 |
$scope.loadNoteView = function() {
|
| 24 | 34 |
filesystem.readFile($scope.note.path, function(err, data) {
|
| 25 |
- var str = String.fromCharCode.apply(null, data) |
|
| 35 |
+ $scope.note.data = String.fromCharCode.apply(null, data) |
|
| 26 | 36 |
if(!$scope.$$phase) {
|
| 27 | 37 |
$scope.$apply(function(){
|
| 28 |
- $scope.note.data = str; |
|
| 29 |
- $scope.raw_data = str |
|
| 38 |
+ $scope.html_data = marked($scope.note.data); |
|
| 39 |
+ |
|
| 30 | 40 |
}); |
| 31 | 41 |
} else {
|
| 32 |
- $scope.note.data = str; |
|
| 33 |
- $scope.raw_data = str; |
|
| 42 |
+ $scope.html_data = marked($scope.note.data); |
|
| 43 |
+ |
|
| 34 | 44 |
} |
| 45 |
+ |
|
| 35 | 46 |
//console.log($scope.raw_data); |
| 47 |
+ $scope.fixImgURLs($scope.note.path, $scope.html_data); |
|
| 36 | 48 |
var a = document.getElementsByTagName('a'), ajax;
|
| 37 | 49 |
for (var i=0; i<a.length; ++i) {
|
| 38 | 50 |
a[i].addEventListener('click', handleAnchor, false);
|
@@ -45,25 +57,10 @@ angular.module('codexApp.noteView', [])
|
||
| 45 | 57 |
} |
| 46 | 58 |
if(e.srcElement.protocol == "file:"){
|
| 47 | 59 |
var current_note = FileService.getCurrentNote().path; |
| 48 |
- var current_path = current_note.split('/');
|
|
| 49 |
- current_path.pop(); |
|
| 50 | 60 |
var relative_path = e.srcElement.outerHTML.match(/href="([^"]*)/)[1]; |
| 51 |
- relative_path = relative_path.split('/');
|
|
| 52 |
- var count = 0; |
|
| 53 |
- for (var i = 0; i < relative_path.length; i++) {
|
|
| 54 |
- if(relative_path[i] == ".."){
|
|
| 55 |
- count = count + 1; |
|
| 56 |
- relative_path[i] = ""; |
|
| 57 |
- } |
|
| 58 |
- } |
|
| 59 |
- relative_path = relative_path.join('/');
|
|
| 60 |
- for (var i = 0; i < count; i++) {
|
|
| 61 |
- current_path.pop(); |
|
| 62 |
- } |
|
| 63 |
- current_path = current_path.join('/');
|
|
| 64 |
- current_path = current_path + relative_path |
|
| 65 |
- |
|
| 66 |
- var note = FileService.getNote(current_path); |
|
| 61 |
+ var fixed_url = $scope.fixRelativeURL(current_note, relative_path); |
|
| 62 |
+ |
|
| 63 |
+ var note = FileService.getNote(fixed_url); |
|
| 67 | 64 |
FileService.setCurrentNote(note); |
| 68 | 65 |
$scope.note = note; |
| 69 | 66 |
console.log("-> Opening Link: " + note.path)
|
@@ -80,15 +77,128 @@ angular.module('codexApp.noteView', [])
|
||
| 80 | 77 |
|
| 81 | 78 |
$scope.loadNoteView(); |
| 82 | 79 |
|
| 83 |
- $scope.marked = function(str) {
|
|
| 84 |
- if(str != "" && str != undefined) {
|
|
| 85 |
- return marked(str); |
|
| 80 |
+ $scope.fixImgURLs = function(current_note_path, html){
|
|
| 81 |
+ // var images = html.getElementsByTagName('img');
|
|
| 82 |
+ // var srcList = []; |
|
| 83 |
+ // for(var i = 0; i < images.length; i++) {
|
|
| 84 |
+ // console.log(images[i]); |
|
| 85 |
+ // images[i].src = $scope.fixRelativeURL(current_note_path, images[i].src); |
|
| 86 |
+ // } |
|
| 87 |
+ // page = angular.element(html); |
|
| 88 |
+ // console.log(page.find("img"))
|
|
| 89 |
+ // page.find("img").each(function() {
|
|
| 90 |
+ // var obj = angular.element(this); |
|
| 91 |
+ // console.log(page) |
|
| 92 |
+ // console.log(obj) |
|
| 93 |
+ // obj.attr('src') = $scope.fixRelativeURL(current_note_path, obj.attr('src'));
|
|
| 94 |
+ // console.log(obj.attr('src'));
|
|
| 95 |
+ // }); |
|
| 96 |
+ |
|
| 97 |
+ var imgs = angular.element(html).find("img");
|
|
| 98 |
+ var img_urls = [] |
|
| 99 |
+ for (var i = 0; i < imgs.length; i++) {
|
|
| 100 |
+ img_urls.push($scope.fixRelativeURL(current_note_path, $scope.absoluteToRelativeURL(current_note_path, imgs[i].src))); |
|
| 101 |
+ } |
|
| 102 |
+ var page_images = document.getElementsByTagName('img');
|
|
| 103 |
+ console.log("-> Changing "+ img_urls.length + " images")
|
|
| 104 |
+ console.log(page_images) |
|
| 105 |
+ for(var i = 0; i < img_urls.length; i++) {
|
|
| 106 |
+ console.log(page_images[i]); |
|
| 107 |
+ page_images[i].src = img_urls[i]; |
|
| 108 |
+ |
|
| 109 |
+ } |
|
| 110 |
+ } |
|
| 111 |
+ |
|
| 112 |
+ $scope.fixRelativeURL = function(current_url, relative_url) {
|
|
| 113 |
+ console.log("-> Fixing URL")
|
|
| 114 |
+ console.log(" * Relative URL: " + relative_url)
|
|
| 115 |
+ console.log(" * Note URL: " + current_url)
|
|
| 116 |
+ // split urls and create arrays |
|
| 117 |
+ var current_path = current_url.split('/');
|
|
| 118 |
+ var relative_path = relative_url.split('/');
|
|
| 119 |
+ // remove the current note's filename from the url |
|
| 120 |
+ current_path.pop(); |
|
| 121 |
+ // count how many folders the relative path goes back and erase '..' |
|
| 122 |
+ var count = 0; |
|
| 123 |
+ for (var i = 0; i < relative_path.length; i++) {
|
|
| 124 |
+ if(relative_path[i] == ".."){
|
|
| 125 |
+ count = count + 1; |
|
| 126 |
+ relative_path[i] = ""; |
|
| 127 |
+ } |
|
| 128 |
+ } |
|
| 129 |
+ // make the relative path a string again |
|
| 130 |
+ relative_path = relative_path.join('/');
|
|
| 131 |
+ // remove the same count of folders from the end of the current notes url |
|
| 132 |
+ for (var i = 0; i < count; i++) {
|
|
| 133 |
+ current_path.pop(); |
|
| 134 |
+ } |
|
| 135 |
+ // make the current note's url a string again |
|
| 136 |
+ current_path = current_path.join('/');
|
|
| 137 |
+ // add a '/' if the relative url pointed to a file or folder above the current notes root |
|
| 138 |
+ if(count == 0){
|
|
| 139 |
+ var fixed_url = current_path + "/" + relative_path; |
|
| 86 | 140 |
} else {
|
| 87 |
- return str; |
|
| 141 |
+ var fixed_url = current_path + relative_path; |
|
| 88 | 142 |
} |
| 143 |
+ // return the fixed relative url |
|
| 144 |
+ console.log(" * Fixed URL: " + fixed_url)
|
|
| 145 |
+ return fixed_url; |
|
| 146 |
+ } |
|
| 147 |
+ |
|
| 89 | 148 |
|
| 149 |
+ |
|
| 150 |
+ $scope.absoluteToRelativeURL = function(current_url, absolute_url) {
|
|
| 151 |
+ console.log("-> Converting absolute URL to relative")
|
|
| 152 |
+ console.log(" * Absolute URL: " + absolute_url)
|
|
| 153 |
+ console.log(" * Note URL: " + current_url)
|
|
| 154 |
+ // split urls and create arrays |
|
| 155 |
+ var current_path = current_url.split('/');
|
|
| 156 |
+ var absolute_path = $scope.getUrlParts(absolute_url).pathname.split('/');
|
|
| 157 |
+ // remove the current note's filename from the url and the image filename from the url |
|
| 158 |
+ current_path.pop(); |
|
| 159 |
+ current_path.shift(); |
|
| 160 |
+ absolute_path.shift(); |
|
| 161 |
+ // count how many folders the current path has |
|
| 162 |
+ var current_path_count = 0; |
|
| 163 |
+ for (var i = 0; i < current_path.length; i++) {
|
|
| 164 |
+ current_path_count = current_path_count + 1; |
|
| 165 |
+ } |
|
| 166 |
+ // count how many folders the absolute path has |
|
| 167 |
+ var absolute_path_count = 0; |
|
| 168 |
+ for (var i = 0; i < absolute_path.length; i++) {
|
|
| 169 |
+ absolute_path_count = absolute_path_count + 1; |
|
| 170 |
+ } |
|
| 171 |
+ absolute_path_count = absolute_path_count - 1; |
|
| 172 |
+ console.log(" * Cleaned current URL (" + current_path_count + " parts): " + current_path.join('/'))
|
|
| 173 |
+ console.log(" * Cleaned absolute URL (" + absolute_path_count + " parts): " + absolute_path.join('/'))
|
|
| 174 |
+ dif = current_path_count - (absolute_path_count -1); |
|
| 175 |
+ for (var i = 0; i < absolute_path_count; i++) {
|
|
| 176 |
+ absolute_path.shift(); |
|
| 177 |
+ } |
|
| 178 |
+ console.log(" * Modified current URL (" + current_path_count + " parts): " + current_path.join('/'))
|
|
| 179 |
+ console.log(" * Modified absolute URL (" + absolute_path_count + " parts): " + absolute_path.join('/'))
|
|
| 180 |
+ // make the relative path a string again |
|
| 181 |
+ var relative_path = absolute_path.join('/');
|
|
| 182 |
+ console.log(" * Converted relative URL: " + relative_path)
|
|
| 183 |
+ return relative_path; |
|
| 90 | 184 |
} |
| 91 | 185 |
|
| 92 | 186 |
|
| 93 | 187 |
|
| 188 |
+ $scope.getUrlParts = function(url) {
|
|
| 189 |
+ var a = document.createElement('a');
|
|
| 190 |
+ a.href = url; |
|
| 191 |
+ |
|
| 192 |
+ return {
|
|
| 193 |
+ href: a.href, |
|
| 194 |
+ host: a.host, |
|
| 195 |
+ hostname: a.hostname, |
|
| 196 |
+ port: a.port, |
|
| 197 |
+ pathname: a.pathname, |
|
| 198 |
+ protocol: a.protocol, |
|
| 199 |
+ hash: a.hash, |
|
| 200 |
+ search: a.search |
|
| 201 |
+ }; |
|
| 202 |
+ } |
|
| 203 |
+ |
|
| 94 | 204 |
}]); |
@@ -12,10 +12,30 @@ angular.module('codexApp.sidebar', [])
|
||
| 12 | 12 |
|
| 13 | 13 |
console.log('-> Sidebar loaded')
|
| 14 | 14 |
|
| 15 |
+ $scope.showSidebar = true; |
|
| 16 |
+ |
|
| 15 | 17 |
$scope.goToAllNotes = function() {
|
| 16 | 18 |
$rootScope.$broadcast('main-window:note-list');
|
| 17 | 19 |
$rootScope.$broadcast('window-view:change');
|
| 18 | 20 |
$state.go("index");
|
| 19 | 21 |
} |
| 20 | 22 |
|
| 23 |
+ $rootScope.$on('sidebar:toogle', function() {
|
|
| 24 |
+ if(!$scope.$$phase) {
|
|
| 25 |
+ $scope.$apply(function(){
|
|
| 26 |
+ $scope.toogleSidebar(); |
|
| 27 |
+ }); |
|
| 28 |
+ } else {
|
|
| 29 |
+ $scope.toogleSidebar(); |
|
| 30 |
+ } |
|
| 31 |
+ }); |
|
| 32 |
+ |
|
| 33 |
+ $scope.toogleSidebar = function() {
|
|
| 34 |
+ if( $scope.showSidebar == true){
|
|
| 35 |
+ $scope.showSidebar = false; |
|
| 36 |
+ } else {
|
|
| 37 |
+ $scope.showSidebar = true; |
|
| 38 |
+ } |
|
| 39 |
+ } |
|
| 40 |
+ |
|
| 21 | 41 |
}]); |
@@ -1,3 +1,3 @@ |
||
| 1 | 1 |
<div class="note-container"> |
| 2 |
- <div class="note" ng-bind-html="marked(note.data)"></div> |
|
| 2 |
+ <div class="note" ng-bind-html="html_data"></div> |
|
| 3 | 3 |
</div> |
@@ -23,6 +23,7 @@ |
||
| 23 | 23 |
"angular-ui": "~0.4.0", |
| 24 | 24 |
"angular-ui-router": "~0.2.15", |
| 25 | 25 |
"angular-sanitize": "~1.4.7", |
| 26 |
- "angular-ui-ace": "~0.2.3" |
|
| 26 |
+ "angular-ui-ace": "~0.2.3", |
|
| 27 |
+ "jquery": "~2.1.4" |
|
| 27 | 28 |
} |
| 28 | 29 |
} |
@@ -8,3 +8,8 @@ |
||
| 8 | 8 |
* [X] Edit and save files |
| 9 | 9 |
* [X] Create new files |
| 10 | 10 |
* [X] Internal links |
| 11 |
+* [X] Icon View |
|
| 12 |
+* [ ] Navigation History |
|
| 13 |
+* [ ] Note versioning |
|
| 14 |
+* [ ] Tags |
|
| 15 |
+* [ ] External Links |
@@ -0,0 +1 @@ |
||
| 1 |
+gjcjgcghj |
@@ -0,0 +1,11 @@ |
||
| 1 |
+# Index |
|
| 2 |
+ |
|
| 3 |
+#### Test Stack |
|
| 4 |
+ |
|
| 5 |
+* [Test-Stack/Notebook 2/Note-0001](Test-Stack/Notebook 2/Test-0001/index.md) |
|
| 6 |
+* [Test-Stack/Notebook 2/Note-0002](Test-Stack/Notebook 2/Test-0001/index.md) |
|
| 7 |
+* |
|
| 8 |
+ |
|
| 9 |
+#### Research |
|
| 10 |
+ |
|
| 11 |
+* [Chem Lights](Research/ChemLights/index.md) |
@@ -11,10 +11,15 @@ |
||
| 11 | 11 |
|
| 12 | 12 |
.note-container .note {
|
| 13 | 13 |
padding: 20px; |
| 14 |
- padding-top: 15px; |
|
| 15 | 14 |
border-radius: 10px; |
| 16 | 15 |
background-color: white; |
| 17 |
- margin: 25px; |
|
| 16 |
+ margin: 15px; |
|
| 17 |
+ margin-top: 10px; |
|
| 18 |
+ margin-right: 25px; |
|
| 19 |
+ font-family: helvetica; |
|
| 20 |
+ font-weight: 300; |
|
| 21 |
+ font-size: 14px; |
|
| 22 |
+ color: #333; |
|
| 18 | 23 |
} |
| 19 | 24 |
|
| 20 | 25 |
.ace_editor { height: 100%; }
|
@@ -27,3 +32,38 @@ |
||
| 27 | 32 |
} |
| 28 | 33 |
|
| 29 | 34 |
.ace_content { cursor: text; }
|
| 35 |
+ |
|
| 36 |
+.note .xsmall {
|
|
| 37 |
+ max-width: 150px; |
|
| 38 |
+} |
|
| 39 |
+ |
|
| 40 |
+.note .small {
|
|
| 41 |
+ max-width: 250px; |
|
| 42 |
+} |
|
| 43 |
+ |
|
| 44 |
+.note .medium {
|
|
| 45 |
+ max-width: 500px; |
|
| 46 |
+} |
|
| 47 |
+ |
|
| 48 |
+.note .medium {
|
|
| 49 |
+ max-width: 500px; |
|
| 50 |
+} |
|
| 51 |
+ |
|
| 52 |
+.note .large {
|
|
| 53 |
+ width: 650px; |
|
| 54 |
+} |
|
| 55 |
+ |
|
| 56 |
+ |
|
| 57 |
+.note .larger {
|
|
| 58 |
+ width: 750px; |
|
| 59 |
+} |
|
| 60 |
+ |
|
| 61 |
+.note .huge {
|
|
| 62 |
+ width: 1000px; |
|
| 63 |
+} |
|
| 64 |
+ |
|
| 65 |
+.note>h1:first-of-type {
|
|
| 66 |
+ margin-top: 0px; |
|
| 67 |
+} |
|
| 68 |
+ |
|
| 69 |
+.toolbar-actions .spacer { padding-left: 25px; }
|