UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 6.64 kB
import*as i18n from"../../../../core/i18n/i18n.js";import*as Platform from"../../../../core/platform/platform.js";import*as TextUtils from"../../../../models/text_utils/text_utils.js";import*as UI from"../../legacy.js";import xmlTreeStyles from"./xmlTree.css.legacy.js";import xmlViewStyles from"./xmlView.css.legacy.js";const UIStrings={find:"Find"},str_=i18n.i18n.registerUIStrings("ui/legacy/components/source_frame/XMLView.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export class XMLView extends UI.Widget.Widget{treeOutline;searchableView;currentSearchFocusIndex;currentSearchTreeElements;searchConfig;constructor(e){super(!0),this.registerRequiredCSS(xmlViewStyles),this.contentElement.classList.add("shadow-xml-view","source-code"),this.treeOutline=new UI.TreeOutline.TreeOutlineInShadow,this.treeOutline.registerRequiredCSS(xmlTreeStyles),this.contentElement.appendChild(this.treeOutline.element),this.currentSearchFocusIndex=0,this.currentSearchTreeElements=[],XMLViewNode.populate(this.treeOutline,e,this);const t=this.treeOutline.firstChild();t&&t.select(!0,!1)}static createSearchableView(e){const t=new XMLView(e),s=new UI.SearchableView.SearchableView(t,null);return s.setPlaceholder(i18nString(UIStrings.find)),t.searchableView=s,t.show(s.element),s}static parseXML(e,t){let s;try{switch(t){case"application/xhtml+xml":case"application/xml":case"image/svg+xml":case"text/html":case"text/xml":s=(new DOMParser).parseFromString(e,t)}}catch(e){return null}return!s||s.body?null:s}jumpToMatch(e,t){if(!this.searchConfig)return;const{regex:s}=this.searchConfig.toSearchRegex(!0),i=this.currentSearchTreeElements[this.currentSearchFocusIndex];i&&i.setSearchRegex(s);const r=this.currentSearchTreeElements[e];r?(this.updateSearchIndex(e),t&&r.reveal(!0),r.setSearchRegex(s,UI.UIUtils.highlightedCurrentSearchResultClassName)):this.updateSearchIndex(0)}updateSearchCount(e){this.searchableView&&this.searchableView.updateSearchMatchesCount(e)}updateSearchIndex(e){this.currentSearchFocusIndex=e,this.searchableView&&this.searchableView.updateCurrentMatchIndex(e)}innerPerformSearch(e,t){if(!this.searchConfig)return;let s=this.currentSearchFocusIndex;const i=this.currentSearchTreeElements[s];this.innerSearchCanceled(),this.currentSearchTreeElements=[];const{regex:r}=this.searchConfig.toSearchRegex(!0);for(let e=this.treeOutline.rootElement();e;e=e.traverseNextTreeElement(!1)){if(!(e instanceof XMLViewNode))continue;const n=e.setSearchRegex(r);if(n&&this.currentSearchTreeElements.push(e),i===e){const e=this.currentSearchTreeElements.length-1;s=n||t?e:e+1}}this.updateSearchCount(this.currentSearchTreeElements.length),this.currentSearchTreeElements.length?(s=Platform.NumberUtilities.mod(s,this.currentSearchTreeElements.length),this.jumpToMatch(s,e)):this.updateSearchIndex(0)}innerSearchCanceled(){for(let e=this.treeOutline.rootElement();e;e=e.traverseNextTreeElement(!1))e instanceof XMLViewNode&&e.revertHighlightChanges();this.updateSearchCount(0),this.updateSearchIndex(0)}onSearchCanceled(){this.searchConfig=null,this.currentSearchTreeElements=[],this.innerSearchCanceled()}performSearch(e,t,s){this.searchConfig=e,this.innerPerformSearch(t,s)}jumpToNextSearchResult(){if(!this.currentSearchTreeElements.length)return;const e=Platform.NumberUtilities.mod(this.currentSearchFocusIndex+1,this.currentSearchTreeElements.length);this.jumpToMatch(e,!0)}jumpToPreviousSearchResult(){if(!this.currentSearchTreeElements.length)return;const e=Platform.NumberUtilities.mod(this.currentSearchFocusIndex-1,this.currentSearchTreeElements.length);this.jumpToMatch(e,!0)}supportsCaseSensitiveSearch(){return!0}supportsRegexSearch(){return!0}}export class XMLViewNode extends UI.TreeOutline.TreeElement{node;closeTag;highlightChanges;xmlView;constructor(e,t,s){super("",!t&&"childElementCount"in e&&Boolean(e.childElementCount)),this.node=e,this.closeTag=t,this.selectable=!0,this.highlightChanges=[],this.xmlView=s,this.updateTitle()}static populate(e,t,s){if(!(t instanceof Node))return;let i=t.firstChild;for(;i;){const t=i;i=i.nextSibling;const r=t.nodeType;3===r&&t.nodeValue&&t.nodeValue.match(/\s+/)||(1!==r&&3!==r&&4!==r&&7!==r&&8!==r||e.appendChild(new XMLViewNode(t,!1,s)))}}setSearchRegex(e,t){if(this.revertHighlightChanges(),!e)return!1;if(this.closeTag&&this.parent&&!this.parent.expanded)return!1;e.lastIndex=0;let s=UI.UIUtils.highlightedSearchResultClassName;if(t&&(s+=" "+t),!this.listItemElement.textContent)return!1;const i=this.listItemElement.textContent.replace(/\xA0/g," ");let r=e.exec(i);const n=[];for(;r;)n.push(new TextUtils.TextRange.SourceRange(r.index,r[0].length)),r=e.exec(i);return n.length&&UI.UIUtils.highlightRangesWithStyleClass(this.listItemElement,n,s,this.highlightChanges),Boolean(this.highlightChanges.length)}revertHighlightChanges(){UI.UIUtils.revertDomChanges(this.highlightChanges),this.highlightChanges=[]}updateTitle(){const e=this.node;if("nodeType"in e)switch(e.nodeType){case 1:if(e instanceof Element){const t=e.tagName;if(this.closeTag)return void this.setTitle(["</"+t+">","shadow-xml-view-tag"]);const s=["<"+t,"shadow-xml-view-tag"],i=e.attributes;for(let e=0;e<i.length;++e){const t=i.item(e);if(!t)return;s.push(" ","shadow-xml-view-tag",t.name,"shadow-xml-view-attribute-name",'="',"shadow-xml-view-tag",t.value,"shadow-xml-view-attribute-value",'"',"shadow-xml-view-tag")}return this.expanded||(e.childElementCount?s.push(">","shadow-xml-view-tag","…","shadow-xml-view-comment","</"+t,"shadow-xml-view-tag"):e.textContent?s.push(">","shadow-xml-view-tag",e.textContent,"shadow-xml-view-text","</"+t,"shadow-xml-view-tag"):s.push(" /","shadow-xml-view-tag")),s.push(">","shadow-xml-view-tag"),void this.setTitle(s)}return;case 3:return void(e.nodeValue&&this.setTitle([e.nodeValue,"shadow-xml-view-text"]));case 4:return void(e.nodeValue&&this.setTitle(["<![CDATA[","shadow-xml-view-cdata",e.nodeValue,"shadow-xml-view-text","]]>","shadow-xml-view-cdata"]));case 7:return void(e.nodeValue&&this.setTitle(["<?"+e.nodeName+" "+e.nodeValue+"?>","shadow-xml-view-processing-instruction"]));case 8:return void this.setTitle(["\x3c!--"+e.nodeValue+"--\x3e","shadow-xml-view-comment"])}}setTitle(e){const t=document.createDocumentFragment();for(let s=0;s<e.length;s+=2)t.createChild("span",e[s+1]).textContent=e[s];this.title=t,this.xmlView.innerPerformSearch(!1,!1)}onattach(){this.listItemElement.classList.toggle("shadow-xml-view-close-tag",this.closeTag)}onexpand(){this.updateTitle()}oncollapse(){this.updateTitle()}async onpopulate(){XMLViewNode.populate(this,this.node,this.xmlView),this.appendChild(new XMLViewNode(this.node,!0,this.xmlView))}}