diff --git a/src/ep.json b/src/ep.json index ce6d3a00f..d3dd47b6b 100644 --- a/src/ep.json +++ b/src/ep.json @@ -11,6 +11,7 @@ { "name": "webaccess", "hooks": { "expressConfigure": "ep_etherpad-lite/node/hooks/express/webaccess:expressConfigure" } }, { "name": "apicalls", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/apicalls:expressCreateServer" } }, { "name": "importexport", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/importexport:expressCreateServer" } }, + { "name": "preview", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/preview:expressCreateServer" } }, { "name": "errorhandling", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/errorhandling:expressCreateServer" } }, { "name": "socketio", "hooks": { "expressCreateServer": "ep_etherpad-lite/node/hooks/express/socketio:expressCreateServer" } }, { "name": "adminplugins", "hooks": { diff --git a/src/node/handler/PreviewHandler.js b/src/node/handler/PreviewHandler.js new file mode 100644 index 000000000..68f4782d3 --- /dev/null +++ b/src/node/handler/PreviewHandler.js @@ -0,0 +1,68 @@ +/** + * Handles the preview requests + */ + +/* + * 2011 Peter 'Pita' Martischka (Primary Technology Ltd) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS-IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var ERR = require("async-stacktrace"); +var padManager = require("../db/PadManager"); + +/** + * do a requested preview + */ + +function _cleanText(text) +{ + if (!text) + return null; + + var atext = text.split('\n'); + var clean = Array(); + for (n in atext) + { + var line = atext[n]; + + if (line[0] === "*") + line = line.substring(1); + + clean.push(line); + } + return clean.join('\n'); +} + +exports.doPreview = function(req, res, padId, type) +{ + padManager.getPad(padId, function(err, pad) + { + ERR(err); + if(type == "html") + { + res.header("Content-Type","text/html; charset=utf-8"); + if(req.params.rev){ + pad.getInternalRevisionAText(req.params.rev, function(junk, text) + { + res.write(_cleanText(text.text)); + }); + } + else + { + res.write(_cleanText(pad.text())); + } + res.end(); + } + }); +}; diff --git a/src/node/hooks/express/preview.js b/src/node/hooks/express/preview.js new file mode 100644 index 000000000..821a9a7a7 --- /dev/null +++ b/src/node/hooks/express/preview.js @@ -0,0 +1,19 @@ +var hasPadAccess = require("../../padaccess"); +var previewHandler = require('../../handler/PreviewHandler'); + +exports.expressCreateServer = function (hook_name, args, cb) { + args.app.get('/p/:pad/:rev?/preview/:type', function(req, res, next) { + var types = ['html']; + //send a 404 if we don't support this filetype + if (types.indexOf(req.params.type) == -1) { + next(); + return; + } + + res.header("Access-Control-Allow-Origin", "*"); + + hasPadAccess(req, res, function() { + previewHandler.doPreview(req, res, req.params.pad, req.params.type); + }); + }); +} diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 19180adee..454f36700 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -815,6 +815,9 @@ table#otheruserstable { .buttonicon-savedRevision { background-position: 0px -493px } +.buttonicon-preview { + background-image: url('../../static/img/preview.png'); +} #focusprotector { z-index: 100; position: absolute; diff --git a/src/static/img/preview.png b/src/static/img/preview.png new file mode 100644 index 000000000..008d229cc Binary files /dev/null and b/src/static/img/preview.png differ diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index af2bc40ad..9718ca163 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -98,6 +98,11 @@ var padeditbar = (function() init: function() { var self = this; + //get /p/padname + var pad_root_path = new RegExp(/.*\/p\/[^\/]+/).exec(document.location.pathname) + //get http://example.com/p/padname + var pad_root_url = document.location.href.replace(document.location.pathname, pad_root_path) + $("#editbar .editbarbutton").attr("unselectable", "on"); // for IE $("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar"); $("#editbar [data-key]").each(function (i, e) { @@ -106,6 +111,7 @@ var padeditbar = (function() event.preventDefault(); }); }); + $("#previewhtmllink").attr("href", pad_root_url + "/preview/html"); }, isEnabled: function() { diff --git a/src/templates/pad.html b/src/templates/pad.html index 02af9b107..b1bee7982 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -108,8 +108,13 @@
+