diff --git a/src/static/font/config.json b/src/static/font/config.json index f9c2c3d6551..e5bc2960cf9 100644 --- a/src/static/font/config.json +++ b/src/static/font/config.json @@ -347,6 +347,18 @@ "css": "slideshare", "code": 59441, "src": "fontawesome" + }, + { + "uid": "e4dde1992f787163e2e2b534b8c8067d", + "css": "angle-down", + "code": 61703, + "src": "fontawesome" + }, + { + "uid": "ccddff8e8670dcd130e3cb55fdfc2fd0", + "css": "down-open", + "code": 59449, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/src/static/font/fontawesome-etherpad.eot b/src/static/font/fontawesome-etherpad.eot index 284149e2ba8..fbdb409479f 100644 Binary files a/src/static/font/fontawesome-etherpad.eot and b/src/static/font/fontawesome-etherpad.eot differ diff --git a/src/static/font/fontawesome-etherpad.svg b/src/static/font/fontawesome-etherpad.svg index a64ba864e68..f0c7fd456f4 100644 --- a/src/static/font/fontawesome-etherpad.svg +++ b/src/static/font/fontawesome-etherpad.svg @@ -1,68 +1,128 @@ \ No newline at end of file diff --git a/src/static/font/fontawesome-etherpad.ttf b/src/static/font/fontawesome-etherpad.ttf index f596b4fe672..5a779fa2468 100644 Binary files a/src/static/font/fontawesome-etherpad.ttf and b/src/static/font/fontawesome-etherpad.ttf differ diff --git a/src/static/font/fontawesome-etherpad.woff b/src/static/font/fontawesome-etherpad.woff index ebca7fffa26..2b866808613 100644 Binary files a/src/static/font/fontawesome-etherpad.woff and b/src/static/font/fontawesome-etherpad.woff differ diff --git a/src/static/js/broadcast.js b/src/static/js/broadcast.js index 817155b5583..98d0b01b876 100644 --- a/src/static/js/broadcast.js +++ b/src/static/js/broadcast.js @@ -336,6 +336,11 @@ function loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, Bro var self = this; var path = revisionInfo.getPath(padContents.currentRevision, newRevision); debugLog('newRev: ', padContents.currentRevision, path); + + hooks.aCallAll('goToRevisionEvent', { + rev: newRevision + }); + if (path.status == 'complete') { var cs = path.changesets; diff --git a/src/static/js/pluginfw/plugins.js b/src/static/js/pluginfw/plugins.js index 7cb4b1bdc1c..3018ff78640 100644 --- a/src/static/js/pluginfw/plugins.js +++ b/src/static/js/pluginfw/plugins.js @@ -155,15 +155,138 @@ function loadPlugin(packages, plugin_name, plugins, parts, cb) { ); } +var matcher = function (name, list) { + var matches = []; + try { + var nameRegExp = RegExp(name); + + list.forEach(function (item) { + if (nameRegExp.test(item)) { + matches.push(item); + } + }); + } catch(e) { + console.log('ERROR', e); + } + + + return matches; +} + +function conflictMatcher (parts, name, type) { + var type; + var opposite = 'pre'; + var results = []; + if (type === 'pre') { + opposite = 'post'; + } + _.each(parts[name][type] || [], function (item_name) { + var conflictMatches = matcher(item_name, parts[name][opposite] || []); + if(conflictMatches.length) { + var matchObj = {}; + matchObj[item_name] = conflictMatches; + results.push(matchObj); + } + }); + + return results; +} + +function checkPluginConflicts(parts) { + var conflicts = []; + + _.chain(parts).keys().forEach(function (name) { + var conflictObj = {}; + var conflictsPre = conflictMatcher(parts, name, 'pre'); + var conflictsPost = conflictMatcher(parts, name, 'post'); + + conflictObj[name] = {pre: conflictsPre, post: conflictsPost}; + conflicts.push(conflictObj); + }); + + return conflicts; +} +function closedChainChecker (parts, name, match, matchCount, res) { + var noChain = true; + for (var i = 0; i < res.length; i++ ) { + var item = res[i]; + + if (item[0] === name || item[1] === name) { + if (item[0] === match || item[1] === match) { + //value allready exists + noChain = false; + // check which plugins has stricter pre/post definition + _.each(parts[match].pre || [], function (item_name) { + var matches = matcher(item_name, _.chain(parts).keys().value()); + if (matches.length > matchCount) { + res.splice(i, 1); + noChain = true; + } + }); + _.each(parts[match].post || [], function (item_name) { + var matches = matcher(item_name, _.chain(parts).keys().value()); + if (matches.length > matchCount) { + res.splice(i, 1); + noChain = true; + } + }); + + i = res.length; + break; + } + } + } + + return noChain; +} + +function matchHooks (parts, name, res, conflicts, type) { + var names = _.chain(parts).keys().value(); + _.each(parts[name][type], function (item_name) { + var matchedNames = matcher(item_name, names); + _.each(matchedNames, function (matchName) { + if (name !== matchName) { + var noConflict = true; + + if (conflicts) { + _.each(conflicts, function (conflictObject) { + if (conflictObject[item_name] && (conflictObject[item_name].matches && conflictObject[item_name].matches.indexOf(matchName) > -1)) { + noConflict = false; + } + }) + } + if (noConflict) { + noConflict = closedChainChecker(parts, name, matchName, matchedNames.length, res); + } + + if (noConflict && type === 'post') { + res.push([name, matchName]); + } else if (noConflict){ + res.push([matchName, name]); + } + } + }); + }); +} + function partsToParentChildList(parts) { var res = []; + + var conflicts = checkPluginConflicts(parts); _.chain(parts).keys().forEach(function (name) { - _.each(parts[name].post || [], function (child_name) { - res.push([name, child_name]); - }); - _.each(parts[name].pre || [], function (parent_name) { - res.push([parent_name, name]); - }); + var conflictsPre = []; + var conflictsPost = []; + for (var i=0; i < conflicts.length; i++) { + if (conflicts[i][name]) { + conflictsPre = conflicts[i][name].pre; + conflictsPost = conflicts[i][name].post; + i = conflicts.length; + break; + } + } + matchHooks(parts, name, res, conflictsPost, 'post'); + matchHooks(parts, name, res, conflictsPre, 'pre'); + if (!parts[name].pre && !parts[name].post) { res.push([name, ":" + name]); // Include apps with no dependency info } diff --git a/tests/backend/specs/api/pad.js b/tests/backend/specs/api/pad.js index 2a613ebf099..2a5a29a55d3 100644 --- a/tests/backend/specs/api/pad.js +++ b/tests/backend/specs/api/pad.js @@ -14,8 +14,9 @@ var apiVersion = 1; var testPadId = makeid(); var lastEdited = ""; var text = generateLongText(); -var ULhtml = '