Script.hx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package hide.view;
  2. class Script extends FileView {
  3. var editor : monaco.ScriptEditor;
  4. var script : hide.comp.ScriptEditor;
  5. var originData : String;
  6. var lang : String;
  7. function getScriptChecker() {
  8. if( extension != "hx" )
  9. return null;
  10. return new hide.comp.ScriptEditor.ScriptChecker(config,"hx");
  11. }
  12. override function buildTabMenu():Array<hide.comp.ContextMenu.ContextMenuItem> {
  13. var arr = super.buildTabMenu();
  14. if( lang == "xml" ) {
  15. arr.push({ label : "Count Words", click : function() {
  16. var x = try Xml.parse(editor.getValue()) catch( e : Dynamic ) { ide.error(e); return; };
  17. var count = 0;
  18. var cats = [];
  19. var hcats = new Map();
  20. var firstElement = true;
  21. function countRec(x:Xml,category:{name:String,count:Int}) {
  22. switch( x.nodeType ) {
  23. case CData, PCData:
  24. var text = StringTools.trim(~/[^a-zA-Z0-9]+/g.replace(" ",x.nodeValue));
  25. if( text != "" ) {
  26. var n = text.split(" ").length;
  27. count += n;
  28. if( category != null ) category.count += n;
  29. }
  30. case Document:
  31. for( x in x )
  32. countRec(x, category);
  33. case Element:
  34. if( firstElement )
  35. firstElement = false;
  36. else if( category == null ) {
  37. var name = x.get("name");
  38. if( name == null ) name = "Other";
  39. category = hcats.get(name);
  40. if( category == null ) {
  41. category = { name : name, count : 0 };
  42. hcats.set(name, category);
  43. cats.push(category);
  44. }
  45. }
  46. for( x in x )
  47. countRec(x,category);
  48. default:
  49. }
  50. }
  51. countRec(x,null);
  52. cats.sort(function(c1,c2) return c2.count - c1.count);
  53. var txt = ["Words : " + count];
  54. if( cats.length > 1 && cats.length < 30 ) {
  55. txt.push("");
  56. for( c in cats )
  57. txt.push(c.name+": "+c.count);
  58. }
  59. ide.message(txt.join("\n"));
  60. }});
  61. }
  62. return arr;
  63. }
  64. override function onDisplay() {
  65. element.addClass("script-editor");
  66. lang = switch( extension ) {
  67. case "js", "hx": "javascript";
  68. case "json": "json";
  69. case "xml": "xml";
  70. case "html": "html";
  71. default: "text";
  72. }
  73. originData = sys.io.File.getContent(getPath());
  74. var checker = getScriptChecker();
  75. if( checker != null ) {
  76. script = new hide.comp.ScriptEditor(originData, checker, element);
  77. script.onSave = function() onSave(script.code);
  78. script.onChanged = function() {
  79. modified = script.code != originData;
  80. script.doCheckScript();
  81. }
  82. } else {
  83. editor = monaco.ScriptEditor.create(element[0],{
  84. value : originData,
  85. language : lang,
  86. automaticLayout : true,
  87. wordWrap : true,
  88. theme : "vs-dark",
  89. });
  90. editor.addCommand(monaco.KeyCode.KEY_S | monaco.KeyMod.CtrlCmd, function() {
  91. onSave(editor.getValue({preserveBOM:true}));
  92. });
  93. editor.onDidChangeModelContent(function() {
  94. var cur = editor.getValue({preserveBOM:true});
  95. modified = cur != originData;
  96. });
  97. }
  98. }
  99. function onSave(data) {
  100. originData = data;
  101. modified = false;
  102. skipNextChange = true;
  103. sys.io.File.saveContent(getPath(), originData);
  104. }
  105. static var _ = {
  106. FileTree.registerExtension(Script,["js","hx"],{ icon : "file-code-o" });
  107. FileTree.registerExtension(Script,["xml","html"],{ icon : "code" });
  108. FileTree.registerExtension(Script,["json"],{ icon : "gears" });
  109. };
  110. }