Changeset 1583684
- Timestamp:
- 01/27/2017 05:12:13 PM (9 years ago)
- Location:
- gmace/trunk
- Files:
-
- 6 added
- 4 edited
-
assets/css/icon/jsac.png (added)
-
assets/css/icon/phpac.png (added)
-
assets/css/style.css (modified) (1 diff)
-
assets/js/autocomplete (added)
-
assets/js/autocomplete/javascript.js (added)
-
assets/js/autocomplete/php.js (added)
-
assets/js/autocomplete/wordpress.js (added)
-
assets/js/scripts.js (modified) (22 diffs)
-
gmace.php (modified) (2 diffs)
-
readme.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
gmace/trunk/assets/css/style.css
r1583319 r1583684 548 548 549 549 550 #gm_autocomplete { 551 position: absolute; 552 z-index: 25; 553 } 554 #gm_autocomplete .option-list { 555 min-width: 24em; 556 max-height: 28vh; 557 overflow-y: auto; 558 background: whitesmoke; 559 box-shadow: rgba(0, 0, 0, 0.6) 2px 2px 10px -5px; 560 } 561 #gm_autocomplete .option-list p { 562 padding: 0.2em 1em; 563 margin: 0; 564 cursor: pointer; 565 display: flex; 566 align-items: center; 567 568 -webkit-transition: 200ms background, 200ms color; 569 -moz-transition: 200ms background, 200ms color; 570 -ms-transition: 200ms background, 200ms color; 571 -o-transition: 200ms background, 200ms color; 572 transition: 200ms background, 200ms color; 573 } 574 #gm_autocomplete .option-list p span { flex: 1; } 575 #gm_autocomplete .option-list p i { 576 width: 2em; 577 height: 1em; 578 background-size: contain; 579 background-repeat: no-repeat; 580 text-align: center; 581 } 582 #gm_autocomplete .option-list p i.fa.fa-php { background-image: url("/wp-content/plugins/gmace/assets/css/icon/phpac.png"); } 583 #gm_autocomplete .option-list p i.fa.fa-js { background-image: url("/wp-content/plugins/gmace/assets/css/icon/jsac.png"); } 584 #gm_autocomplete .tooltip-desc { 585 position: absolute; 586 top: 0; 587 left: 100%; 588 width: 24em; 589 max-height: 28vh; 590 padding: 1em 1em; 591 overflow-y: auto; 592 background: whitesmoke; 593 box-shadow: rgba(0, 0, 0, 0.6) 2px 2px 10px -5px; 594 box-sizing: border-box; 595 z-index: 5; 596 } 597 #gm_autocomplete .tooltip-desc h5 { 598 margin: 0; 599 margin-bottom: 0.5em; 600 font-size: 1.5em; 601 word-wrap: break-word; 602 } 603 #gm_autocomplete .tooltip-desc .fdesc { 604 font-size: 0.95em; 605 color: #747474; 606 } 607 #gm_autocomplete .tooltip-desc .fpars > div { margin-top: 1em; } 608 #gm_autocomplete .tooltip-desc .fpars > div > h6 { 609 margin: 0; 610 font-size: 1em; 611 } 612 #gm_autocomplete .tooltip-desc .fpars > div > h6 > span { 613 color: #7d84b2; 614 font-weight: normal; 615 display: inline-block; 616 margin-left: 0.5em; 617 } 618 #gm_autocomplete .tooltip-desc .fpars > div > p { margin: 0; } 619 620 621 550 622 #gm_statusBar { 551 623 margin: 0; -
gmace/trunk/assets/js/scripts.js
r1583327 r1583684 21 21 let openingFormats = new Array("bmp", "cpt", "gif", "hdr", "jpeg", "jpg", "jpe", "pcx", "pdf", "pdn", "png", "psd", "raw", "tga", "js", "css", "txt", "html", "xml"); 22 22 23 $("head").append( $("<style>", { html: "#filedit #text_file #gm_slider p.tab_editor.select, #filedit #text_file #gm_slider p.tab_editor:not(.select):hover { background-color: "+ $("#adminmenu li.current a.menu-top").css("background-color") +" ; color: white; }" }) );23 $("head").append( $("<style>", { html: "#filedit #text_file #gm_slider p.tab_editor.select, #filedit #text_file #gm_slider p.tab_editor:not(.select):hover, #gm_autocomplete .option-list p:hover { background-color: "+ $("#adminmenu li.current a.menu-top").css("background-color") +" ; color: white; }" }) ); 24 24 $("#gm_slider, #gm_hotbar").css({ 25 25 "background": $("#wpadminbar").css("background"), … … 71 71 $("#gm_hotbar div[data-action='action-save-file']").on('click',function() 72 72 { 73 writeToFile($("#gm_editors div.shown").data("editor"));73 writeToFile($("#gm_editors > div.shown").data("editor")); 74 74 }); 75 75 … … 77 77 $("#gm_hotbar div[data-action='open-code-completer']").on('click', function() 78 78 { 79 let editor = $("#gm_editors div.shown").data("editor");79 let editor = $("#gm_editors > div.shown").data("editor"); 80 80 81 81 let allClassesInEditor = getAllAttrValuesInEditor(); … … 153 153 else if($(e.target).is("#gm_code_completer > div .elem-inserter .elem-sub-option")) addt_code = $(e.target).data("i-code"); 154 154 155 let editor = $("#gm_editors div.shown").data("editor");155 let editor = $("#gm_editors > div.shown").data("editor"); 156 156 let code = _this.data("i-code") 157 157 .replace(/\\n/g, "\n") … … 213 213 $("#linePos").on('change', function() 214 214 { 215 let sessLen = $("#gm_editors div.shown").data("editor").session.getLength();215 let sessLen = $("#gm_editors > div.shown").data("editor").session.getLength(); 216 216 if($(this).val() > sessLen) 217 217 { 218 218 $(this).data("val", sessLen); 219 219 } 220 $("#gm_editors div.shown").data("editor").gotoLine($(this).val());220 $("#gm_editors > div.shown").data("editor").gotoLine($(this).val()); 221 221 }); 222 222 … … 247 247 function getAllAttrValuesInEditor() 248 248 { 249 let editorValue = jQuery("#gm_editors div.shown").data("editor").getValue();249 let editorValue = jQuery("#gm_editors > div.shown").data("editor").getValue(); 250 250 let classesArray = []; 251 251 let matches = editorValue.match(/class=["|']([a-zA-Z0-9-_^"^' ]+)["|']/gi); … … 269 269 function isInAttr(attr) 270 270 { 271 let editor = $("#gm_editors div.shown").data("editor");271 let editor = $("#gm_editors > div.shown").data("editor"); 272 272 273 273 let currentPrevText = editor.session.getTextRange({ … … 289 289 function isInCSSAttr(attr) 290 290 { 291 let editor = $("#gm_editors div.shown").data("editor");291 let editor = $("#gm_editors > div.shown").data("editor"); 292 292 293 293 let currentPrevText = editor.session.getTextRange({ … … 394 394 else if(_this.hasClass("obj-file")) 395 395 { 396 if($("#gm_editors div").length)397 readFromFile($("#gm_editors div.shown").data("editor"), _this.closest("ul.folder-objects").data("dir-folder") + "/" + _this.text());396 if($("#gm_editors > div").length) 397 readFromFile($("#gm_editors > div.shown").data("editor"), _this.closest("ul.folder-objects").data("dir-folder") + "/" + _this.text()); 398 398 else 399 399 addNewWindowEditor(_this.closest("ul.folder-objects").data("dir-folder") + "/" + _this.text()); … … 416 416 function addNewWindowEditor(directory) 417 417 { 418 $("#gm_editors div.shown").removeClass("shown");418 $("#gm_editors > div.shown").removeClass("shown"); 419 419 $("p.tab_editor.select").removeClass("select"); 420 420 … … 449 449 else if(!$(this).hasClass("select")) 450 450 { 451 let currentEditorScreen = $("#gm_editors div#gmace-editor-" + $(this).data("index"));451 let currentEditorScreen = $("#gm_editors > div#gmace-editor-" + $(this).data("index")); 452 452 let currentLine = currentEditorScreen.data("editor").getCursorPosition().row + 1; 453 453 454 454 $("p.tab_editor.select").removeClass("select"); 455 $("#gm_editors div.shown").removeClass("shown");455 $("#gm_editors > div.shown").removeClass("shown"); 456 456 $("#linePos").data("val", currentLine).val(currentLine); 457 457 currentEditorScreen.addClass("shown").data("editor").focus(); … … 475 475 .on('removeTab', function() 476 476 { 477 let editor = $("#gm_editors > div#gmace-editor-"+ $(this).data("index")).data('editor'); 478 477 479 if($(this).hasClass("select")) 478 480 { 479 $("#gm_editors div#gmace-editor-"+ $(this).data("index")).remove();481 $("#gm_editors > div#gmace-editor-"+ $(this).data("index")).remove(); 480 482 $(this).remove(); 481 483 482 $("#gmace-editor-"+ $("#gm_slider p.tab_editor:first-child").addClass("select").data("index")).addClass("shown"); 483 $("#gm_editors div.shown").data("editor").resize(); 484 if( $("#gm_editors > div").length ) 485 { 486 $("#gmace-editor-"+ $("#gm_slider p.tab_editor:first-child").addClass("select").data("index")).addClass("shown"); 487 $("#gm_editors > div.shown").data("editor").resize(); 488 } 484 489 } 485 490 else 486 491 { 487 $("#gm_editors div#gmace-editor-"+ $(this).data("index")).remove();492 $("#gm_editors > div#gmace-editor-"+ $(this).data("index")).remove(); 488 493 $(this).remove(); 489 494 } 495 496 editor.destroy(); 497 editor.container.remove(); 490 498 491 499 $("#gm_slider .hide-files > div").width($("p.tab_editor").width() * $("p.tab_editor").length); … … 501 509 502 510 let editor_n = ace.edit("gmace-editor-"+ lastTabIndex); 503 $(editor_n).data("index", lastTabIndex) ; // ace_focus511 $(editor_n).data("index", lastTabIndex).data("first-change", true); // ace_focus 504 512 505 513 editor_n.setTheme("ace/theme/"+ THEME_EDITOR); … … 532 540 exec: function(editor) 533 541 { 534 if($("#gm_editors div.shown").data("readonly") == "true")542 if($("#gm_editors > div.shown").data("readonly") == "true") 535 543 { 536 544 editor.setReadOnly(false); 537 $("#gm_editors div.shown").data("readonly", "false").removeClass("readonly");545 $("#gm_editors > div.shown").data("readonly", "false").removeClass("readonly"); 538 546 } 539 547 else 540 548 { 541 549 editor.setReadOnly(true); 542 $("#gm_editors div.shown").data("readonly", "true").addClass("readonly");550 $("#gm_editors > div.shown").data("readonly", "true").addClass("readonly"); 543 551 } 544 552 }, … … 546 554 }); 547 555 548 editor_n.on('focus', function() 549 { 550 $("#gm_actions, #file, #gm_code_completer").removeClass("expand"); 551 $("#gm_editors div.focus").removeClass("focus"); 552 }); 556 editor_n.on('change', onEditorChange); 557 558 editor_n.on('focus', onEditorFocus); 559 553 560 editor_n.getSession().selection.on('changeCursor', function(e) 554 561 { 555 let yPos = $("#gm_editors div.shown").data("editor").getCursorPosition().row + 1;562 let yPos = $("#gm_editors > div.shown").data("editor").getCursorPosition().row + 1; 556 563 $("#linePos").data("val", yPos).val(yPos); 557 564 saveOpenedTab(); 558 565 }); 559 566 560 $("#gm_editors div#gmace-editor-"+ lastTabIndex).data("editor", editor_n);567 $("#gm_editors > div#gmace-editor-"+ lastTabIndex).data("editor", editor_n); 561 568 $("#gm_slider .hide-files > div").width($("p.tab_editor").width() * $("p.tab_editor").length); 562 569 readFromFile(editor_n); … … 567 574 function readFromFile(editor, directory) 568 575 { 569 directory = directory || $("#gm_editors div.shown").data("directory");576 directory = directory || $("#gm_editors > div.shown").data("directory"); 570 577 let fileName = directory.split("/"); 571 578 fileName = fileName[fileName.length - 1]; … … 574 581 directory.replace("//", ""); 575 582 576 $("#gm_editors div.shown").data("directory", directory);577 $("#gmace-tab-"+ $("#gm_editors div.shown").data("index")).find("span").text(shortFileName).attr("title", fileName);583 $("#gm_editors > div.shown").data("directory", directory); 584 $("#gmace-tab-"+ $("#gm_editors > div.shown").data("index")).find("span").text(shortFileName).attr("title", directory); 578 585 579 586 $.post(ajaxurl, { … … 615 622 if(flagAllowRewrite) 616 623 { 617 let directory = $("#gm_editors div.shown").data("directory");624 let directory = $("#gm_editors > div.shown").data("directory"); 618 625 619 626 if(!IS_REWRITING) … … 624 631 action: 'gmace_manager', 625 632 _op: 'rewrite_file', 626 directory: $("#gm_editors div.shown").data("directory"),633 directory: $("#gm_editors > div.shown").data("directory"), 627 634 content: editor.getValue() 628 635 }, function(response) … … 632 639 if(Number(response) == 1) 633 640 { 634 if($("#gm_editors div.shown").data("isTmpFile"))641 if($("#gm_editors > div.shown").data("isTmpFile")) 635 642 { 636 643 if(!$("#file ul.folder-objects[data-dir-folder='/gmacetmp']").length) … … 879 886 { 880 887 elementFile.addClass("red"); 881 console.log(fileDir);882 888 883 if(confirm("Are you sure you want to delete an object \""+ fileName +"\"?")) 884 { 885 $.post(ajaxurl, { 886 action: 'gmace_manager', 887 _op: 'rename_and_delete_file', 888 type: "delete", 889 directory: fileDir, 890 file: fileName 891 }, function(response) 889 setTimeout(function() 890 { 891 if(confirm("Are you sure you want to delete an object \""+ fileName +"\"?")) 892 892 { 893 let parent = elementFile.parent("ul").parent(); 894 895 console.log(response); 896 897 parent.children("ul").remove(); 898 parent.append(response).trigger("click"); 899 parent.addClass("open").children("ul").addClass("expand"); 900 901 $("#property_menu").addClass("info_run").css({ 902 "width":"280px", 903 "height":"65px" 904 }).html("<bold><p>Successfully deleted</p></bold>"); 905 906 hideDenied(); 907 }); 908 } 909 else 910 { 911 elementFile.removeClass("red"); 912 } 893 $.post(ajaxurl, { 894 action: 'gmace_manager', 895 _op: 'rename_and_delete_file', 896 type: "delete", 897 directory: fileDir, 898 file: fileName 899 }, function(response) 900 { 901 let parent = elementFile.parent("ul").parent(); 902 903 parent.children("ul").remove(); 904 parent.append(response).trigger("click"); 905 parent.addClass("open").children("ul").addClass("expand"); 906 907 $("#property_menu").addClass("info_run").css({ 908 "width":"280px", 909 "height":"65px" 910 }).html("<bold><p>Successfully deleted</p></bold>"); 911 912 hideDenied(); 913 }); 914 } 915 else elementFile.removeClass("red"); 916 }, 10); 913 917 } 914 918 }) … … 1109 1113 } 1110 1114 1115 1116 function onEditorFocus() 1117 { 1118 $("#gm_actions, #file, #gm_code_completer").removeClass("expand"); 1119 $("#gm_editors > div.focus").removeClass("focus"); 1120 $( $("#gm_editors > div.shown").data('editor') ).data('first-change', false); 1121 } 1122 1123 1124 _GMACE_AUTOCOMPLETERS = {}; 1125 _GMACE_AUTOCOMPLETERS_KEYS = {}; 1126 function onEditorChange(e) 1127 { 1128 let editorCnt = $("#gm_editors > div.shown"); 1129 let editor = editorCnt.data("editor"); 1130 1131 try { 1132 if( e.data.action == "insertLines" || e.data.action == "removeLines" || e.data.text.charCodeAt(0) == 10 ) 1133 { 1134 $("#gm_autocomplete").remove(); 1135 return; 1136 } 1137 } catch(err) {} 1138 if( $(editor).data('first-change') ) return; 1139 1140 let langMode = editor.getSession().$modeId == "ace/mode/php" ? "php" : ( editor.getSession().$modeId == "ace/mode/javascript" ? "js" : false ); 1141 if(!langMode) return; 1142 1143 let range = editor.getSelectionRange(); 1144 range.start.column = 0; 1145 range.end.column += 1; 1146 let text = editor.getSession().doc.getTextRange(range); 1147 text = text.split(" "); 1148 text = text[text.length - 1].split("."); 1149 text = text[text.length - 1]; 1150 1151 if(!text || text.length < 3 || ( e.data.action == "removeText" && !$("#gm_autocomplete").length )) $("#gm_autocomplete").remove(); 1152 else 1153 { 1154 let dropdownAutocompleter = $("<div>", { id: "gm_autocomplete" }) 1155 .append("<div class='option-list'></div>") 1156 .data('text', text).data('range', range) 1157 .on('mouseout', function(e) { 1158 if(!$(e.relatedTarget).closest("#gm_autocomplete").length && !$(e.relatedTarget).is(".tooltip-desc")) 1159 $("#gm_autocomplete .tooltip-desc").remove(); 1160 }); 1161 1162 if(_GMACE_AUTOCOMPLETERS[langMode]) 1163 { 1164 for(let i = 0; i < _GMACE_AUTOCOMPLETERS_KEYS[langMode].length; i++) 1165 { 1166 let tag = _GMACE_AUTOCOMPLETERS_KEYS[langMode][i]; 1167 1168 if( text.toLowerCase() !== tag.toLowerCase().substr(0, text.length) ) continue; 1169 dropdownAutocompleter.find(".option-list").append( 1170 $('<p><span>'+ tag +'</span><i class="fa fa-'+ _GMACE_AUTOCOMPLETERS[langMode][tag].type +'"></i></p>').data('tag', tag) 1171 ); 1172 } 1173 } 1174 1175 if(dropdownAutocompleter.find("p").length) 1176 { 1177 $("#gm_autocomplete").remove(); 1178 dropdownAutocompleter.css({ 1179 'top': $("#gm_slider").outerHeight() + editorCnt.find(".ace_cursor").position().top - 5, 1180 'left': $(".ace_gutter").outerWidth() + editorCnt.find(".ace_cursor").position().left + 30 1181 }) 1182 .appendTo( $("#text_file") ); 1183 1184 dropdownAutocompleter.find("p") 1185 .on('click', function() 1186 { 1187 let tag = _GMACE_AUTOCOMPLETERS[langMode][$(this).data('tag')]; 1188 let insertText = $(this).data('tag') +"("; 1189 let insertPars = []; 1190 1191 for(let i = 0; i < tag.params.length; i++) 1192 { 1193 if(tag.params[i].required === "yes" || true) 1194 { 1195 if(editor.getSession().$modeId == "ace/mode/php") 1196 { 1197 tag.params[i].param.split(" ").forEach(function(word) 1198 { 1199 if(word.substring(0, 1) == "$") insertPars.push(word.replace(",", "")); 1200 }); 1201 } 1202 else insertPars.push( tag.params[i].param ); 1203 } 1204 } 1205 insertText += insertPars.join(", ") + ")"; 1206 1207 let text = editor.getSession().doc.getTextRange( dropdownAutocompleter.data('range') ); 1208 text = text.substring(0, text.length - dropdownAutocompleter.data('text').length); 1209 text += insertText; 1210 1211 editor.getSession().replace( dropdownAutocompleter.data('range'), text ); 1212 editor.focus(); 1213 }) 1214 .on('hover', function() 1215 { 1216 $("#gm_autocomplete .tooltip-desc").remove(); 1217 1218 let tag = _GMACE_AUTOCOMPLETERS[langMode][$(this).data('tag')]; 1219 dropdownAutocompleter.append( 1220 $("<div>", { class: "tooltip-desc" }) 1221 .append("<h5>"+ $(this).data('tag').replace(" = ''", "") +"()</h5>") 1222 .append("<div class='fdesc'>"+ tag.desc +"</div>") 1223 .append("<div class='fpars'>"+ (tag.params.slice(0).map(function(param) 1224 { 1225 return "<div><h6>"+ param.param.replace(" = ''", "") +"<span>"+ (param.required == "yes" ? "(Required)" : "(Optional)") +"</span></h6><p>"+ (param.hasOwnProperty('desc') ? param.desc : "") +"</p></div>"; 1226 })).join("") +"</div>") 1227 ); 1228 1229 let offsetLeft = dropdownAutocompleter.position().left + $("#gm_autocomplete .tooltip-desc").position().left; 1230 if( offsetLeft + $("#gm_autocomplete .tooltip-desc").outerWidth() > $("#text_file").width() - 32 ) 1231 { 1232 $("#gm_autocomplete .tooltip-desc").width( $("#text_file").width() - 32 - offsetLeft ); 1233 } 1234 }); 1235 } 1236 else $("#gm_autocomplete").remove(); 1237 } 1238 } 1239 1240 1241 function addAutocompleter(functions, group) 1242 { 1243 if( !_GMACE_AUTOCOMPLETERS[ group ] ) _GMACE_AUTOCOMPLETERS[ group ] = {}; 1244 1245 _GMACE_AUTOCOMPLETERS[ group ] = Object.assign(_GMACE_AUTOCOMPLETERS[ group ], functions); 1246 Object.keys(_GMACE_AUTOCOMPLETERS).forEach(function(key) 1247 { 1248 _GMACE_AUTOCOMPLETERS_KEYS[ group ] = Object.keys(_GMACE_AUTOCOMPLETERS[ group ]).sort(); 1249 }); 1250 } 1251 addAutocompleter(autocomplete_wordpress, 'php'); 1252 addAutocompleter(autocomplete_php, 'php'); 1253 addAutocompleter(autocomplete_js, 'js'); 1111 1254 }); 1112 1255 })(jQuery); -
gmace/trunk/gmace.php
r1583327 r1583684 4 4 Plugin URI: http://wordpress.org/plugins/gmace/ 5 5 Description: Free PHP-editor code Wordpress. A variety of themes, syntax highlighting and a built file manager 6 Version: 1.5. 16 Version: 1.5.2 7 7 Author: German Mesky 8 8 Author URI: http://vk.com/dr.gmes … … 59 59 wp_enqueue_script("jquery-ui-core"); 60 60 61 wp_enqueue_script("gmace-emmet-core", GMACE_URL . "/assets/js/emmet.js"); 62 wp_enqueue_script("gmace-ace-js", GMACE_URL . "/assets/js/ace/ace.js"); 63 wp_enqueue_script("gmace-ace-emmet", GMACE_URL . "/assets/js/ace/ext-emmet.js"); 64 wp_enqueue_script("gmace-ace-statusbar", GMACE_URL . "/assets/js/ace/ext-statusbar.js"); 65 wp_enqueue_script("gmace-ace-language_tools", GMACE_URL . "/assets/js/ace/ext-language_tools.js"); 66 wp_enqueue_script("gmace-head-js", GMACE_URL . "/assets/js/scripts.js", array('jquery')); 61 wp_enqueue_script('gmace-emmet-core', GMACE_URL ."/assets/js/emmet.js"); 62 wp_enqueue_script('gmace-ace-js', GMACE_URL ."/assets/js/ace/ace.js"); 63 wp_enqueue_script('gmace-ace-emmet', GMACE_URL ."/assets/js/ace/ext-emmet.js"); 64 wp_enqueue_script('gmace-ace-statusbar', GMACE_URL ."/assets/js/ace/ext-statusbar.js"); 65 wp_enqueue_script('gmace-ace-language_tools', GMACE_URL ."/assets/js/ace/ext-language_tools.js"); 66 67 wp_enqueue_script('gmace-js-completion', GMACE_URL ."/assets/js/autocomplete/javascript.js"); 68 wp_enqueue_script('gmace-wp-completion', GMACE_URL ."/assets/js/autocomplete/wordpress.js"); 69 wp_enqueue_script('gmace-php-completion', GMACE_URL ."/assets/js/autocomplete/php.js"); 70 71 wp_enqueue_script('gmace-head-js', GMACE_URL ."/assets/js/scripts.js", array('jquery')); 67 72 68 wp_enqueue_style( "gmace-head-styles", GMACE_URL . "/assets/css/style.css");73 wp_enqueue_style('gmace-head-styles', GMACE_URL . "/assets/css/style.css"); 69 74 wp_enqueue_style('gmace-fontawesome', "http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css", "1.0"); 70 75 } -
gmace/trunk/readme.txt
r1583327 r1583684 32 32 33 33 == Changelog == 34 35 = 1.5.2 = 36 + Added and improved functions-tooltip, work in PHP-mode and Javascript-mode 34 37 35 38 = 1.5.1 =
Note: See TracChangeset
for help on using the changeset viewer.