Better permission management
This commit is contained in:
		
							parent
							
								
									a9b9c3eb5e
								
							
						
					
					
						commit
						4fcc27b9d3
					
				| @ -3,12 +3,6 @@ var VERSION = "2.1.7"; | |||||||
| var MAIN_URL = "http://benweet.github.io/stackedit/"; | var MAIN_URL = "http://benweet.github.io/stackedit/"; | ||||||
| var GOOGLE_ANALYTICS_ACCOUNT_ID = "UA-39556145-1"; | var GOOGLE_ANALYTICS_ACCOUNT_ID = "UA-39556145-1"; | ||||||
| var GOOGLE_API_KEY = "AIzaSyAeCU8CGcSkn0z9js6iocHuPBX4f_mMWkw"; | var GOOGLE_API_KEY = "AIzaSyAeCU8CGcSkn0z9js6iocHuPBX4f_mMWkw"; | ||||||
| var GOOGLE_SCOPES = [ |  | ||||||
|     "https://www.googleapis.com/auth/drive.install", |  | ||||||
|     "https://www.googleapis.com/auth/drive", |  | ||||||
|     "https://www.googleapis.com/auth/blogger", |  | ||||||
|     "https://picasaweb.google.com/data/" |  | ||||||
| ]; |  | ||||||
| var GOOGLE_DRIVE_APP_ID = "241271498917"; | var GOOGLE_DRIVE_APP_ID = "241271498917"; | ||||||
| var DROPBOX_APP_KEY = "lq6mwopab8wskas"; | var DROPBOX_APP_KEY = "lq6mwopab8wskas"; | ||||||
| var DROPBOX_APP_SECRET = "851fgnucpezy84t"; | var DROPBOX_APP_SECRET = "851fgnucpezy84t"; | ||||||
|  | |||||||
							
								
								
									
										31
									
								
								res/core.js
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								res/core.js
									
									
									
									
									
								
							| @ -124,6 +124,8 @@ define([ | |||||||
|         utils.setInputValue("#textarea-settings-default-content", settings.defaultContent); |         utils.setInputValue("#textarea-settings-default-content", settings.defaultContent); | ||||||
|         // Commit message
 |         // Commit message
 | ||||||
|         utils.setInputValue("#input-settings-publish-commit-msg", settings.commitMsg); |         utils.setInputValue("#input-settings-publish-commit-msg", settings.commitMsg); | ||||||
|  |         // Gdrive full access
 | ||||||
|  |         utils.setInputChecked("#input-settings-gdrive-full-access", settings.gdriveFullAccess); | ||||||
|         // Template
 |         // Template
 | ||||||
|         utils.setInputValue("#textarea-settings-publish-template", settings.template); |         utils.setInputValue("#textarea-settings-publish-template", settings.template); | ||||||
|         // PDF template
 |         // PDF template
 | ||||||
| @ -158,6 +160,8 @@ define([ | |||||||
|         newSettings.defaultContent = utils.getInputValue("#textarea-settings-default-content"); |         newSettings.defaultContent = utils.getInputValue("#textarea-settings-default-content"); | ||||||
|         // Commit message
 |         // Commit message
 | ||||||
|         newSettings.commitMsg = utils.getInputTextValue("#input-settings-publish-commit-msg", event); |         newSettings.commitMsg = utils.getInputTextValue("#input-settings-publish-commit-msg", event); | ||||||
|  |         // Gdrive full access
 | ||||||
|  |         newSettings.gdriveFullAccess = utils.getInputChecked("#input-settings-gdrive-full-access"); | ||||||
|         // Template
 |         // Template
 | ||||||
|         newSettings.template = utils.getInputTextValue("#textarea-settings-publish-template", event); |         newSettings.template = utils.getInputTextValue("#textarea-settings-publish-template", event); | ||||||
|         // PDF template
 |         // PDF template
 | ||||||
| @ -577,6 +581,14 @@ define([ | |||||||
|         $("#wmd-redo-button").append($('<i class="icon-forward">')).appendTo($btnGroupElt); |         $("#wmd-redo-button").append($('<i class="icon-forward">')).appendTo($btnGroupElt); | ||||||
|     }; |     }; | ||||||
|      |      | ||||||
|  |     // Shows a dialog to force the user to click a button before opening oauth popup
 | ||||||
|  |     var oauthRedirectCallback = undefined; | ||||||
|  |     core.oauthRedirect = function(providerName, callback) { | ||||||
|  |         oauthRedirectCallback = callback; | ||||||
|  |         $('.oauth-redirect-provider').text(providerName); | ||||||
|  |         $('.modal-oauth-redirect').modal("show"); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     // Initialize multiple things and then fire eventMgr.onReady
 |     // Initialize multiple things and then fire eventMgr.onReady
 | ||||||
|     var isDocumentPanelShown = false; |     var isDocumentPanelShown = false; | ||||||
|     var isMenuPanelShown = false; |     var isMenuPanelShown = false; | ||||||
| @ -855,6 +867,7 @@ define([ | |||||||
|             trigger: 'hover', |             trigger: 'hover', | ||||||
|             title: 'Thanks for supporting StackEdit by adding a backlink in your documents!' |             title: 'Thanks for supporting StackEdit by adding a backlink in your documents!' | ||||||
|         }); |         }); | ||||||
|  |         var tooltipOpen = false; | ||||||
|         $(".tooltip-usercustom-extension").tooltip({ |         $(".tooltip-usercustom-extension").tooltip({ | ||||||
|             html: true, |             html: true, | ||||||
|             container: '.modal-settings', |             container: '.modal-settings', | ||||||
| @ -864,10 +877,12 @@ define([ | |||||||
|         }).click(function(e) { |         }).click(function(e) { | ||||||
|             $(this).tooltip('show'); |             $(this).tooltip('show'); | ||||||
|             $(document).on("click.tooltip-usercustom-extension", function(e) { |             $(document).on("click.tooltip-usercustom-extension", function(e) { | ||||||
|  |                 tooltipOpen = false; | ||||||
|                 $(".tooltip-usercustom-extension").tooltip('hide'); |                 $(".tooltip-usercustom-extension").tooltip('hide'); | ||||||
|                 $(document).off("click.tooltip-usercustom-extension"); |                 $(document).off("click.tooltip-usercustom-extension"); | ||||||
|             }); |             }); | ||||||
|             e.stopPropagation(); |             !tooltipOpen && e.stopPropagation(); | ||||||
|  |             tooltipOpen = true; | ||||||
|         }); |         }); | ||||||
|         _.each(document.querySelectorAll(".tooltip-template"), function(tooltipElt) { |         _.each(document.querySelectorAll(".tooltip-template"), function(tooltipElt) { | ||||||
|             var $tooltipElt = $(tooltipElt); |             var $tooltipElt = $(tooltipElt); | ||||||
| @ -880,10 +895,12 @@ define([ | |||||||
|             }).click(function(e) { |             }).click(function(e) { | ||||||
|                 $tooltipElt.tooltip('show'); |                 $tooltipElt.tooltip('show'); | ||||||
|                 $(document).on("click.tooltip-template", function(e) { |                 $(document).on("click.tooltip-template", function(e) { | ||||||
|  |                     tooltipOpen = false; | ||||||
|                     $(".tooltip-template").tooltip('hide'); |                     $(".tooltip-template").tooltip('hide'); | ||||||
|                     $(document).off("click.tooltip-template"); |                     $(document).off("click.tooltip-template"); | ||||||
|                 }); |                 }); | ||||||
|                 e.stopPropagation(); |                 !tooltipOpen && e.stopPropagation(); | ||||||
|  |                 tooltipOpen = true; | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
| @ -899,6 +916,16 @@ define([ | |||||||
|             show: false |             show: false | ||||||
|         }); |         }); | ||||||
|          |          | ||||||
|  |         // OAuth redirect dialog
 | ||||||
|  |         $('.modal-oauth-redirect').modal({ | ||||||
|  |             backdrop: "static", | ||||||
|  |             keyboard: false, | ||||||
|  |             show: false | ||||||
|  |         }); | ||||||
|  |         $('.action-oauth-redirect').click(function() { | ||||||
|  |             oauthRedirectCallback(); | ||||||
|  |         }); | ||||||
|  |          | ||||||
|         // Load images
 |         // Load images
 | ||||||
|         _.each(document.querySelectorAll('img'), function(imgElt) { |         _.each(document.querySelectorAll('img'), function(imgElt) { | ||||||
|             var $imgElt = $(imgElt); |             var $imgElt = $(imgElt); | ||||||
|  | |||||||
| @ -41,7 +41,9 @@ define([ | |||||||
|             var htmlCode = _.template(buttonHtmlCode.config.template, { |             var htmlCode = _.template(buttonHtmlCode.config.template, { | ||||||
|                 documentTitle: selectedFileDesc.title, |                 documentTitle: selectedFileDesc.title, | ||||||
|                 documentMarkdown: selectedFileDesc.content, |                 documentMarkdown: selectedFileDesc.content, | ||||||
|                 documentHTML: html |                 documentHTML: html, | ||||||
|  |                 frontMatter: selectedFileDesc.frontMatter, | ||||||
|  |                 publishAttributes: undefined, | ||||||
|             }); |             }); | ||||||
|             textareaElt.value = htmlCode; |             textareaElt.value = htmlCode; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| define([ | define([ | ||||||
|     "jquery", |     "jquery", | ||||||
|     "underscore", |     "underscore", | ||||||
|  |     "crel", | ||||||
|     "classes/Extension", |     "classes/Extension", | ||||||
|     "text!html/buttonPublish.html", | ], function($, _, crel, Extension) { | ||||||
| ], function($, _, Extension, buttonPublishHTML) { |  | ||||||
| 
 | 
 | ||||||
|     var buttonPublish = new Extension("buttonPublish", 'Button "Publish"'); |     var buttonPublish = new Extension("buttonPublish", 'Button "Publish"'); | ||||||
|     // buttonPublish.settingsBlock = '<p>Adds a "Publish document" button in the
 |     // buttonPublish.settingsBlock = '<p>Adds a "Publish document" button in the
 | ||||||
| @ -26,7 +26,6 @@ define([ | |||||||
|             button.removeClass("disabled"); |             button.removeClass("disabled"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     ; |  | ||||||
| 
 | 
 | ||||||
|     var publisher = undefined; |     var publisher = undefined; | ||||||
|     buttonPublish.onPublisherCreated = function(publisherParameter) { |     buttonPublish.onPublisherCreated = function(publisherParameter) { | ||||||
| @ -34,13 +33,19 @@ define([ | |||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     buttonPublish.onCreateButton = function() { |     buttonPublish.onCreateButton = function() { | ||||||
|         var $buttonPublishHTML = $(buttonPublishHTML); |         var button = crel('button', { | ||||||
|         button = $buttonPublishHTML.click(function() { |             class: 'btn btn-success button-publish', | ||||||
|             if(!$buttonPublishHTML.hasClass("disabled")) { |             title: 'Publish this document' | ||||||
|  |         }, crel('i', { | ||||||
|  |             class: 'icon-share' | ||||||
|  |         })); | ||||||
|  |         var $button = $(button); | ||||||
|  |         $button.click(function() { | ||||||
|  |             if(!$button.hasClass("disabled")) { | ||||||
|                 publisher.publish(); |                 publisher.publish(); | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|         return button[0]; |         return button; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     buttonPublish.onPublishRunning = function(isRunning) { |     buttonPublish.onPublishRunning = function(isRunning) { | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ define([ | |||||||
| 
 | 
 | ||||||
|     buttonSync.onCreateButton = function() { |     buttonSync.onCreateButton = function() { | ||||||
|         var button = crel('button', { |         var button = crel('button', { | ||||||
|             class: 'btn btn-success', |             class: 'btn btn-success button-synchronize', | ||||||
|             title: 'Synchronize all' |             title: 'Synchronize all' | ||||||
|         }, crel('i', { |         }, crel('i', { | ||||||
|             class: 'icon-refresh' |             class: 'icon-refresh' | ||||||
|  | |||||||
| @ -258,19 +258,23 @@ define([ | |||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         // Set folder checkbox special behavior
 |         // Set file checkbox behavior
 | ||||||
|  |         _.each(documentListElt.querySelectorAll('.file .checkbox'), function(checkboxElt) { | ||||||
|  |             var $checkboxElt = $(checkboxElt); | ||||||
|  |             $checkboxElt.click(function(e) { | ||||||
|  |                 e.stopPropagation(); | ||||||
|  |             }).find('[type=checkbox]').change(function() { | ||||||
|  |                 $checkboxElt.parents('.list-group').find('.folder [type=checkbox]').prop('checked', false); | ||||||
|  |             }); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         // Set folder checkbox behavior
 | ||||||
|         _.each(documentListElt.querySelectorAll('.folder .checkbox'), function(checkboxElt) { |         _.each(documentListElt.querySelectorAll('.folder .checkbox'), function(checkboxElt) { | ||||||
|             var $checkboxElt = $(checkboxElt); |             var $checkboxElt = $(checkboxElt); | ||||||
|             $checkboxElt.click(function(e) { |             $checkboxElt.click(function(e) { | ||||||
|                 e.stopPropagation(); |                 e.stopPropagation(); | ||||||
|             }).find('[type=checkbox]').change(function() { |             }).find('[type=checkbox]').change(function() { | ||||||
|                 var documentCheckboxElts = $checkboxElt.parent().next().find('[type=checkbox]'); |                 $checkboxElt.parent().next().find('[type=checkbox]').prop('checked', this.checked); | ||||||
|                 if(this.checked) { |  | ||||||
|                     documentCheckboxElts.prop('checked', true).prop('disabled', true); |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     documentCheckboxElts.prop('checked', false).prop('disabled', false); |  | ||||||
|                 } |  | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
| @ -327,10 +331,10 @@ define([ | |||||||
| 
 | 
 | ||||||
|         // Selection dropdown menu actions
 |         // Selection dropdown menu actions
 | ||||||
|         $(modalElt.querySelectorAll('.action-select-all')).click(function() { |         $(modalElt.querySelectorAll('.action-select-all')).click(function() { | ||||||
|             $(documentListElt.querySelectorAll('input[type="checkbox"]')).prop('checked', true).change(); |             $(documentListElt.querySelectorAll('input[type="checkbox"]')).prop('checked', true); | ||||||
|         }); |         }); | ||||||
|         $(modalElt.querySelectorAll('.action-unselect-all')).click(function() { |         $(modalElt.querySelectorAll('.action-unselect-all')).click(function() { | ||||||
|             $(documentListElt.querySelectorAll('input[type="checkbox"]')).prop('checked', false).change(); |             $(documentListElt.querySelectorAll('input[type="checkbox"]')).prop('checked', false); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         // Delete selection actions
 |         // Delete selection actions
 | ||||||
|  | |||||||
| @ -2,9 +2,8 @@ define([ | |||||||
|     "utils", |     "utils", | ||||||
|     "classes/Extension", |     "classes/Extension", | ||||||
|     "text!html/mathJaxSettingsBlock.html", |     "text!html/mathJaxSettingsBlock.html", | ||||||
|     "text!libs/mathjax_config.js", |  | ||||||
|     "mathjax", |     "mathjax", | ||||||
| ], function(utils, Extension, mathJaxSettingsBlockHTML, mathjaxConfigJS) { | ], function(utils, Extension, mathJaxSettingsBlockHTML) { | ||||||
| 	 | 	 | ||||||
| 	var mathJax = new Extension("mathJax", "MathJax", true); | 	var mathJax = new Extension("mathJax", "MathJax", true); | ||||||
| 	mathJax.settingsBlock = mathJaxSettingsBlockHTML; | 	mathJax.settingsBlock = mathJaxSettingsBlockHTML; | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ define([ | |||||||
|     worker.postMessage(JSON.stringify(['init', typoJS, 'en_US', aff, dic])); |     worker.postMessage(JSON.stringify(['init', typoJS, 'en_US', aff, dic])); | ||||||
| 
 | 
 | ||||||
|     var aceEditor = undefined; |     var aceEditor = undefined; | ||||||
|     var wordRegExp = XRegExp('\\p{L}+', 'g'); |     var wordRegExp = XRegExp('\\p{L}+(?:\'\\p{L}+)*', 'g'); | ||||||
|     var markers = []; |     var markers = []; | ||||||
|     var timeoutId = undefined; |     var timeoutId = undefined; | ||||||
|      |      | ||||||
|  | |||||||
| @ -34,7 +34,7 @@ define([ | |||||||
|         tour.addSteps([ |         tour.addSteps([ | ||||||
|             { |             { | ||||||
|                 element: ".navbar-inner", |                 element: ".navbar-inner", | ||||||
|                 title: "Welcome to StackEdit", |                 title: "Welcome to StackEdit!", | ||||||
|                 content: "Please click <code>Next</code> to take a quick tour.", |                 content: "Please click <code>Next</code> to take a quick tour.", | ||||||
|                 placement: "bottom", |                 placement: "bottom", | ||||||
|             }, |             }, | ||||||
| @ -60,18 +60,22 @@ define([ | |||||||
|                 title: "Menu", |                 title: "Menu", | ||||||
|                 content: [ |                 content: [ | ||||||
|                     "<p>Use the <i class='icon-provider-stackedit'></i> menu to synchronize your document on <i class='icon-provider-gdrive'></i> <code>Google Drive</code> or <i class='icon-provider-dropbox'></i> <code>Dropbox</code>.</p>", |                     "<p>Use the <i class='icon-provider-stackedit'></i> menu to synchronize your document on <i class='icon-provider-gdrive'></i> <code>Google Drive</code> or <i class='icon-provider-dropbox'></i> <code>Dropbox</code>.</p>", | ||||||
|                     "Use also this menu to publish your document on <i class='icon-provider-github'></i> <code>GitHub</code>, <i class='icon-provider-blogger'></i> <code>Blogger</code>..." |                     "Use also this menu to publish your document on <i class='icon-provider-github'></i> <code>GitHub</code>, <i class='icon-provider-blogger'></i> <code>Blogger</code>, <i class='icon-provider-wordpress'></i> <code>WordPress</code>..." | ||||||
|                 ].join(''), |                 ].join(''), | ||||||
|                 placement: "right", |                 placement: "right", | ||||||
|                 reflex: true, |                 reflex: true, | ||||||
|             }, |             }, | ||||||
|             { |             { | ||||||
|                 element: "#extension-buttons button:first", |                 element: "#extension-buttons .button-synchronize", | ||||||
|                 title: "Synchronize/publish", |                 title: "Synchronize", | ||||||
|                 content: [ |                 content: "<p>Once imported/exported, use the <i class='icon-refresh'></i> <code>Synchronize</code> button to force the synchronization (this is done automatically every 3 minutes).</p>", | ||||||
|                     "<p>Once imported/exported, use the <i class='icon-refresh'></i> <code>Synchronize</code> button to force the synchronization (this is done automatically every 3 minutes).</p>", |                 placement: "bottom", | ||||||
|                     "Use also the <i class='icon-share'></i> <code>Publish</code> button to update your publications." |                 reflex: true, | ||||||
|                 ].join(''), |             }, | ||||||
|  |             { | ||||||
|  |                 element: "#extension-buttons .button-publish", | ||||||
|  |                 title: "Update publications", | ||||||
|  |                 content: "Once published, use the <i class='icon-share'></i> <code>Publish</code> button to update your publications.", | ||||||
|                 placement: "bottom", |                 placement: "bottom", | ||||||
|                 reflex: true, |                 reflex: true, | ||||||
|             }, |             }, | ||||||
|  | |||||||
| @ -3,7 +3,8 @@ define([ | |||||||
|     "underscore", |     "underscore", | ||||||
|     "core", |     "core", | ||||||
|     "eventMgr", |     "eventMgr", | ||||||
|     "classes/AsyncTask" |     "classes/AsyncTask", | ||||||
|  |     "config", | ||||||
| ], function($, _, core, eventMgr, AsyncTask) { | ], function($, _, core, eventMgr, AsyncTask) { | ||||||
| 
 | 
 | ||||||
|     var client = undefined; |     var client = undefined; | ||||||
| @ -61,6 +62,11 @@ define([ | |||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             var immediate = true; |             var immediate = true; | ||||||
|  |             function oauthRedirect() { | ||||||
|  |                 core.oauthRedirect('Dropbox', function() { | ||||||
|  |                     task.chain(localAuthenticate); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|             function localAuthenticate() { |             function localAuthenticate() { | ||||||
|                 if(immediate === false) { |                 if(immediate === false) { | ||||||
|                     eventMgr.onMessage("Please make sure the Dropbox authorization popup is not blocked by your browser."); |                     eventMgr.onMessage("Please make sure the Dropbox authorization popup is not blocked by your browser."); | ||||||
| @ -68,7 +74,6 @@ define([ | |||||||
|                     // credentials
 |                     // credentials
 | ||||||
|                     task.timeout = ASYNC_TASK_LONG_TIMEOUT; |                     task.timeout = ASYNC_TASK_LONG_TIMEOUT; | ||||||
|                 } |                 } | ||||||
|                 client.reset(); |  | ||||||
|                 client.authenticate({ |                 client.authenticate({ | ||||||
|                     interactive: !immediate |                     interactive: !immediate | ||||||
|                 }, function(error, client) { |                 }, function(error, client) { | ||||||
| @ -81,7 +86,7 @@ define([ | |||||||
|                     // If immediate did not work retry without immediate flag
 |                     // If immediate did not work retry without immediate flag
 | ||||||
|                     if(immediate === true) { |                     if(immediate === true) { | ||||||
|                         immediate = false; |                         immediate = false; | ||||||
|                         task.chain(localAuthenticate); |                         task.chain(oauthRedirect); | ||||||
|                         return; |                         return; | ||||||
|                     } |                     } | ||||||
|                     // Error
 |                     // Error
 | ||||||
|  | |||||||
| @ -3,7 +3,8 @@ define([ | |||||||
|     "core", |     "core", | ||||||
|     "utils", |     "utils", | ||||||
|     "eventMgr", |     "eventMgr", | ||||||
|     "classes/AsyncTask" |     "classes/AsyncTask", | ||||||
|  |     "config" | ||||||
| ], function($, core, utils, eventMgr, AsyncTask) { | ], function($, core, utils, eventMgr, AsyncTask) { | ||||||
| 
 | 
 | ||||||
|     var connected = undefined; |     var connected = undefined; | ||||||
| @ -55,7 +56,7 @@ define([ | |||||||
|                 task.chain(); |                 task.chain(); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             var token = localStorage["githubToken"]; |             var token = localStorage.githubToken; | ||||||
|             if(token !== undefined) { |             if(token !== undefined) { | ||||||
|                 github = new Github({ |                 github = new Github({ | ||||||
|                     token: token, |                     token: token, | ||||||
| @ -64,12 +65,17 @@ define([ | |||||||
|                 task.chain(); |                 task.chain(); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             eventMgr.onMessage("Please make sure the Github authorization popup is not blocked by your browser."); |  | ||||||
|             var errorMsg = "Failed to retrieve a token from GitHub."; |             var errorMsg = "Failed to retrieve a token from GitHub."; | ||||||
|             // We add time for user to enter his credentials
 |             // We add time for user to enter his credentials
 | ||||||
|             task.timeout = ASYNC_TASK_LONG_TIMEOUT; |             task.timeout = ASYNC_TASK_LONG_TIMEOUT; | ||||||
|             var code = undefined; |             var code = undefined; | ||||||
|  |             function oauthRedirect() { | ||||||
|  |                 core.oauthRedirect('GitHub', function() { | ||||||
|  |                     task.chain(getCode); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|             function getCode() { |             function getCode() { | ||||||
|  |                 eventMgr.onMessage("Please make sure the Github authorization popup is not blocked by your browser."); | ||||||
|                 localStorage.removeItem("githubCode"); |                 localStorage.removeItem("githubCode"); | ||||||
|                 authWindow = utils.popupWindow('github-oauth-client.html?client_id=' + GITHUB_CLIENT_ID, 'stackedit-github-oauth', 960, 600); |                 authWindow = utils.popupWindow('github-oauth-client.html?client_id=' + GITHUB_CLIENT_ID, 'stackedit-github-oauth', 960, 600); | ||||||
|                 authWindow.focus(); |                 authWindow.focus(); | ||||||
| @ -78,7 +84,7 @@ define([ | |||||||
|                         clearInterval(intervalId); |                         clearInterval(intervalId); | ||||||
|                         authWindow = undefined; |                         authWindow = undefined; | ||||||
|                         intervalId = undefined; |                         intervalId = undefined; | ||||||
|                         code = localStorage["githubCode"]; |                         code = localStorage.githubCode; | ||||||
|                         if(code === undefined) { |                         if(code === undefined) { | ||||||
|                             task.error(new Error(errorMsg)); |                             task.error(new Error(errorMsg)); | ||||||
|                             return; |                             return; | ||||||
| @ -92,7 +98,7 @@ define([ | |||||||
|                 $.getJSON(GATEKEEPER_URL + "authenticate/" + code, function(data) { |                 $.getJSON(GATEKEEPER_URL + "authenticate/" + code, function(data) { | ||||||
|                     if(data.token !== undefined) { |                     if(data.token !== undefined) { | ||||||
|                         token = data.token; |                         token = data.token; | ||||||
|                         localStorage["githubToken"] = token; |                         localStorage.githubToken = token; | ||||||
|                         github = new Github({ |                         github = new Github({ | ||||||
|                             token: token, |                             token: token, | ||||||
|                             auth: "oauth" |                             auth: "oauth" | ||||||
| @ -104,7 +110,7 @@ define([ | |||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|             task.chain(getCode); |             task.chain(oauthRedirect); | ||||||
|         }); |         }); | ||||||
|         task.onError(function() { |         task.onError(function() { | ||||||
|             if(intervalId !== undefined) { |             if(intervalId !== undefined) { | ||||||
|  | |||||||
| @ -1,13 +1,16 @@ | |||||||
| define([ | define([ | ||||||
|  |     "underscore", | ||||||
|     "jquery", |     "jquery", | ||||||
|     "core", |     "core", | ||||||
|     "utils", |     "utils", | ||||||
|  |     "settings", | ||||||
|     "eventMgr", |     "eventMgr", | ||||||
|     "classes/AsyncTask" |     "classes/AsyncTask", | ||||||
| ], function($, core, utils, eventMgr, AsyncTask) { |     "config" | ||||||
|  | ], function(_, $, core, utils, settings, eventMgr, AsyncTask) { | ||||||
| 
 | 
 | ||||||
|     var connected = false; |     var connected = false; | ||||||
|     var authenticated = false; |     var permissionList = {}; | ||||||
| 
 | 
 | ||||||
|     var googleHelper = {}; |     var googleHelper = {}; | ||||||
| 
 | 
 | ||||||
| @ -50,23 +53,49 @@ define([ | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Try to authenticate with Oauth
 |     // Try to authenticate with Oauth
 | ||||||
|     function authenticate(task) { |     function authenticate(task, permission) { | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             if(authenticated === true) { |             if(_.has(permissionList, permission)) { | ||||||
|                 task.chain(); |                 task.chain(); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |             var scopes = undefined; | ||||||
|  |             if(permission == 'gdrive' && settings.gdriveFullAccess === true) { | ||||||
|  |                 scopes = [ | ||||||
|  |                     "https://www.googleapis.com/auth/drive.install", | ||||||
|  |                     "https://www.googleapis.com/auth/drive", | ||||||
|  |                 ]; | ||||||
|  |             }  | ||||||
|  |             else if(permission == 'gdrive' && settings.gdriveFullAccess === false) { | ||||||
|  |                 scopes = [ | ||||||
|  |                     "https://www.googleapis.com/auth/drive.install", | ||||||
|  |                     "https://www.googleapis.com/auth/drive.file", | ||||||
|  |                 ]; | ||||||
|  |             }  | ||||||
|  |             else if(permission == 'blogger') { | ||||||
|  |                 scopes = [ | ||||||
|  |                     "https://www.googleapis.com/auth/blogger", | ||||||
|  |                 ]; | ||||||
|  |             }  | ||||||
|  |             else if(permission == 'picasa') { | ||||||
|  |                 scopes = [ | ||||||
|  |                     "https://picasaweb.google.com/data/", | ||||||
|  |                 ]; | ||||||
|  |             }  | ||||||
|             var immediate = true; |             var immediate = true; | ||||||
|  |             function oauthRedirect() { | ||||||
|  |                 core.oauthRedirect('Google', function() { | ||||||
|  |                     task.chain(localAuthenticate); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|             function localAuthenticate() { |             function localAuthenticate() { | ||||||
|                 if(immediate === false) { |                 if(immediate === false) { | ||||||
|                     eventMgr.onMessage("Please make sure the Google authorization popup is not blocked by your browser."); |                     eventMgr.onMessage("Please make sure the Google authorization popup is not blocked by your browser."); | ||||||
|                     // If not immediate we add time for user to enter his
 |  | ||||||
|                     // credentials
 |  | ||||||
|                     task.timeout = ASYNC_TASK_LONG_TIMEOUT; |                     task.timeout = ASYNC_TASK_LONG_TIMEOUT; | ||||||
|                 } |                 } | ||||||
|                 gapi.auth.authorize({ |                 gapi.auth.authorize({ | ||||||
|                     'client_id': GOOGLE_CLIENT_ID, |                     'client_id': GOOGLE_CLIENT_ID, | ||||||
|                     'scope': GOOGLE_SCOPES, |                     'scope': scopes, | ||||||
|                     'immediate': immediate |                     'immediate': immediate | ||||||
|                 }, function(authResult) { |                 }, function(authResult) { | ||||||
|                     gapi.client.load('drive', 'v2', function() { |                     gapi.client.load('drive', 'v2', function() { | ||||||
| @ -75,7 +104,7 @@ define([ | |||||||
|                             // flag
 |                             // flag
 | ||||||
|                             if(connected === true && immediate === true) { |                             if(connected === true && immediate === true) { | ||||||
|                                 immediate = false; |                                 immediate = false; | ||||||
|                                 task.chain(localAuthenticate); |                                 task.chain(oauthRedirect); | ||||||
|                                 return; |                                 return; | ||||||
|                             } |                             } | ||||||
|                             // Error
 |                             // Error
 | ||||||
| @ -83,7 +112,7 @@ define([ | |||||||
|                             return; |                             return; | ||||||
|                         } |                         } | ||||||
|                         // Success
 |                         // Success
 | ||||||
|                         authenticated = true; |                         permissionList[permission] = true; | ||||||
|                         task.chain(); |                         task.chain(); | ||||||
|                     }); |                     }); | ||||||
|                 }); |                 }); | ||||||
| @ -91,11 +120,11 @@ define([ | |||||||
|             task.chain(localAuthenticate); |             task.chain(localAuthenticate); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     googleHelper.forceAuthenticate = function() { |     googleHelper.forceGdriveAuthenticate = function() { | ||||||
|         authenticated = false; |         permissionList = _.omit(permissionList, 'gdrive') ; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'gdrive'); | ||||||
|         task.enqueue(); |         task.enqueue(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| @ -103,7 +132,7 @@ define([ | |||||||
|         var result = undefined; |         var result = undefined; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'gdrive'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             var boundary = '-------314159265358979323846'; |             var boundary = '-------314159265358979323846'; | ||||||
|             var delimiter = "\r\n--" + boundary + "\r\n"; |             var delimiter = "\r\n--" + boundary + "\r\n"; | ||||||
| @ -198,7 +227,7 @@ define([ | |||||||
|         var result = undefined; |         var result = undefined; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'gdrive'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             var body = {'title': title}; |             var body = {'title': title}; | ||||||
|             var request = gapi.client.drive.files.patch({ |             var request = gapi.client.drive.files.patch({ | ||||||
| @ -235,7 +264,7 @@ define([ | |||||||
|         var result = undefined; |         var result = undefined; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'gdrive'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             var metadata = { |             var metadata = { | ||||||
|                 title: title, |                 title: title, | ||||||
| @ -276,7 +305,7 @@ define([ | |||||||
|         var result = undefined; |         var result = undefined; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'picasa'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             var headers = { |             var headers = { | ||||||
|                 "Slug": name |                 "Slug": name | ||||||
| @ -331,7 +360,7 @@ define([ | |||||||
|         var newChangeId = lastChangeId || 0; |         var newChangeId = lastChangeId || 0; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'gdrive'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             var nextPageToken = undefined; |             var nextPageToken = undefined; | ||||||
|             function retrievePageOfChanges() { |             function retrievePageOfChanges() { | ||||||
| @ -383,7 +412,7 @@ define([ | |||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         if(!skipAuth) { |         if(!skipAuth) { | ||||||
|             authenticate(task); |             authenticate(task, 'gdrive'); | ||||||
|         } |         } | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             function recursiveDownloadMetadata() { |             function recursiveDownloadMetadata() { | ||||||
| @ -439,7 +468,7 @@ define([ | |||||||
|         task.timeout = ASYNC_TASK_LONG_TIMEOUT; |         task.timeout = ASYNC_TASK_LONG_TIMEOUT; | ||||||
|         connect(task); |         connect(task); | ||||||
|         if(!skipAuth) { |         if(!skipAuth) { | ||||||
|             authenticate(task); |             authenticate(task, 'gdrive'); | ||||||
|         } |         } | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             function recursiveDownloadContent() { |             function recursiveDownloadContent() { | ||||||
| @ -512,7 +541,7 @@ define([ | |||||||
|         var doc = undefined; |         var doc = undefined; | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'gdrive'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             gapi.drive.realtime.load(fileId, function(result) { |             gapi.drive.realtime.load(fileId, function(result) { | ||||||
|                 // onFileLoaded
 |                 // onFileLoaded
 | ||||||
| @ -552,14 +581,14 @@ define([ | |||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 else if(error.code === 401 || error.code === 403 || error.code == "token_refresh_required") { |                 else if(error.code === 401 || error.code === 403 || error.code == "token_refresh_required") { | ||||||
|                     authenticated = false; |                     permissionList = {}; | ||||||
|                     errorMsg = "Access to Google account is not authorized."; |                     errorMsg = "Access to Google account is not authorized."; | ||||||
|                     task.retry(new Error(errorMsg), 1); |                     task.retry(new Error(errorMsg), 1); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|                 else if(error.code === 0 || error.code === -1) { |                 else if(error.code === 0 || error.code === -1) { | ||||||
|                     connected = false; |                     connected = false; | ||||||
|                     authenticated = false; |                     permissionList = {}; | ||||||
|                     core.setOffline(); |                     core.setOffline(); | ||||||
|                     errorMsg = "|stopPublish"; |                     errorMsg = "|stopPublish"; | ||||||
|                 } |                 } | ||||||
| @ -670,7 +699,7 @@ define([ | |||||||
|     googleHelper.uploadBlogger = function(blogUrl, blogId, postId, labelList, title, content, callback) { |     googleHelper.uploadBlogger = function(blogUrl, blogId, postId, labelList, title, content, callback) { | ||||||
|         var task = new AsyncTask(); |         var task = new AsyncTask(); | ||||||
|         connect(task); |         connect(task); | ||||||
|         authenticate(task); |         authenticate(task, 'blogger'); | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             var headers = {}; |             var headers = {}; | ||||||
|             var token = gapi.auth.getToken(); |             var token = gapi.auth.getToken(); | ||||||
|  | |||||||
| @ -36,13 +36,12 @@ define([ | |||||||
|                 task.chain(); |                 task.chain(); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             var serializedOauthParams = localStorage["tumblrOauthParams"]; |             var serializedOauthParams = localStorage.tumblrOauthParams; | ||||||
|             if(serializedOauthParams !== undefined) { |             if(serializedOauthParams !== undefined) { | ||||||
|                 oauthParams = JSON.parse(serializedOauthParams); |                 oauthParams = JSON.parse(serializedOauthParams); | ||||||
|                 task.chain(); |                 task.chain(); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             eventMgr.onMessage("Please make sure the Tumblr authorization popup is not blocked by your browser."); |  | ||||||
|             var errorMsg = "Failed to retrieve a token from Tumblr."; |             var errorMsg = "Failed to retrieve a token from Tumblr."; | ||||||
|             // We add time for user to enter his credentials
 |             // We add time for user to enter his credentials
 | ||||||
|             task.timeout = ASYNC_TASK_LONG_TIMEOUT; |             task.timeout = ASYNC_TASK_LONG_TIMEOUT; | ||||||
| @ -51,14 +50,20 @@ define([ | |||||||
|                 $.getJSON(TUMBLR_PROXY_URL + "request_token", function(data) { |                 $.getJSON(TUMBLR_PROXY_URL + "request_token", function(data) { | ||||||
|                     if(data.oauth_token !== undefined) { |                     if(data.oauth_token !== undefined) { | ||||||
|                         oauth_object = data; |                         oauth_object = data; | ||||||
|                         task.chain(getVerifier); |                         task.chain(oauthRedirect); | ||||||
|                     } |                     } | ||||||
|                     else { |                     else { | ||||||
|                         task.error(new Error(errorMsg)); |                         task.error(new Error(errorMsg)); | ||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|  |             function oauthRedirect() { | ||||||
|  |                 core.oauthRedirect('Tumblr', function() { | ||||||
|  |                     task.chain(getVerifier); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|             function getVerifier() { |             function getVerifier() { | ||||||
|  |                 eventMgr.onMessage("Please make sure the Tumblr authorization popup is not blocked by your browser."); | ||||||
|                 localStorage.removeItem("tumblrVerifier"); |                 localStorage.removeItem("tumblrVerifier"); | ||||||
|                 authWindow = utils.popupWindow('tumblr-oauth-client.html?oauth_token=' + oauth_object.oauth_token, 'stackedit-tumblr-oauth', 800, 600); |                 authWindow = utils.popupWindow('tumblr-oauth-client.html?oauth_token=' + oauth_object.oauth_token, 'stackedit-tumblr-oauth', 800, 600); | ||||||
|                 authWindow.focus(); |                 authWindow.focus(); | ||||||
| @ -67,7 +72,7 @@ define([ | |||||||
|                         clearInterval(intervalId); |                         clearInterval(intervalId); | ||||||
|                         authWindow = undefined; |                         authWindow = undefined; | ||||||
|                         intervalId = undefined; |                         intervalId = undefined; | ||||||
|                         oauth_object.oauth_verifier = localStorage["tumblrVerifier"]; |                         oauth_object.oauth_verifier = localStorage.tumblrVerifier; | ||||||
|                         if(oauth_object.oauth_verifier === undefined) { |                         if(oauth_object.oauth_verifier === undefined) { | ||||||
|                             task.error(new Error(errorMsg)); |                             task.error(new Error(errorMsg)); | ||||||
|                             return; |                             return; | ||||||
| @ -80,7 +85,7 @@ define([ | |||||||
|             function getAccessToken() { |             function getAccessToken() { | ||||||
|                 $.getJSON(TUMBLR_PROXY_URL + "access_token", oauth_object, function(data) { |                 $.getJSON(TUMBLR_PROXY_URL + "access_token", oauth_object, function(data) { | ||||||
|                     if(data.access_token !== undefined && data.access_token_secret !== undefined) { |                     if(data.access_token !== undefined && data.access_token_secret !== undefined) { | ||||||
|                         localStorage["tumblrOauthParams"] = JSON.stringify(data); |                         localStorage.tumblrOauthParams = JSON.stringify(data); | ||||||
|                         oauthParams = data; |                         oauthParams = data; | ||||||
|                         task.chain(); |                         task.chain(); | ||||||
|                     } |                     } | ||||||
|  | |||||||
| @ -32,17 +32,22 @@ define([ | |||||||
|         var authWindow = undefined; |         var authWindow = undefined; | ||||||
|         var intervalId = undefined; |         var intervalId = undefined; | ||||||
|         task.onRun(function() { |         task.onRun(function() { | ||||||
|             token = localStorage["wordpressToken"]; |             token = localStorage.wordpressToken; | ||||||
|             if(token !== undefined) { |             if(token !== undefined) { | ||||||
|                 task.chain(); |                 task.chain(); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             eventMgr.onMessage("Please make sure the Wordpress authorization popup is not blocked by your browser."); |  | ||||||
|             var errorMsg = "Failed to retrieve a token from Wordpress."; |             var errorMsg = "Failed to retrieve a token from Wordpress."; | ||||||
|             // We add time for user to enter his credentials
 |             // We add time for user to enter his credentials
 | ||||||
|             task.timeout = ASYNC_TASK_LONG_TIMEOUT; |             task.timeout = ASYNC_TASK_LONG_TIMEOUT; | ||||||
|             var code = undefined; |             var code = undefined; | ||||||
|  |             function oauthRedirect() { | ||||||
|  |                 core.oauthRedirect('WordPress', function() { | ||||||
|  |                     task.chain(getCode); | ||||||
|  |                 }); | ||||||
|  |             } | ||||||
|             function getCode() { |             function getCode() { | ||||||
|  |                 eventMgr.onMessage("Please make sure the Wordpress authorization popup is not blocked by your browser."); | ||||||
|                 localStorage.removeItem("wordpressCode"); |                 localStorage.removeItem("wordpressCode"); | ||||||
|                 authWindow = utils.popupWindow('wordpress-oauth-client.html?client_id=' + WORDPRESS_CLIENT_ID, 'stackedit-wordpress-oauth', 960, 600); |                 authWindow = utils.popupWindow('wordpress-oauth-client.html?client_id=' + WORDPRESS_CLIENT_ID, 'stackedit-wordpress-oauth', 960, 600); | ||||||
|                 authWindow.focus(); |                 authWindow.focus(); | ||||||
| @ -51,7 +56,7 @@ define([ | |||||||
|                         clearInterval(intervalId); |                         clearInterval(intervalId); | ||||||
|                         authWindow = undefined; |                         authWindow = undefined; | ||||||
|                         intervalId = undefined; |                         intervalId = undefined; | ||||||
|                         code = localStorage["wordpressCode"]; |                         code = localStorage.wordpressCode; | ||||||
|                         if(code === undefined) { |                         if(code === undefined) { | ||||||
|                             task.error(new Error(errorMsg)); |                             task.error(new Error(errorMsg)); | ||||||
|                             return; |                             return; | ||||||
| @ -65,7 +70,7 @@ define([ | |||||||
|                 $.getJSON(WORDPRESS_PROXY_URL + "authenticate/" + code, function(data) { |                 $.getJSON(WORDPRESS_PROXY_URL + "authenticate/" + code, function(data) { | ||||||
|                     if(data.token !== undefined) { |                     if(data.token !== undefined) { | ||||||
|                         token = data.token; |                         token = data.token; | ||||||
|                         localStorage["wordpressToken"] = token; |                         localStorage.wordpressToken = token; | ||||||
|                         task.chain(); |                         task.chain(); | ||||||
|                     } |                     } | ||||||
|                     else { |                     else { | ||||||
| @ -73,7 +78,7 @@ define([ | |||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
|             } |             } | ||||||
|             task.chain(getCode); |             task.chain(oauthRedirect); | ||||||
|         }); |         }); | ||||||
|         task.onError(function() { |         task.onError(function() { | ||||||
|             if(intervalId !== undefined) { |             if(intervalId !== undefined) { | ||||||
|  | |||||||
| @ -745,23 +745,6 @@ | |||||||
| 								class="form-control"> | 								class="form-control"> | ||||||
| 						</div> | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 					<div class="form-group modal-publish-blogger"> |  | ||||||
| 						<label class="col-lg-4 control-label" for="input-publish-labels">Labels |  | ||||||
| 							(comma separated)</label> |  | ||||||
| 						<div class="col-lg-7"> |  | ||||||
| 							<input type="text" id="input-publish-labels" |  | ||||||
| 								placeholder="Label1, Label2" class="form-control"> |  | ||||||
| 						</div> |  | ||||||
| 					</div> |  | ||||||
| 					<div |  | ||||||
| 						class="form-group modal-publish-tumblr modal-publish-wordpress"> |  | ||||||
| 						<label class="col-lg-4 control-label" for="input-publish-tags">Tags |  | ||||||
| 							(comma separated)</label> |  | ||||||
| 						<div class="col-lg-7"> |  | ||||||
| 							<input type="text" id="input-publish-tags" |  | ||||||
| 								placeholder="Tag1, Tag2" class="form-control"> |  | ||||||
| 						</div> |  | ||||||
| 					</div> |  | ||||||
| 					<div class="form-group modal-publish-dropbox"> | 					<div class="form-group modal-publish-dropbox"> | ||||||
| 						<label class="col-lg-4 control-label" | 						<label class="col-lg-4 control-label" | ||||||
| 							for="input-publish-dropbox-path">File path</label> | 							for="input-publish-dropbox-path">File path</label> | ||||||
| @ -833,6 +816,12 @@ | |||||||
| 						</div> | 						</div> | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
|  | 				<blockquote class="front-matter-info modal-publish-blogger modal-publish-tumblr modal-publish-wordpress"> | ||||||
|  |                     <p><b>NOTE:</b> You can use a | ||||||
|  |                     <a href="http://jekyllrb.com/docs/frontmatter/" | ||||||
|  |                     target="_blank">YAML front matter</a> to specify the title and the tags/labels of your publication.</p> | ||||||
|  |                     <p><b>Interpreted variables:</b> <i>title, categories/tags</i></p> | ||||||
|  | 				</blockquote> | ||||||
| 			</div> | 			</div> | ||||||
| 			<div class="modal-footer"> | 			<div class="modal-footer"> | ||||||
| 				<a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a> | 				<a href="#" class="btn btn-default" data-dismiss="modal">Cancel</a> | ||||||
| @ -972,11 +961,14 @@ | |||||||
| 					<div class="tab-pane" id="tabpane-settings-services"> | 					<div class="tab-pane" id="tabpane-settings-services"> | ||||||
| 						<div class="form-horizontal"> | 						<div class="form-horizontal"> | ||||||
| 							<div class="form-group"> | 							<div class="form-group"> | ||||||
| 								<label class="col-lg-4 control-label" | 								<label class="col-lg-4 control-label">Permission</label> | ||||||
| 									for="input-settings-publish-commit-msg">Commit message</label> |  | ||||||
| 								<div class="col-lg-7"> | 								<div class="col-lg-7"> | ||||||
| 									<input type="text" id="input-settings-publish-commit-msg" | 									<div class="checkbox"> | ||||||
| 										class="form-control"> | 									    <label> | ||||||
|  | 										    <input type="checkbox" id="input-settings-gdrive-full-access" /> | ||||||
|  | 										    Allow StackEdit to open any document in Google Drive | ||||||
|  | 										</label> | ||||||
|  | 									</div> | ||||||
| 								</div> | 								</div> | ||||||
| 							</div> | 							</div> | ||||||
| 							<div class="form-group"> | 							<div class="form-group"> | ||||||
| @ -999,6 +991,14 @@ | |||||||
| 										class="form-control"></textarea> | 										class="form-control"></textarea> | ||||||
| 								</div> | 								</div> | ||||||
| 							</div> | 							</div> | ||||||
|  | 							<div class="form-group"> | ||||||
|  | 								<label class="col-lg-4 control-label" | ||||||
|  | 									for="input-settings-publish-commit-msg">GitHub commit message</label> | ||||||
|  | 								<div class="col-lg-7"> | ||||||
|  | 									<input type="text" id="input-settings-publish-commit-msg" | ||||||
|  | 										class="form-control"> | ||||||
|  | 								</div> | ||||||
|  | 							</div> | ||||||
| 							<div class="form-group"> | 							<div class="form-group"> | ||||||
| 								<label class="col-lg-4 control-label" | 								<label class="col-lg-4 control-label" | ||||||
| 									for="input-settings-ssh-proxy">SSH proxy</label> | 									for="input-settings-ssh-proxy">SSH proxy</label> | ||||||
| @ -1082,6 +1082,24 @@ | |||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | <div class="modal modal-oauth-redirect"> | ||||||
|  | 	<div class="modal-dialog"> | ||||||
|  | 		<div class="modal-content"> | ||||||
|  | 
 | ||||||
|  | 			<div class="modal-header"> | ||||||
|  | 				<h3 class="modal-title">Authorization</h3> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="modal-body"> | ||||||
|  | 				<blockquote><b>NOTE:</b> You are being redirected to <span class="oauth-redirect-provider"></span> authorization page.</blockquote> | ||||||
|  | 			</div> | ||||||
|  | 			<div class="modal-footer"> | ||||||
|  | 				<a class="btn btn-primary action-oauth-redirect" data-dismiss="modal">Continue</a> | ||||||
|  | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| <div class="modal modal-app-reset"> | <div class="modal modal-app-reset"> | ||||||
| 	<div class="modal-dialog"> | 	<div class="modal-dialog"> | ||||||
| 		<div class="modal-content"> | 		<div class="modal-content"> | ||||||
|  | |||||||
| @ -1,3 +0,0 @@ | |||||||
| <button class="btn btn-success" title="Publish this document"> |  | ||||||
| 	<i class="icon-share"></i> |  | ||||||
| </button> |  | ||||||
| @ -1,26 +1,31 @@ | |||||||
| Available variables: | Available variables: | ||||||
| <br> | <br> | ||||||
| <ul> | <ul> | ||||||
| 	<li><b>documentTitle</b>: document title</li> |     <li> | ||||||
| 	<li><b>documentMarkdown</b>: document in Markdown format</li> |         <b>documentTitle</b>: document title</li> | ||||||
| 	<li><b>documentHTML</b>: document in HTML format</li> |     <li> | ||||||
| 	<li><b>publishAttributes</b>: attributes of the publish location |         <b>documentMarkdown</b>: document in Markdown format</li> | ||||||
| 		(undefined if not publishing)</li> |     <li> | ||||||
|  |         <b>documentHTML</b>: document in HTML format</li> | ||||||
|  |     <li> | ||||||
|  |         <b>frontMatter</b>: YAML front matter object (undefined if not present)</li> | ||||||
|  |     <li> | ||||||
|  |         <b>publishAttributes</b>: attributes of the publish location (undefined if | ||||||
|  |         not publishing)</li> | ||||||
| </ul> | </ul> | ||||||
| <b>Examples:</b> | <b>Examples:</b> | ||||||
| <br /> | <br /><title><%= documentTitle %></title> | ||||||
| <title><%= documentTitle %></title> | <br /><div><%- documentHTML %></div> | ||||||
| <br /> | <br /><% | ||||||
| <div><%- documentHTML %></div> | <br />if(publishAttributes.provider.providerId == "github") print(documentMarkdown); | ||||||
| <br /> | <br | ||||||
| <%<br /> | />%> | ||||||
| if(publishAttributes.provider.providerId == "github") |  | ||||||
| print(documentMarkdown);<br /> |  | ||||||
| %> |  | ||||||
| <br /> | <br /> | ||||||
| <br /> | <br /> | ||||||
| <a target="_blank" href="http://underscorejs.org/#template">More | <a target="_blank" href="http://underscorejs.org/#template">More | ||||||
| 	info</a> | 	info</a> | ||||||
| <br /> | <br /> | ||||||
| <br /> | <br /> | ||||||
| <b class="text-danger"><i class="icon-attention"></i> Careful! Template is subject to malicious code. Don't copy/paste untrusted content.</b> | <b class="text-danger"> | ||||||
|  |     <i class="icon-attention"></i>Careful! Template is subject to malicious code. Don't copy/paste untrusted | ||||||
|  |     content.</b> | ||||||
| @ -1,4 +1,4 @@ | |||||||
| require([ | define([ | ||||||
|     "settings", |     "settings", | ||||||
|     "text!libs/mathjax_config.js" |     "text!libs/mathjax_config.js" | ||||||
| ], function(settings, mathjaxConfigJS) { | ], function(settings, mathjaxConfigJS) { | ||||||
|  | |||||||
| @ -11,8 +11,14 @@ define([ | |||||||
|         "blogger-url" |         "blogger-url" | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     bloggerProvider.publish = function(publishAttributes, title, content, callback) { |     bloggerProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         googleHelper.uploadBlogger(publishAttributes.blogUrl, publishAttributes.blogId, publishAttributes.postId, publishAttributes.labelList, title, content, function(error, blogId, postId) { |         var labelList = publishAttributes.labelList || []; | ||||||
|  |         if(frontMatter) { | ||||||
|  |             frontMatter.categories !== undefined && (labelList = frontMatter.categories); | ||||||
|  |             frontMatter.tags !== undefined && (labelList = frontMatter.tags); | ||||||
|  |         } | ||||||
|  |         _.isString(labelList) && (labelList = _.compact(labelList.split(/[\s,]/))); | ||||||
|  |         googleHelper.uploadBlogger(publishAttributes.blogUrl, publishAttributes.blogId, publishAttributes.postId, labelList, title, content, function(error, blogId, postId) { | ||||||
|             if(error) { |             if(error) { | ||||||
|                 callback(error); |                 callback(error); | ||||||
|                 return; |                 return; | ||||||
| @ -30,13 +36,6 @@ define([ | |||||||
|             publishAttributes.blogUrl = utils.checkUrl(blogUrl); |             publishAttributes.blogUrl = utils.checkUrl(blogUrl); | ||||||
|         } |         } | ||||||
|         publishAttributes.postId = utils.getInputTextValue("#input-publish-postid"); |         publishAttributes.postId = utils.getInputTextValue("#input-publish-postid"); | ||||||
|         publishAttributes.labelList = []; |  | ||||||
|         var labels = utils.getInputTextValue("#input-publish-labels"); |  | ||||||
|         if(labels !== undefined) { |  | ||||||
|             publishAttributes.labelList = _.chain(labels.split(",")).map(function(label) { |  | ||||||
|                 return utils.trim(label); |  | ||||||
|             }).compact().value(); |  | ||||||
|         } |  | ||||||
|         if(event.isPropagationStopped()) { |         if(event.isPropagationStopped()) { | ||||||
|             return undefined; |             return undefined; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -207,7 +207,7 @@ define([ | |||||||
|         }); |         }); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     dropboxProvider.publish = function(publishAttributes, title, content, callback) { |     dropboxProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         var path = checkPath(publishAttributes.path); |         var path = checkPath(publishAttributes.path); | ||||||
|         if(path === undefined) { |         if(path === undefined) { | ||||||
|             callback(true); |             callback(true); | ||||||
|  | |||||||
| @ -244,7 +244,7 @@ define([ | |||||||
|         }); |         }); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     gdriveProvider.publish = function(publishAttributes, title, content, callback) { |     gdriveProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         var contentType = publishAttributes.format != "markdown" ? 'text/html' : undefined; |         var contentType = publishAttributes.format != "markdown" ? 'text/html' : undefined; | ||||||
|         googleHelper.upload(publishAttributes.id, undefined, publishAttributes.fileName || title, content, contentType, undefined, function(error, result) { |         googleHelper.upload(publishAttributes.id, undefined, publishAttributes.fileName || title, content, contentType, undefined, function(error, result) { | ||||||
|             if(error) { |             if(error) { | ||||||
| @ -433,7 +433,7 @@ define([ | |||||||
|         }, function(err) { |         }, function(err) { | ||||||
|             console.error(err); |             console.error(err); | ||||||
|             if(err.type == "token_refresh_required") { |             if(err.type == "token_refresh_required") { | ||||||
|                 googleHelper.forceAuthenticate(); |                 googleHelper.forceGdriveAuthenticate(); | ||||||
|             } |             } | ||||||
|             else if(err.type == "not_found") { |             else if(err.type == "not_found") { | ||||||
|                 eventMgr.onError('"' + fileDesc.title + '" has been removed from Google Drive.'); |                 eventMgr.onError('"' + fileDesc.title + '" has been removed from Google Drive.'); | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ define([ | |||||||
|         "filename" |         "filename" | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     gistProvider.publish = function(publishAttributes, title, content, callback) { |     gistProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         githubHelper.uploadGist(publishAttributes.gistId, publishAttributes.filename, publishAttributes.isPublic, title, content, function(error, gistId) { |         githubHelper.uploadGist(publishAttributes.gistId, publishAttributes.filename, publishAttributes.isPublic, title, content, function(error, gistId) { | ||||||
|             if(error) { |             if(error) { | ||||||
|                 callback(error); |                 callback(error); | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ define([ | |||||||
|         "github-branch" |         "github-branch" | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     githubProvider.publish = function(publishAttributes, title, content, callback) { |     githubProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         var commitMsg = settings.commitMsg; |         var commitMsg = settings.commitMsg; | ||||||
|         githubHelper.upload(publishAttributes.repository, publishAttributes.username, publishAttributes.branch, publishAttributes.path, content, commitMsg, callback); |         githubHelper.upload(publishAttributes.repository, publishAttributes.username, publishAttributes.branch, publishAttributes.path, content, commitMsg, callback); | ||||||
|     }; |     }; | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ define([ | |||||||
|         "ssh-password" |         "ssh-password" | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     sshProvider.publish = function(publishAttributes, title, content, callback) { |     sshProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         sshHelper.upload(publishAttributes.host, publishAttributes.port, publishAttributes.username, publishAttributes.password, publishAttributes.path, title, content, callback); |         sshHelper.upload(publishAttributes.host, publishAttributes.port, publishAttributes.username, publishAttributes.password, publishAttributes.path, title, content, callback); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,16 +1,23 @@ | |||||||
| define([ | define([ | ||||||
|  |     "underscore", | ||||||
|     "utils", |     "utils", | ||||||
|     "classes/Provider", |     "classes/Provider", | ||||||
|     "helpers/tumblrHelper" |     "helpers/tumblrHelper" | ||||||
| ], function(utils, Provider, tumblrHelper) { | ], function(_, utils, Provider, tumblrHelper) { | ||||||
| 
 | 
 | ||||||
|     var tumblrProvider = new Provider("tumblr", "Tumblr"); |     var tumblrProvider = new Provider("tumblr", "Tumblr"); | ||||||
|     tumblrProvider.publishPreferencesInputIds = [ |     tumblrProvider.publishPreferencesInputIds = [ | ||||||
|         "tumblr-hostname" |         "tumblr-hostname" | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     tumblrProvider.publish = function(publishAttributes, title, content, callback) { |     tumblrProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         tumblrHelper.upload(publishAttributes.blogHostname, publishAttributes.postId, publishAttributes.tags, publishAttributes.format == "markdown" ? "markdown" : "html", title, content, function(error, postId) { |         var labelList = publishAttributes.tags || []; | ||||||
|  |         if(frontMatter) { | ||||||
|  |             frontMatter.categories !== undefined && (labelList = frontMatter.categories); | ||||||
|  |             frontMatter.tags !== undefined && (labelList = frontMatter.tags); | ||||||
|  |         } | ||||||
|  |         _.isString(labelList) && (labelList = _.compact(labelList.split(/[\s,]/))); | ||||||
|  |         tumblrHelper.upload(publishAttributes.blogHostname, publishAttributes.postId, labelList.join(','), publishAttributes.format == "markdown" ? "markdown" : "html", title, content, function(error, postId) { | ||||||
|             if(error) { |             if(error) { | ||||||
|                 callback(error); |                 callback(error); | ||||||
|                 return; |                 return; | ||||||
| @ -24,7 +31,6 @@ define([ | |||||||
|         var publishAttributes = {}; |         var publishAttributes = {}; | ||||||
|         publishAttributes.blogHostname = utils.getInputTextValue("#input-publish-tumblr-hostname", event, /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/); |         publishAttributes.blogHostname = utils.getInputTextValue("#input-publish-tumblr-hostname", event, /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/); | ||||||
|         publishAttributes.postId = utils.getInputTextValue("#input-publish-postid"); |         publishAttributes.postId = utils.getInputTextValue("#input-publish-postid"); | ||||||
|         publishAttributes.tags = utils.getInputTextValue("#input-publish-tags"); |  | ||||||
|         if(event.isPropagationStopped()) { |         if(event.isPropagationStopped()) { | ||||||
|             return undefined; |             return undefined; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,8 +1,9 @@ | |||||||
| define([ | define([ | ||||||
|  |     "underscore", | ||||||
|     "utils", |     "utils", | ||||||
|     "classes/Provider", |     "classes/Provider", | ||||||
|     "helpers/wordpressHelper" |     "helpers/wordpressHelper" | ||||||
| ], function(utils, Provider, wordpressHelper) { | ], function(_, utils, Provider, wordpressHelper) { | ||||||
| 
 | 
 | ||||||
|     var wordpressProvider = new Provider("wordpress", "WordPress"); |     var wordpressProvider = new Provider("wordpress", "WordPress"); | ||||||
|     wordpressProvider.defaultPublishFormat = "html"; |     wordpressProvider.defaultPublishFormat = "html"; | ||||||
| @ -10,8 +11,14 @@ define([ | |||||||
|         "wordpress-site" |         "wordpress-site" | ||||||
|     ]; |     ]; | ||||||
| 
 | 
 | ||||||
|     wordpressProvider.publish = function(publishAttributes, title, content, callback) { |     wordpressProvider.publish = function(publishAttributes, frontMatter, title, content, callback) { | ||||||
|         wordpressHelper.upload(publishAttributes.site, publishAttributes.postId, publishAttributes.tags, title, content, function(error, postId) { |         var labelList = publishAttributes.tags || []; | ||||||
|  |         if(frontMatter) { | ||||||
|  |             frontMatter.categories !== undefined && (labelList = frontMatter.categories); | ||||||
|  |             frontMatter.tags !== undefined && (labelList = frontMatter.tags); | ||||||
|  |         } | ||||||
|  |         _.isString(labelList) && (labelList = _.compact(labelList.split(/[\s,]/))); | ||||||
|  |         wordpressHelper.upload(publishAttributes.site, publishAttributes.postId, labelList.join(','), title, content, function(error, postId) { | ||||||
|             if(error) { |             if(error) { | ||||||
|                 callback(error); |                 callback(error); | ||||||
|                 return; |                 return; | ||||||
| @ -25,7 +32,6 @@ define([ | |||||||
|         var publishAttributes = {}; |         var publishAttributes = {}; | ||||||
|         publishAttributes.site = utils.getInputTextValue("#input-publish-wordpress-site", event, /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/); |         publishAttributes.site = utils.getInputTextValue("#input-publish-wordpress-site", event, /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/); | ||||||
|         publishAttributes.postId = utils.getInputTextValue("#input-publish-postid"); |         publishAttributes.postId = utils.getInputTextValue("#input-publish-postid"); | ||||||
|         publishAttributes.tags = utils.getInputTextValue("#input-publish-tags"); |  | ||||||
|         if(event.isPropagationStopped()) { |         if(event.isPropagationStopped()) { | ||||||
|             return undefined; |             return undefined; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -63,6 +63,7 @@ define([ | |||||||
|                 documentTitle: fileDesc.title, |                 documentTitle: fileDesc.title, | ||||||
|                 documentMarkdown: fileDesc.content, |                 documentMarkdown: fileDesc.content, | ||||||
|                 documentHTML: html, |                 documentHTML: html, | ||||||
|  |                 frontMatter: fileDesc.frontMatter, | ||||||
|                 publishAttributes: publishAttributes |                 publishAttributes: publishAttributes | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
| @ -108,9 +109,10 @@ define([ | |||||||
| 
 | 
 | ||||||
|         // Format the content
 |         // Format the content
 | ||||||
|         var content = getPublishContent(publishFileDesc, publishAttributes, publishHTML); |         var content = getPublishContent(publishFileDesc, publishAttributes, publishHTML); | ||||||
|  |         var title = (publishFileDesc.frontMatter || {}).title || publishFileDesc.title; | ||||||
| 
 | 
 | ||||||
|         // Call the provider
 |         // Call the provider
 | ||||||
|         publishAttributes.provider.publish(publishAttributes, publishFileDesc.title, content, function(error) { |         publishAttributes.provider.publish(publishAttributes, publishFileDesc.frontMatter, title, content, function(error) { | ||||||
|             if(error !== undefined) { |             if(error !== undefined) { | ||||||
|                 var errorMsg = error.toString(); |                 var errorMsg = error.toString(); | ||||||
|                 if(errorMsg.indexOf("|removePublish") !== -1) { |                 if(errorMsg.indexOf("|removePublish") !== -1) { | ||||||
| @ -178,7 +180,7 @@ define([ | |||||||
|         $(".publish-provider-name").text(provider.providerName); |         $(".publish-provider-name").text(provider.providerName); | ||||||
| 
 | 
 | ||||||
|         // Show/hide controls depending on provider
 |         // Show/hide controls depending on provider
 | ||||||
|         $('div[class*=" modal-publish-"]').hide().filter(".modal-publish-" + provider.providerId).show(); |         $('.modal-publish [class*=" modal-publish-"]').hide().filter(".modal-publish-" + provider.providerId).show(); | ||||||
| 
 | 
 | ||||||
|         // Reset fields
 |         // Reset fields
 | ||||||
|         utils.resetModalInputs(); |         utils.resetModalInputs(); | ||||||
| @ -219,7 +221,8 @@ define([ | |||||||
|         var fileDesc = fileMgr.currentFile; |         var fileDesc = fileMgr.currentFile; | ||||||
|         var html = previewHtml; |         var html = previewHtml; | ||||||
|         var content = getPublishContent(fileDesc, publishAttributes, html); |         var content = getPublishContent(fileDesc, publishAttributes, html); | ||||||
|         provider.publish(publishAttributes, fileDesc.title, content, function(error) { |         var title = (fileDesc.frontMatter && fileDesc.frontMatter.title) || fileDesc.title; | ||||||
|  |         provider.publish(publishAttributes, fileDesc.frontMatter, title, content, function(error) { | ||||||
|             if(error === undefined) { |             if(error === undefined) { | ||||||
|                 publishAttributes.provider = provider; |                 publishAttributes.provider = provider; | ||||||
|                 sharing.createLink(publishAttributes, function() { |                 sharing.createLink(publishAttributes, function() { | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ define([ | |||||||
|         maxWidth: 960, |         maxWidth: 960, | ||||||
|         defaultContent: "\n\n\n> Written with [StackEdit](" + MAIN_URL + ").", |         defaultContent: "\n\n\n> Written with [StackEdit](" + MAIN_URL + ").", | ||||||
|         commitMsg: "Published with " + MAIN_URL, |         commitMsg: "Published with " + MAIN_URL, | ||||||
|  |         gdriveFullAccess: true, | ||||||
|         template: [ |         template: [ | ||||||
|                    '<!DOCTYPE html>\n', |                    '<!DOCTYPE html>\n', | ||||||
|                    '<html>\n', |                    '<html>\n', | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ | |||||||
| @primary-bg: #ddd; | @primary-bg: #ddd; | ||||||
| @primary-bg-light: lighten(@primary-bg, 4%); | @primary-bg-light: lighten(@primary-bg, 4%); | ||||||
| @primary-bg-lighter: lighten(@primary-bg, 8%); | @primary-bg-lighter: lighten(@primary-bg, 8%); | ||||||
|  | @primary-bg-lightest: lighten(@primary-bg, 9.5%); | ||||||
| @secondary-bg: #888; | @secondary-bg: #888; | ||||||
| @secondary-bg-light: lighten(@secondary-bg, 7%); | @secondary-bg-light: lighten(@secondary-bg, 7%); | ||||||
| @secondary-bg-dark: darken(@secondary-bg, 7%); | @secondary-bg-dark: darken(@secondary-bg, 7%); | ||||||
| @ -44,7 +45,7 @@ | |||||||
| @dropdown-border: @primary-bg; | @dropdown-border: @primary-bg; | ||||||
| @pre-border-color: @primary-bg; | @pre-border-color: @primary-bg; | ||||||
| @navbar-default-bg: @primary-bg; | @navbar-default-bg: @primary-bg; | ||||||
| @nav-link-hover-bg: @primary-bg-lighter; | @nav-link-hover-bg: @primary-bg-lightest; | ||||||
| @nav-disabled-link-color: @disabled-color; | @nav-disabled-link-color: @disabled-color; | ||||||
| @nav-disabled-link-hover-color: @disabled-color; | @nav-disabled-link-hover-color: @disabled-color; | ||||||
| @nav-tabs-border-color: @transparent; | @nav-tabs-border-color: @transparent; | ||||||
| @ -55,7 +56,7 @@ | |||||||
| @list-group-link-color: @primary-color; | @list-group-link-color: @primary-color; | ||||||
| @list-group-border: @transparent; | @list-group-border: @transparent; | ||||||
| @list-group-active-bg: @dropdown-link-hover-bg; | @list-group-active-bg: @dropdown-link-hover-bg; | ||||||
| @list-group-hover-bg: @primary-bg-lighter; | @list-group-hover-bg: @primary-bg-lightest; | ||||||
| @input-color-placeholder: @disabled-color; | @input-color-placeholder: @disabled-color; | ||||||
| @btn-default-color: @primary-color; | @btn-default-color: @primary-color; | ||||||
| @btn-default-bg: @transparent; | @btn-default-bg: @transparent; | ||||||
| @ -396,6 +397,11 @@ body { | |||||||
| 		background-color: @panel-bg; | 		background-color: @panel-bg; | ||||||
| 		padding-top: 6px; | 		padding-top: 6px; | ||||||
| 		border-right: 5px solid @panel-border-color; | 		border-right: 5px solid @panel-border-color; | ||||||
|  | 		& > .nav > li > a { | ||||||
|  | 		    &:hover, &:active { | ||||||
|  |         		background-color: @panel-bg; | ||||||
|  | 		    } | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -980,7 +986,7 @@ ul,ol { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	.ace_marker-layer .ace_active-line { | 	.ace_marker-layer .ace_active-line { | ||||||
| 		background-color: @primary-bg-lighter;	 | 		background-color: @primary-bg-lightest;	 | ||||||
| 	} | 	} | ||||||
| 	 | 	 | ||||||
| 	.ace_print-margin { | 	.ace_print-margin { | ||||||
|  | |||||||
| @ -3,6 +3,7 @@ | |||||||
| @primary-bg: #444; | @primary-bg: #444; | ||||||
| @primary-bg-light: darken(@primary-bg, 7%); | @primary-bg-light: darken(@primary-bg, 7%); | ||||||
| @primary-bg-lighter: darken(@primary-bg, 13%); | @primary-bg-lighter: darken(@primary-bg, 13%); | ||||||
|  | @primary-bg-lightest: darken(@primary-bg, 15%); | ||||||
| @secondary-bg: #444; | @secondary-bg: #444; | ||||||
| @secondary-bg-light: darken(@secondary-bg, 7%); | @secondary-bg-light: darken(@secondary-bg, 7%); | ||||||
| @secondary-bg-dark: lighten(@secondary-bg, 7%); | @secondary-bg-dark: lighten(@secondary-bg, 7%); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 benweet
						benweet