提交 1f322fe2 编写于 作者: Y youyong205

add the js

......@@ -2,6 +2,7 @@ package com.dianping.cat.consumer.storage;
import com.dianping.cat.consumer.storage.model.entity.Operation;
import com.dianping.cat.consumer.storage.model.entity.Segment;
import com.dianping.cat.consumer.storage.model.entity.Sql;
import com.dianping.cat.consumer.storage.model.entity.StorageReport;
import com.dianping.cat.consumer.storage.model.transform.DefaultMerger;
......@@ -28,4 +29,11 @@ public class StorageReportMerger extends DefaultMerger {
to.setSum(to.getSum() + from.getSum());
to.setAvg(to.getSum() / to.getCount());
}
@Override
protected void mergeSql(Sql to, Sql from) {
to.setId(from.getId());
to.setCount(to.getCount() + from.getCount());
to.setStatement(from.getStatement());
}
}
......@@ -220,6 +220,8 @@ public class Handler implements PageHandler<Context> {
switch (payload.getAction()) {
case HOURLY_STORAGE:
storageReport = queryHourlyReport(payload);
model.setOriginalReport(storageReport);
rawReport = filterReport(payload, model, storageReport);
storageReport = mergeReport(payload, rawReport);
......@@ -241,6 +243,8 @@ public class Handler implements PageHandler<Context> {
break;
case HISTORY_STORAGE:
storageReport = queryHistoryReport(payload);
model.setOriginalReport(storageReport);
rawReport = filterReport(payload, model, storageReport);
storageReport = mergeReport(payload, rawReport);
......
......@@ -26,6 +26,8 @@ import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager.Dep
public class Model extends AbstractReportModel<Action, ReportPage, Context> {
@EntityMeta
private StorageReport m_originalReport;
private StorageReport m_report;
private Set<String> m_operations = new HashSet<String>();
......@@ -58,14 +60,6 @@ public class Model extends AbstractReportModel<Action, ReportPage, Context> {
private String m_distributionChart;
public String getDistributionChart() {
return m_distributionChart;
}
public void setDistributionChart(String distributionChart) {
m_distributionChart = distributionChart;
}
public Model(Context ctx) {
super(ctx);
}
......@@ -106,6 +100,10 @@ public class Model extends AbstractReportModel<Action, ReportPage, Context> {
return m_departments;
}
public String getDistributionChart() {
return m_distributionChart;
}
@Override
public String getDomain() {
return getDisplayDomain();
......@@ -168,6 +166,10 @@ public class Model extends AbstractReportModel<Action, ReportPage, Context> {
return operations;
}
public StorageReport getOriginalReport() {
return m_originalReport;
}
public StorageReport getReport() {
return m_report;
}
......@@ -200,6 +202,10 @@ public class Model extends AbstractReportModel<Action, ReportPage, Context> {
m_departments = departments;
}
public void setDistributionChart(String distributionChart) {
m_distributionChart = distributionChart;
}
public void setErrorTrend(String errorTrend) {
m_errorTrend = errorTrend;
}
......@@ -228,6 +234,10 @@ public class Model extends AbstractReportModel<Action, ReportPage, Context> {
m_operations = operations;
}
public void setOriginalReport(StorageReport originalReport) {
m_originalReport = originalReport;
}
public void setReport(StorageReport report) {
m_report = report;
}
......
package com.dianping.cat.system.page.config;
public class ConfigHtmlParser {
public String parse(String content) {
content = content.replaceAll("<", "&lt;");
content = content.replaceAll(">", "&gt;");
return content;
}
}
......@@ -6,6 +6,7 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.report.alert.sender.config.AlertConfigManager;
import com.dianping.cat.report.alert.sender.config.AlertPolicyManager;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
......@@ -16,9 +17,12 @@ public class AlertConfigProcessor {
@Inject
private AlertPolicyManager m_alertPolicyManager;
public void process(Action action,Payload payload,Model model){
switch(action){
@Inject
private ConfigHtmlParser m_configHtmlParser;
public void process(Action action, Payload payload, Model model) {
switch (action) {
case ALERT_DEFAULT_RECEIVERS:
String alertDefaultReceivers = payload.getContent();
String allOnOrOff = payload.getAllOnOrOff();
......@@ -29,7 +33,7 @@ public class AlertConfigProcessor {
} else {
model.setOpState(true);
}
model.setContent(m_alertConfigManager.getAlertConfig().toString());
model.setContent(m_configHtmlParser.parse(m_alertConfigManager.getAlertConfig().toString()));
break;
case ALERT_POLICY:
String alertPolicy = payload.getContent();
......@@ -39,7 +43,7 @@ public class AlertConfigProcessor {
} else {
model.setOpState(true);
}
model.setContent(m_alertPolicyManager.getAlertPolicy().toString());
model.setContent(m_configHtmlParser.parse(m_alertPolicyManager.getAlertPolicy().toString()));
break;
default:
throw new RuntimeException("Error action name " + action.getName());
......
......@@ -32,6 +32,7 @@ import com.dianping.cat.helper.TimeHelper;
import com.dianping.cat.report.alert.app.AppRuleConfigManager;
import com.dianping.cat.report.page.event.service.EventReportService;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
......@@ -55,6 +56,9 @@ public class AppConfigProcessor extends BaseProcesser implements Initializable {
@Inject
private CommandFormatConfigManager m_urlConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
private Set<String> m_invalids = new HashSet<String>();
public void appRuleBatchUpdate(Payload payload, Model model) {
......@@ -317,7 +321,7 @@ public class AppConfigProcessor extends BaseProcesser implements Initializable {
if (!StringUtils.isEmpty(appConfig)) {
model.setOpState(m_appConfigManager.insert(appConfig));
}
model.setContent(m_appConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_appConfigManager.getConfig().toString()));
break;
case APP_RULE:
buildAppConfigInfo(m_appConfigManager, model);
......@@ -342,7 +346,7 @@ public class AppConfigProcessor extends BaseProcesser implements Initializable {
if (!StringUtils.isEmpty(appComparisonConfig)) {
model.setOpState(m_appComparisonConfigManager.insert(appComparisonConfig));
}
model.setContent(m_appComparisonConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_appComparisonConfigManager.getConfig().toString()));
break;
case APP_RULE_BATCH_UPDATE:
appRuleBatchUpdate(payload, model);
......@@ -376,7 +380,7 @@ public class AppConfigProcessor extends BaseProcesser implements Initializable {
if (StringUtils.isNotEmpty(content)) {
m_urlConfigManager.insert(content);
}
model.setContent(m_urlConfigManager.getUrlFormat().toString());
model.setContent(m_configHtmlParser.parse(m_urlConfigManager.getUrlFormat().toString()));
break;
default:
throw new RuntimeException("Error action name " + action.getName());
......
......@@ -6,6 +6,7 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.report.page.activity.config.ActivityConfigManager;
import com.dianping.cat.report.page.heartbeat.config.HeartbeatDisplayPolicyManager;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
......@@ -13,10 +14,13 @@ public class DisplayConfigProcessor {
@Inject
private HeartbeatDisplayPolicyManager m_displayPolicyManager;
@Inject
private ActivityConfigManager m_activityConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
public void process(Action action, Payload payload, Model model) {
switch (action) {
case DISPLAY_POLICY:
......@@ -27,9 +31,9 @@ public class DisplayConfigProcessor {
} else {
model.setOpState(true);
}
model.setContent(m_displayPolicyManager.getHeartbeatDisplayPolicy().toString());
model.setContent(m_configHtmlParser.parse(m_displayPolicyManager.getHeartbeatDisplayPolicy().toString()));
break;
case ACTIVITY_CONFIG_UPDATE:
String activityConfig = payload.getContent();
......@@ -38,7 +42,7 @@ public class DisplayConfigProcessor {
} else {
model.setOpState(true);
}
model.setContent(m_activityConfigManager.getActivityConfig().toString());
model.setContent(m_configHtmlParser.parse(m_activityConfigManager.getActivityConfig().toString()));
break;
default:
throw new RuntimeException("Error action name " + action.getName());
......
......@@ -21,6 +21,7 @@ import com.dianping.cat.report.page.statistics.config.BugConfigManager;
import com.dianping.cat.report.page.storage.config.StorageGroupConfigManager;
import com.dianping.cat.service.ProjectService;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
import com.dianping.cat.system.page.router.config.RouterConfigManager;
......@@ -50,10 +51,13 @@ public class GlobalConfigProcessor {
@Inject
private ServerFilterConfigManager m_serverFilterConfigManager;
@Inject
private AllReportConfigManager m_transactionConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
private boolean deleteProject(Payload payload) {
Project proto = new Project();
int id = payload.getProjectId();
......@@ -122,21 +126,21 @@ public class GlobalConfigProcessor {
} else {
model.setOpState(true);
}
model.setBug(m_bugConfigManager.getBugConfig().toString());
model.setBug(m_configHtmlParser.parse(m_bugConfigManager.getBugConfig().toString()));
break;
case ROUTER_CONFIG_UPDATE:
String routerConfig = payload.getContent();
if (!StringUtils.isEmpty(routerConfig)) {
model.setOpState(m_routerConfigManager.insert(routerConfig));
}
model.setContent(m_routerConfigManager.getRouterConfig().toString());
model.setContent(m_configHtmlParser.parse(m_routerConfigManager.getRouterConfig().toString()));
break;
case ALERT_SENDER_CONFIG_UPDATE:
String senderConfig = payload.getContent();
if (!StringUtils.isEmpty(senderConfig)) {
model.setOpState(m_senderConfigManager.insert(senderConfig));
}
model.setContent(m_senderConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_senderConfigManager.getConfig().toString()));
break;
case BLACK_CONFIG_UPDATE:
String blackConfig = payload.getContent();
......@@ -146,28 +150,28 @@ public class GlobalConfigProcessor {
} else {
model.setOpState(true);
}
model.setContent(m_blackListManager.getBlackList().toString());
model.setContent(m_configHtmlParser.parse(m_blackListManager.getBlackList().toString()));
break;
case STORAGE_GROUP_CONFIG_UPDATE:
String storageGroup = payload.getContent();
if (!StringUtils.isEmpty(storageGroup)) {
model.setOpState(m_groupConfigManager.insert(storageGroup));
}
model.setContent(m_groupConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_groupConfigManager.getConfig().toString()));
break;
case SERVER_FILTER_CONFIG_UPDATE:
String serverConfig = payload.getContent();
if (!StringUtils.isEmpty(serverConfig)) {
model.setOpState(m_serverFilterConfigManager.insert(serverConfig));
}
model.setContent(m_serverFilterConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_serverFilterConfigManager.getConfig().toString()));
break;
case ALL_REPORT_CONFIG:
String transactionConfig = payload.getContent();
if (!StringUtils.isEmpty(transactionConfig)) {
model.setOpState(m_transactionConfigManager.insert(transactionConfig));
}
model.setContent(m_transactionConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_transactionConfigManager.getConfig().toString()));
break;
default:
break;
......
......@@ -19,6 +19,7 @@ import com.dianping.cat.home.rule.entity.Rule;
import com.dianping.cat.home.rule.transform.DefaultJsonBuilder;
import com.dianping.cat.report.alert.business.BusinessRuleConfigManager;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
......@@ -36,6 +37,9 @@ public class MetricConfigProcessor extends BaseProcesser {
@Inject
private BusinessRuleConfigManager m_businessRuleConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
private void metricConfigAdd(Payload payload, Model model) {
String key = m_metricConfigManager.buildMetricKey(payload.getDomain(), payload.getType(), payload.getMetricKey());
......@@ -76,12 +80,12 @@ public class MetricConfigProcessor extends BaseProcesser {
knowDomains.addAll(domains);
}
for (Entry<String, ProductLine> entry : productLines.entrySet()) {
payload.setProductLineName(entry.getKey());
break;
}
List<MetricItemConfig> otherConfigs = new ArrayList<MetricItemConfig>();
for (MetricItemConfig config : m_metricConfigManager.getMetricConfig().getMetricItemConfigs().values()) {
......@@ -160,7 +164,7 @@ public class MetricConfigProcessor extends BaseProcesser {
} else {
model.setOpState(true);
}
model.setContent(m_businessRuleConfigManager.getMonitorRules().toString());
model.setContent(m_configHtmlParser.parse(m_businessRuleConfigManager.getMonitorRules().toString()));
break;
default:
throw new RuntimeException("Error action name " + action.getName());
......
......@@ -6,17 +6,21 @@ import org.unidal.lookup.annotation.Inject;
import com.dianping.cat.report.alert.network.NetworkRuleConfigManager;
import com.dianping.cat.report.page.network.config.NetGraphConfigManager;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
public class NetworkConfigProcessor extends BaseProcesser {
@Inject
private NetworkRuleConfigManager m_networkRuleConfigManager;
@Inject
private NetGraphConfigManager m_netGraphConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
public void process(Action action, Payload payload, Model model) {
switch (action) {
......@@ -40,7 +44,7 @@ public class NetworkConfigProcessor extends BaseProcesser {
if (!StringUtils.isEmpty(netGraphConfig)) {
model.setOpState(m_netGraphConfigManager.insert(netGraphConfig));
}
model.setContent(m_netGraphConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_netGraphConfigManager.getConfig().toString()));
break;
default:
......
......@@ -12,6 +12,7 @@ import com.dianping.cat.home.dependency.config.entity.EdgeConfig;
import com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager;
import com.dianping.cat.report.page.dependency.graph.TopologyGraphConfigManager;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
......@@ -29,6 +30,9 @@ public class TopologyConfigProcessor {
@Inject
private TopoGraphFormatConfigManager m_formatConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
private void graphEdgeConfigAdd(Payload payload, Model model) {
String type = payload.getType();
String from = payload.getFrom();
......@@ -161,7 +165,7 @@ public class TopologyConfigProcessor {
if (!StringUtils.isEmpty(topoGraphFormat)) {
model.setOpState(m_formatConfigManager.insert(topoGraphFormat));
}
model.setContent(m_formatConfigManager.getConfig().toString());
model.setContent(m_configHtmlParser.parse(m_formatConfigManager.getConfig().toString()));
break;
default:
throw new RuntimeException("Error action name " + action.getName());
......
......@@ -14,6 +14,7 @@ import com.dianping.cat.configuration.web.url.entity.PatternItem;
import com.dianping.cat.report.alert.web.WebRuleConfigManager;
import com.dianping.cat.report.page.web.CityManager;
import com.dianping.cat.system.page.config.Action;
import com.dianping.cat.system.page.config.ConfigHtmlParser;
import com.dianping.cat.system.page.config.Model;
import com.dianping.cat.system.page.config.Payload;
......@@ -34,6 +35,9 @@ public class WebConfigProcessor extends BaseProcesser {
@Inject
private AppConfigManager m_appConfigManager;
@Inject
private ConfigHtmlParser m_configHtmlParser;
private void buildWebConfigInfo(Model model) {
Map<Integer, PatternItem> patterns = m_urlPatternConfigManager.getId2Items();
......@@ -69,7 +73,7 @@ public class WebConfigProcessor extends BaseProcesser {
if (!StringUtils.isEmpty(config)) {
model.setOpState(m_urlPatternConfigManager.insert(config));
}
model.setContent(m_urlPatternConfigManager.getUrlPattern().toString());
model.setContent(m_configHtmlParser.parse(m_urlPatternConfigManager.getUrlPattern().toString()));
break;
case URL_PATTERN_ALL:
model.setPatternItems(m_urlPatternConfigManager.getId2Items());
......
......@@ -6054,6 +6054,9 @@
<requirement>
<role>com.dianping.cat.consumer.config.AllReportConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
</requirements>
</component>
<component>
......@@ -6080,6 +6083,10 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
<implementation>com.dianping.cat.system.page.config.ConfigHtmlParser</implementation>
</component>
<component>
<role>com.dianping.cat.system.page.config.processor.ThirdPartyConfigProcessor</role>
<implementation>com.dianping.cat.system.page.config.processor.ThirdPartyConfigProcessor</implementation>
......@@ -6120,6 +6127,9 @@
<requirement>
<role>com.dianping.cat.config.app.AppConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.alert.RuleFTLDecorator</role>
</requirement>
......@@ -6175,6 +6185,9 @@
<requirement>
<role>com.dianping.cat.report.page.dependency.config.TopoGraphFormatConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
</requirements>
</component>
<component>
......@@ -6193,6 +6206,9 @@
<requirement>
<role>com.dianping.cat.report.alert.business.BusinessRuleConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.alert.RuleFTLDecorator</role>
</requirement>
......@@ -6241,6 +6257,9 @@
<requirement>
<role>com.dianping.cat.report.page.network.config.NetGraphConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.alert.RuleFTLDecorator</role>
</requirement>
......@@ -6367,6 +6386,9 @@
<requirement>
<role>com.dianping.cat.config.app.command.CommandFormatConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
<requirement>
<role>com.dianping.cat.report.alert.RuleFTLDecorator</role>
</requirement>
......@@ -6409,6 +6431,9 @@
<requirement>
<role>com.dianping.cat.report.alert.sender.config.AlertPolicyManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
</requirements>
</component>
<component>
......@@ -6517,6 +6542,9 @@
<requirement>
<role>com.dianping.cat.report.page.activity.config.ActivityConfigManager</role>
</requirement>
<requirement>
<role>com.dianping.cat.system.page.config.ConfigHtmlParser</role>
</requirement>
</requirements>
</component>
<component>
......
此差异已折叠。
define("ace/ext/beautify/php_rules",["require","exports","module","ace/token_iterator"], function(require, exports, module) {
"use strict";
var TokenIterator = require("ace/token_iterator").TokenIterator;
exports.newLines = [{
type: 'support.php_tag',
value: '<?php'
}, {
type: 'support.php_tag',
value: '<?'
}, {
type: 'support.php_tag',
value: '?>'
}, {
type: 'paren.lparen',
value: '{',
indent: true
}, {
type: 'paren.rparen',
breakBefore: true,
value: '}',
indent: false
}, {
type: 'paren.rparen',
breakBefore: true,
value: '})',
indent: false,
dontBreak: true
}, {
type: 'comment'
}, {
type: 'text',
value: ';'
}, {
type: 'text',
value: ':',
context: 'php'
}, {
type: 'keyword',
value: 'case',
indent: true,
dontBreak: true
}, {
type: 'keyword',
value: 'default',
indent: true,
dontBreak: true
}, {
type: 'keyword',
value: 'break',
indent: false,
dontBreak: true
}, {
type: 'punctuation.doctype.end',
value: '>'
}, {
type: 'meta.tag.punctuation.end',
value: '>'
}, {
type: 'meta.tag.punctuation.begin',
value: '<',
blockTag: true,
indent: true,
dontBreak: true
}, {
type: 'meta.tag.punctuation.begin',
value: '</',
indent: false,
breakBefore: true,
dontBreak: true
}, {
type: 'punctuation.operator',
value: ';'
}];
exports.spaces = [{
type: 'xml-pe',
prepend: true
},{
type: 'entity.other.attribute-name',
prepend: true
}, {
type: 'storage.type',
value: 'var',
append: true
}, {
type: 'storage.type',
value: 'function',
append: true
}, {
type: 'keyword.operator',
value: '='
}, {
type: 'keyword',
value: 'as',
prepend: true,
append: true
}, {
type: 'keyword',
value: 'function',
append: true
}, {
type: 'support.function',
next: /[^\(]/,
append: true
}, {
type: 'keyword',
value: 'or',
append: true,
prepend: true
}, {
type: 'keyword',
value: 'and',
append: true,
prepend: true
}, {
type: 'keyword',
value: 'case',
append: true
}, {
type: 'keyword.operator',
value: '||',
append: true,
prepend: true
}, {
type: 'keyword.operator',
value: '&&',
append: true,
prepend: true
}];
exports.singleTags = ['!doctype','area','base','br','hr','input','img','link','meta'];
exports.transform = function(iterator, maxPos, context) {
var token = iterator.getCurrentToken();
var newLines = exports.newLines;
var spaces = exports.spaces;
var singleTags = exports.singleTags;
var code = '';
var indentation = 0;
var dontBreak = false;
var tag;
var lastTag;
var lastToken = {};
var nextTag;
var nextToken = {};
var breakAdded = false;
var value = '';
while (token!==null) {
console.log(token);
if( !token ){
token = iterator.stepForward();
continue;
}
if( token.type == 'support.php_tag' && token.value != '?>' ){
context = 'php';
}
else if( token.type == 'support.php_tag' && token.value == '?>' ){
context = 'html';
}
else if( token.type == 'meta.tag.name.style' && context != 'css' ){
context = 'css';
}
else if( token.type == 'meta.tag.name.style' && context == 'css' ){
context = 'html';
}
else if( token.type == 'meta.tag.name.script' && context != 'js' ){
context = 'js';
}
else if( token.type == 'meta.tag.name.script' && context == 'js' ){
context = 'html';
}
nextToken = iterator.stepForward();
if (nextToken && nextToken.type.indexOf('meta.tag.name') == 0) {
nextTag = nextToken.value;
}
if ( lastToken.type == 'support.php_tag' && lastToken.value == '<?=') {
dontBreak = true;
}
if (token.type == 'meta.tag.name') {
token.value = token.value.toLowerCase();
}
if (token.type == 'text') {
token.value = token.value.trim();
}
if (!token.value) {
token = nextToken;
continue;
}
value = token.value;
for (var i in spaces) {
if (
token.type == spaces[i].type &&
(!spaces[i].value || token.value == spaces[i].value) &&
(
nextToken &&
(!spaces[i].next || spaces[i].next.test(nextToken.value))
)
) {
if (spaces[i].prepend) {
value = ' ' + token.value;
}
if (spaces[i].append) {
value += ' ';
}
}
}
if (token.type.indexOf('meta.tag.name') == 0) {
tag = token.value;
}
breakAdded = false;
for (i in newLines) {
if (
token.type == newLines[i].type &&
(
!newLines[i].value ||
token.value == newLines[i].value
) &&
(
!newLines[i].blockTag ||
singleTags.indexOf(nextTag) === -1
) &&
(
!newLines[i].context ||
newLines[i].context === context
)
) {
if (newLines[i].indent === false) {
indentation--;
}
if (
newLines[i].breakBefore &&
( !newLines[i].prev || newLines[i].prev.test(lastToken.value) )
) {
code += "\n";
breakAdded = true;
for (i = 0; i < indentation; i++) {
code += "\t";
}
}
break;
}
}
if (dontBreak===false) {
for (i in newLines) {
if (
lastToken.type == newLines[i].type &&
(
!newLines[i].value || lastToken.value == newLines[i].value
) &&
(
!newLines[i].blockTag ||
singleTags.indexOf(tag) === -1
) &&
(
!newLines[i].context ||
newLines[i].context === context
)
) {
if (newLines[i].indent === true) {
indentation++;
}
if (!newLines[i].dontBreak && !breakAdded) {
code += "\n";
for (i = 0; i < indentation; i++) {
code += "\t";
}
}
break;
}
}
}
code += value;
if ( lastToken.type == 'support.php_tag' && lastToken.value == '?>' ) {
dontBreak = false;
}
lastTag = tag;
lastToken = token;
token = nextToken;
if (token===null) {
break;
}
}
return code;
};
});
define("ace/ext/beautify",["require","exports","module","ace/token_iterator","ace/ext/beautify/php_rules"], function(require, exports, module) {
"use strict";
var TokenIterator = require("ace/token_iterator").TokenIterator;
var phpTransform = require("./beautify/php_rules").transform;
exports.beautify = function(session) {
var iterator = new TokenIterator(session, 0, 0);
var token = iterator.getCurrentToken();
var context = session.$modeId.split("/").pop();
var code = phpTransform(iterator, context);
session.doc.setValue(code);
};
exports.commands = [{
name: "beautify",
exec: function(editor) {
exports.beautify(editor.session);
},
bindKey: "Ctrl-Shift-B"
}]
});
(function() {
window.require(["ace/ext/beautify"], function() {});
})();
\ No newline at end of file
define("ace/ext/chromevox",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) {
var cvoxAce = {};
cvoxAce.SpeechProperty;
cvoxAce.Cursor;
cvoxAce.Token;
cvoxAce.Annotation;
var CONSTANT_PROP = {
'rate': 0.8,
'pitch': 0.4,
'volume': 0.9
};
var DEFAULT_PROP = {
'rate': 1,
'pitch': 0.5,
'volume': 0.9
};
var ENTITY_PROP = {
'rate': 0.8,
'pitch': 0.8,
'volume': 0.9
};
var KEYWORD_PROP = {
'rate': 0.8,
'pitch': 0.3,
'volume': 0.9
};
var STORAGE_PROP = {
'rate': 0.8,
'pitch': 0.7,
'volume': 0.9
};
var VARIABLE_PROP = {
'rate': 0.8,
'pitch': 0.8,
'volume': 0.9
};
var DELETED_PROP = {
'punctuationEcho': 'none',
'relativePitch': -0.6
};
var ERROR_EARCON = 'ALERT_NONMODAL';
var MODE_SWITCH_EARCON = 'ALERT_MODAL';
var NO_MATCH_EARCON = 'INVALID_KEYPRESS';
var INSERT_MODE_STATE = 'insertMode';
var COMMAND_MODE_STATE = 'start';
var REPLACE_LIST = [
{
substr: ';',
newSubstr: ' semicolon '
},
{
substr: ':',
newSubstr: ' colon '
}
];
var Command = {
SPEAK_ANNOT: 'annots',
SPEAK_ALL_ANNOTS: 'all_annots',
TOGGLE_LOCATION: 'toggle_location',
SPEAK_MODE: 'mode',
SPEAK_ROW_COL: 'row_col',
TOGGLE_DISPLACEMENT: 'toggle_displacement',
FOCUS_TEXT: 'focus_text'
};
var KEY_PREFIX = 'CONTROL + SHIFT ';
cvoxAce.editor = null;
var lastCursor = null;
var annotTable = {};
var shouldSpeakRowLocation = false;
var shouldSpeakDisplacement = false;
var changed = false;
var vimState = null;
var keyCodeToShortcutMap = {};
var cmdToShortcutMap = {};
var getKeyShortcutString = function(keyCode) {
return KEY_PREFIX + String.fromCharCode(keyCode);
};
var isVimMode = function() {
var keyboardHandler = cvoxAce.editor.keyBinding.getKeyboardHandler();
return keyboardHandler.$id === 'ace/keyboard/vim';
};
var getCurrentToken = function(cursor) {
return cvoxAce.editor.getSession().getTokenAt(cursor.row, cursor.column + 1);
};
var getCurrentLine = function(cursor) {
return cvoxAce.editor.getSession().getLine(cursor.row);
};
var onRowChange = function(currCursor) {
if (annotTable[currCursor.row]) {
cvox.Api.playEarcon(ERROR_EARCON);
}
if (shouldSpeakRowLocation) {
cvox.Api.stop();
speakChar(currCursor);
speakTokenQueue(getCurrentToken(currCursor));
speakLine(currCursor.row, 1);
} else {
speakLine(currCursor.row, 0);
}
};
var isWord = function(cursor) {
var line = getCurrentLine(cursor);
var lineSuffix = line.substr(cursor.column - 1);
if (cursor.column === 0) {
lineSuffix = ' ' + line;
}
var firstWordRegExp = /^\W(\w+)/;
var words = firstWordRegExp.exec(lineSuffix);
return words !== null;
};
var rules = {
'constant': {
prop: CONSTANT_PROP
},
'entity': {
prop: ENTITY_PROP
},
'keyword': {
prop: KEYWORD_PROP
},
'storage': {
prop: STORAGE_PROP
},
'variable': {
prop: VARIABLE_PROP
},
'meta': {
prop: DEFAULT_PROP,
replace: [
{
substr: '</',
newSubstr: ' closing tag '
},
{
substr: '/>',
newSubstr: ' close tag '
},
{
substr: '<',
newSubstr: ' tag start '
},
{
substr: '>',
newSubstr: ' tag end '
}
]
}
};
var DEFAULT_RULE = {
prop: DEFAULT_RULE
};
var expand = function(value, replaceRules) {
var newValue = value;
for (var i = 0; i < replaceRules.length; i++) {
var replaceRule = replaceRules[i];
var regexp = new RegExp(replaceRule.substr, 'g');
newValue = newValue.replace(regexp, replaceRule.newSubstr);
}
return newValue;
};
var mergeTokens = function(tokens, start, end) {
var newToken = {};
newToken.value = '';
newToken.type = tokens[start].type;
for (var j = start; j < end; j++) {
newToken.value += tokens[j].value;
}
return newToken;
};
var mergeLikeTokens = function(tokens) {
if (tokens.length <= 1) {
return tokens;
}
var newTokens = [];
var lastLikeIndex = 0;
for (var i = 1; i < tokens.length; i++) {
var lastLikeToken = tokens[lastLikeIndex];
var currToken = tokens[i];
if (getTokenRule(lastLikeToken) !== getTokenRule(currToken)) {
newTokens.push(mergeTokens(tokens, lastLikeIndex, i));
lastLikeIndex = i;
}
}
newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length));
return newTokens;
};
var isRowWhiteSpace = function(row) {
var line = cvoxAce.editor.getSession().getLine(row);
var whiteSpaceRegexp = /^\s*$/;
return whiteSpaceRegexp.exec(line) !== null;
};
var speakLine = function(row, queue) {
var tokens = cvoxAce.editor.getSession().getTokens(row);
if (tokens.length === 0 || isRowWhiteSpace(row)) {
cvox.Api.playEarcon('EDITABLE_TEXT');
return;
}
tokens = mergeLikeTokens(tokens);
var firstToken = tokens[0];
tokens = tokens.filter(function(token) {
return token !== firstToken;
});
speakToken_(firstToken, queue);
tokens.forEach(speakTokenQueue);
};
var speakTokenFlush = function(token) {
speakToken_(token, 0);
};
var speakTokenQueue = function(token) {
speakToken_(token, 1);
};
var getTokenRule = function(token) {
if (!token || !token.type) {
return;
}
var split = token.type.split('.');
if (split.length === 0) {
return;
}
var type = split[0];
var rule = rules[type];
if (!rule) {
return DEFAULT_RULE;
}
return rule;
};
var speakToken_ = function(token, queue) {
var rule = getTokenRule(token);
var value = expand(token.value, REPLACE_LIST);
if (rule.replace) {
value = expand(value, rule.replace);
}
cvox.Api.speak(value, queue, rule.prop);
};
var speakChar = function(cursor) {
var line = getCurrentLine(cursor);
cvox.Api.speak(line[cursor.column], 1);
};
var speakDisplacement = function(lastCursor, currCursor) {
var line = getCurrentLine(currCursor);
var displace = line.substring(lastCursor.column, currCursor.column);
displace = displace.replace(/ /g, ' space ');
cvox.Api.speak(displace);
};
var speakCharOrWordOrLine = function(lastCursor, currCursor) {
if (Math.abs(lastCursor.column - currCursor.column) !== 1) {
var currLineLength = getCurrentLine(currCursor).length;
if (currCursor.column === 0 || currCursor.column === currLineLength) {
speakLine(currCursor.row, 0);
return;
}
if (isWord(currCursor)) {
cvox.Api.stop();
speakTokenQueue(getCurrentToken(currCursor));
return;
}
}
speakChar(currCursor);
};
var onColumnChange = function(lastCursor, currCursor) {
if (!cvoxAce.editor.selection.isEmpty()) {
speakDisplacement(lastCursor, currCursor);
cvox.Api.speak('selected', 1);
}
else if (shouldSpeakDisplacement) {
speakDisplacement(lastCursor, currCursor);
} else {
speakCharOrWordOrLine(lastCursor, currCursor);
}
};
var onCursorChange = function(evt) {
if (changed) {
changed = false;
return;
}
var currCursor = cvoxAce.editor.selection.getCursor();
if (currCursor.row !== lastCursor.row) {
onRowChange(currCursor);
} else {
onColumnChange(lastCursor, currCursor);
}
lastCursor = currCursor;
};
var onSelectionChange = function(evt) {
if (cvoxAce.editor.selection.isEmpty()) {
cvox.Api.speak('unselected');
}
};
var onChange = function(evt) {
var data = evt.data;
switch (data.action) {
case 'removeText':
cvox.Api.speak(data.text, 0, DELETED_PROP);
changed = true;
break;
case 'insertText':
cvox.Api.speak(data.text, 0);
changed = true;
break;
}
};
var isNewAnnotation = function(annot) {
var row = annot.row;
var col = annot.column;
return !annotTable[row] || !annotTable[row][col];
};
var populateAnnotations = function(annotations) {
annotTable = {};
for (var i = 0; i < annotations.length; i++) {
var annotation = annotations[i];
var row = annotation.row;
var col = annotation.column;
if (!annotTable[row]) {
annotTable[row] = {};
}
annotTable[row][col] = annotation;
}
};
var onAnnotationChange = function(evt) {
var annotations = cvoxAce.editor.getSession().getAnnotations();
var newAnnotations = annotations.filter(isNewAnnotation);
if (newAnnotations.length > 0) {
cvox.Api.playEarcon(ERROR_EARCON);
}
populateAnnotations(annotations);
};
var speakAnnot = function(annot) {
var annotText = annot.type + ' ' + annot.text + ' on ' +
rowColToString(annot.row, annot.column);
annotText = annotText.replace(';', 'semicolon');
cvox.Api.speak(annotText, 1);
};
var speakAnnotsByRow = function(row) {
var annots = annotTable[row];
for (var col in annots) {
speakAnnot(annots[col]);
}
};
var rowColToString = function(row, col) {
return 'row ' + (row + 1) + ' column ' + (col + 1);
};
var speakCurrRowAndCol = function() {
cvox.Api.speak(rowColToString(lastCursor.row, lastCursor.column));
};
var speakAllAnnots = function() {
for (var row in annotTable) {
speakAnnotsByRow(row);
}
};
var speakMode = function() {
if (!isVimMode()) {
return;
}
switch (cvoxAce.editor.keyBinding.$data.state) {
case INSERT_MODE_STATE:
cvox.Api.speak('Insert mode');
break;
case COMMAND_MODE_STATE:
cvox.Api.speak('Command mode');
break;
}
};
var toggleSpeakRowLocation = function() {
shouldSpeakRowLocation = !shouldSpeakRowLocation;
if (shouldSpeakRowLocation) {
cvox.Api.speak('Speak location on row change enabled.');
} else {
cvox.Api.speak('Speak location on row change disabled.');
}
};
var toggleSpeakDisplacement = function() {
shouldSpeakDisplacement = !shouldSpeakDisplacement;
if (shouldSpeakDisplacement) {
cvox.Api.speak('Speak displacement on column changes.');
} else {
cvox.Api.speak('Speak current character or word on column changes.');
}
};
var onKeyDown = function(evt) {
if (evt.ctrlKey && evt.shiftKey) {
var shortcut = keyCodeToShortcutMap[evt.keyCode];
if (shortcut) {
shortcut.func();
}
}
};
var onChangeStatus = function(evt, editor) {
if (!isVimMode()) {
return;
}
var state = editor.keyBinding.$data.state;
if (state === vimState) {
return;
}
switch (state) {
case INSERT_MODE_STATE:
cvox.Api.playEarcon(MODE_SWITCH_EARCON);
cvox.Api.setKeyEcho(true);
break;
case COMMAND_MODE_STATE:
cvox.Api.playEarcon(MODE_SWITCH_EARCON);
cvox.Api.setKeyEcho(false);
break;
}
vimState = state;
};
var contextMenuHandler = function(evt) {
var cmd = evt.detail['customCommand'];
var shortcut = cmdToShortcutMap[cmd];
if (shortcut) {
shortcut.func();
cvoxAce.editor.focus();
}
};
var initContextMenu = function() {
var ACTIONS = SHORTCUTS.map(function(shortcut) {
return {
desc: shortcut.desc + getKeyShortcutString(shortcut.keyCode),
cmd: shortcut.cmd
};
});
var body = document.querySelector('body');
body.setAttribute('contextMenuActions', JSON.stringify(ACTIONS));
body.addEventListener('ATCustomEvent', contextMenuHandler, true);
};
var onFindSearchbox = function(evt) {
if (evt.match) {
speakLine(lastCursor.row, 0);
} else {
cvox.Api.playEarcon(NO_MATCH_EARCON);
}
};
var focus = function() {
cvoxAce.editor.focus();
};
var SHORTCUTS = [
{
keyCode: 49,
func: function() {
speakAnnotsByRow(lastCursor.row);
},
cmd: Command.SPEAK_ANNOT,
desc: 'Speak annotations on line'
},
{
keyCode: 50,
func: speakAllAnnots,
cmd: Command.SPEAK_ALL_ANNOTS,
desc: 'Speak all annotations'
},
{
keyCode: 51,
func: speakMode,
cmd: Command.SPEAK_MODE,
desc: 'Speak Vim mode'
},
{
keyCode: 52,
func: toggleSpeakRowLocation,
cmd: Command.TOGGLE_LOCATION,
desc: 'Toggle speak row location'
},
{
keyCode: 53,
func: speakCurrRowAndCol,
cmd: Command.SPEAK_ROW_COL,
desc: 'Speak row and column'
},
{
keyCode: 54,
func: toggleSpeakDisplacement,
cmd: Command.TOGGLE_DISPLACEMENT,
desc: 'Toggle speak displacement'
},
{
keyCode: 55,
func: focus,
cmd: Command.FOCUS_TEXT,
desc: 'Focus text'
}
];
var onFocus = function() {
cvoxAce.editor = editor;
editor.getSession().selection.on('changeCursor', onCursorChange);
editor.getSession().selection.on('changeSelection', onSelectionChange);
editor.getSession().on('change', onChange);
editor.getSession().on('changeAnnotation', onAnnotationChange);
editor.on('changeStatus', onChangeStatus);
editor.on('findSearchBox', onFindSearchbox);
editor.container.addEventListener('keydown', onKeyDown);
lastCursor = editor.selection.getCursor();
};
var init = function(editor) {
onFocus();
SHORTCUTS.forEach(function(shortcut) {
keyCodeToShortcutMap[shortcut.keyCode] = shortcut;
cmdToShortcutMap[shortcut.cmd] = shortcut;
});
editor.on('focus', onFocus);
if (isVimMode()) {
cvox.Api.setKeyEcho(false);
}
initContextMenu();
};
function cvoxApiExists() {
return (typeof(cvox) !== 'undefined') && cvox && cvox.Api;
}
var tries = 0;
var MAX_TRIES = 15;
function watchForCvoxLoad(editor) {
if (cvoxApiExists()) {
init(editor);
} else {
tries++;
if (tries >= MAX_TRIES) {
return;
}
window.setTimeout(watchForCvoxLoad, 500, editor);
}
}
var Editor = require('../editor').Editor;
require('../config').defineOptions(Editor.prototype, 'editor', {
enableChromevoxEnhancements: {
set: function(val) {
if (val) {
watchForCvoxLoad(this);
}
},
value: true // turn it on by default or check for window.cvox
}
});
});
(function() {
window.require(["ace/ext/chromevox"], function() {});
})();
\ No newline at end of file
define("ace/ext/elastic_tabstops_lite",["require","exports","module","ace/editor","ace/config"], function(require, exports, module) {
"use strict";
var ElasticTabstopsLite = function(editor) {
this.$editor = editor;
var self = this;
var changedRows = [];
var recordChanges = false;
this.onAfterExec = function() {
recordChanges = false;
self.processRows(changedRows);
changedRows = [];
};
this.onExec = function() {
recordChanges = true;
};
this.onChange = function(e) {
var range = e.data.range
if (recordChanges) {
if (changedRows.indexOf(range.start.row) == -1)
changedRows.push(range.start.row);
if (range.end.row != range.start.row)
changedRows.push(range.end.row);
}
};
};
(function() {
this.processRows = function(rows) {
this.$inChange = true;
var checkedRows = [];
for (var r = 0, rowCount = rows.length; r < rowCount; r++) {
var row = rows[r];
if (checkedRows.indexOf(row) > -1)
continue;
var cellWidthObj = this.$findCellWidthsForBlock(row);
var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths);
var rowIndex = cellWidthObj.firstRow;
for (var w = 0, l = cellWidths.length; w < l; w++) {
var widths = cellWidths[w];
checkedRows.push(rowIndex);
this.$adjustRow(rowIndex, widths);
rowIndex++;
}
}
this.$inChange = false;
};
this.$findCellWidthsForBlock = function(row) {
var cellWidths = [], widths;
var rowIter = row;
while (rowIter >= 0) {
widths = this.$cellWidthsForRow(rowIter);
if (widths.length == 0)
break;
cellWidths.unshift(widths);
rowIter--;
}
var firstRow = rowIter + 1;
rowIter = row;
var numRows = this.$editor.session.getLength();
while (rowIter < numRows - 1) {
rowIter++;
widths = this.$cellWidthsForRow(rowIter);
if (widths.length == 0)
break;
cellWidths.push(widths);
}
return { cellWidths: cellWidths, firstRow: firstRow };
};
this.$cellWidthsForRow = function(row) {
var selectionColumns = this.$selectionColumnsForRow(row);
var tabs = [-1].concat(this.$tabsForRow(row));
var widths = tabs.map(function(el) { return 0; } ).slice(1);
var line = this.$editor.session.getLine(row);
for (var i = 0, len = tabs.length - 1; i < len; i++) {
var leftEdge = tabs[i]+1;
var rightEdge = tabs[i+1];
var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge);
var cell = line.substring(leftEdge, rightEdge);
widths[i] = Math.max(cell.replace(/\s+$/g,'').length, rightmostSelection - leftEdge);
}
return widths;
};
this.$selectionColumnsForRow = function(row) {
var selections = [], cursor = this.$editor.getCursorPosition();
if (this.$editor.session.getSelection().isEmpty()) {
if (row == cursor.row)
selections.push(cursor.column);
}
return selections;
};
this.$setBlockCellWidthsToMax = function(cellWidths) {
var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth;
var columnInfo = this.$izip_longest(cellWidths);
for (var c = 0, l = columnInfo.length; c < l; c++) {
var column = columnInfo[c];
if (!column.push) {
console.error(column);
continue;
}
column.push(NaN);
for (var r = 0, s = column.length; r < s; r++) {
var width = column[r];
if (startingNewBlock) {
blockStartRow = r;
maxWidth = 0;
startingNewBlock = false;
}
if (isNaN(width)) {
blockEndRow = r;
for (var j = blockStartRow; j < blockEndRow; j++) {
cellWidths[j][c] = maxWidth;
}
startingNewBlock = true;
}
maxWidth = Math.max(maxWidth, width);
}
}
return cellWidths;
};
this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) {
var rightmost = 0;
if (selectionColumns.length) {
var lengths = [];
for (var s = 0, length = selectionColumns.length; s < length; s++) {
if (selectionColumns[s] <= cellRightEdge)
lengths.push(s);
else
lengths.push(0);
}
rightmost = Math.max.apply(Math, lengths);
}
return rightmost;
};
this.$tabsForRow = function(row) {
var rowTabs = [], line = this.$editor.session.getLine(row),
re = /\t/g, match;
while ((match = re.exec(line)) != null) {
rowTabs.push(match.index);
}
return rowTabs;
};
this.$adjustRow = function(row, widths) {
var rowTabs = this.$tabsForRow(row);
if (rowTabs.length == 0)
return;
var bias = 0, location = -1;
var expandedSet = this.$izip(widths, rowTabs);
for (var i = 0, l = expandedSet.length; i < l; i++) {
var w = expandedSet[i][0], it = expandedSet[i][1];
location += 1 + w;
it += bias;
var difference = location - it;
if (difference == 0)
continue;
var partialLine = this.$editor.session.getLine(row).substr(0, it );
var strippedPartialLine = partialLine.replace(/\s*$/g, "");
var ispaces = partialLine.length - strippedPartialLine.length;
if (difference > 0) {
this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(" ") + "\t");
this.$editor.session.getDocument().removeInLine(row, it, it + 1);
bias += difference;
}
if (difference < 0 && ispaces >= -difference) {
this.$editor.session.getDocument().removeInLine(row, it + difference, it);
bias += difference;
}
}
};
this.$izip_longest = function(iterables) {
if (!iterables[0])
return [];
var longest = iterables[0].length;
var iterablesLength = iterables.length;
for (var i = 1; i < iterablesLength; i++) {
var iLength = iterables[i].length;
if (iLength > longest)
longest = iLength;
}
var expandedSet = [];
for (var l = 0; l < longest; l++) {
var set = [];
for (var i = 0; i < iterablesLength; i++) {
if (iterables[i][l] === "")
set.push(NaN);
else
set.push(iterables[i][l]);
}
expandedSet.push(set);
}
return expandedSet;
};
this.$izip = function(widths, tabs) {
var size = widths.length >= tabs.length ? tabs.length : widths.length;
var expandedSet = [];
for (var i = 0; i < size; i++) {
var set = [ widths[i], tabs[i] ];
expandedSet.push(set);
}
return expandedSet;
};
}).call(ElasticTabstopsLite.prototype);
exports.ElasticTabstopsLite = ElasticTabstopsLite;
var Editor = require("../editor").Editor;
require("../config").defineOptions(Editor.prototype, "editor", {
useElasticTabstops: {
set: function(val) {
if (val) {
if (!this.elasticTabstops)
this.elasticTabstops = new ElasticTabstopsLite(this);
this.commands.on("afterExec", this.elasticTabstops.onAfterExec);
this.commands.on("exec", this.elasticTabstops.onExec);
this.on("change", this.elasticTabstops.onChange);
} else if (this.elasticTabstops) {
this.commands.removeListener("afterExec", this.elasticTabstops.onAfterExec);
this.commands.removeListener("exec", this.elasticTabstops.onExec);
this.removeListener("change", this.elasticTabstops.onChange);
}
}
}
});
});
(function() {
window.require(["ace/ext/elastic_tabstops_lite"], function() {});
})();
\ No newline at end of file
此差异已折叠。
;
(function() {
window.require(["ace/ext/error_marker"], function() {});
})();
\ No newline at end of file
define("ace/ext/menu_tools/overlay_page",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
'use strict';
var dom = require("../../lib/dom");
var cssText = "#ace_settingsmenu, #kbshortcutmenu {\
background-color: #F7F7F7;\
color: black;\
box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\
padding: 1em 0.5em 2em 1em;\
overflow: auto;\
position: absolute;\
margin: 0;\
bottom: 0;\
right: 0;\
top: 0;\
z-index: 9991;\
cursor: default;\
}\
.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\
box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\
background-color: rgba(255, 255, 255, 0.6);\
color: black;\
}\
.ace_optionsMenuEntry:hover {\
background-color: rgba(100, 100, 100, 0.1);\
-webkit-transition: all 0.5s;\
transition: all 0.3s\
}\
.ace_closeButton {\
background: rgba(245, 146, 146, 0.5);\
border: 1px solid #F48A8A;\
border-radius: 50%;\
padding: 7px;\
position: absolute;\
right: -8px;\
top: -8px;\
z-index: 1000;\
}\
.ace_closeButton{\
background: rgba(245, 146, 146, 0.9);\
}\
.ace_optionsMenuKey {\
color: darkslateblue;\
font-weight: bold;\
}\
.ace_optionsMenuCommand {\
color: darkcyan;\
font-weight: normal;\
}";
dom.importCssString(cssText);
module.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) {
top = top ? 'top: ' + top + ';' : '';
bottom = bottom ? 'bottom: ' + bottom + ';' : '';
right = right ? 'right: ' + right + ';' : '';
left = left ? 'left: ' + left + ';' : '';
var closer = document.createElement('div');
var contentContainer = document.createElement('div');
function documentEscListener(e) {
if (e.keyCode === 27) {
closer.click();
}
}
closer.style.cssText = 'margin: 0; padding: 0; ' +
'position: fixed; top:0; bottom:0; left:0; right:0;' +
'z-index: 9990; ' +
'background-color: rgba(0, 0, 0, 0.3);';
closer.addEventListener('click', function() {
document.removeEventListener('keydown', documentEscListener);
closer.parentNode.removeChild(closer);
editor.focus();
closer = null;
});
document.addEventListener('keydown', documentEscListener);
contentContainer.style.cssText = top + right + bottom + left;
contentContainer.addEventListener('click', function(e) {
e.stopPropagation();
});
var wrapper = dom.createElement("div");
wrapper.style.position = "relative";
var closeButton = dom.createElement("div");
closeButton.className = "ace_closeButton";
closeButton.addEventListener('click', function() {
closer.click();
});
wrapper.appendChild(closeButton);
contentContainer.appendChild(wrapper);
contentContainer.appendChild(contentElement);
closer.appendChild(contentContainer);
document.body.appendChild(closer);
editor.blur();
};
});
define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",["require","exports","module","ace/lib/keys"], function(require, exports, module) {
"use strict";
var keys = require("../../lib/keys");
module.exports.getEditorKeybordShortcuts = function(editor) {
var KEY_MODS = keys.KEY_MODS;
var keybindings = [];
var commandMap = {};
editor.keyBinding.$handlers.forEach(function(handler) {
var ckb = handler.commandKeyBinding;
for (var i in ckb) {
var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); });
var commands = ckb[i];
if (!Array.isArray(commands))
commands = [commands];
commands.forEach(function(command) {
if (typeof command != "string")
command = command.name
if (commandMap[command]) {
commandMap[command].key += "|" + key;
} else {
commandMap[command] = {key: key, command: command};
keybindings.push(commandMap[command]);
}
});
}
});
return keybindings;
};
});
define("ace/ext/keybinding_menu",["require","exports","module","ace/editor","ace/ext/menu_tools/overlay_page","ace/ext/menu_tools/get_editor_keyboard_shortcuts"], function(require, exports, module) {
"use strict";
var Editor = require("ace/editor").Editor;
function showKeyboardShortcuts (editor) {
if(!document.getElementById('kbshortcutmenu')) {
var overlayPage = require('./menu_tools/overlay_page').overlayPage;
var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;
var kb = getEditorKeybordShortcuts(editor);
var el = document.createElement('div');
var commands = kb.reduce(function(previous, current) {
return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">'
+ current.command + '</span> : '
+ '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
}, '');
el.id = 'kbshortcutmenu';
el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';
overlayPage(editor, el, '0', '0', '0', null);
}
};
module.exports.init = function(editor) {
Editor.prototype.showKeyboardShortcuts = function() {
showKeyboardShortcuts(this);
};
editor.commands.addCommands([{
name: "showKeyboardShortcuts",
bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
exec: function(editor, line) {
editor.showKeyboardShortcuts();
}
}]);
};
});
(function() {
window.require(["ace/ext/keybinding_menu"], function() {});
})();
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册