рдРрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдХреЛрдб рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


Ace (Ajax.org Cloud9 Editor) тАФ -. , . тАФ . , , . .




Ace Python, -, .


, , : Ace, Monaco, CodeMirror. CodeMirror , . Monaco, , , ce .


Ace , . (, if-else, try-except, class, def, etc). , , ? тАФ ( ). . тАФ , , . .



, , Ace . , Angular, , ng2-ace-editor .


npm install --save ng2-ace-editor brace ace-builds

.


Editor.component.html


<ace-editor
  id="editor"
  #scriptEditor
  [options]="options"
  [autoUpdateContent]="true"
  [mode]="'python'"
  [theme]="'github'"
  [(text)]="script"
  [style.height.px]="600"
></ace-editor>

editor.component.ts


import { Component } from '@angular/core';
import * as ace from 'brace';
//   
import 'brace/mode/python';
//  
import 'brace/snippets/python';
//  
import 'brace/theme/github';
import 'brace/ext/language_tools';

@Component({
  selector: 'app-editor',
  templateUrl: './editor.component.html',
  styleUrls: ['./editor.component.css']
})
export class EditorComponent {
  script = 'import sys\n\nprint("test")';
  options = {
    enableBasicAutocompletion: true,
    enableLiveAutocompletion: true,
    enableSnippets: true
  };

  constructor() { }
}

, ace ng2-ace-editor.


, ace editor, - brace. , brace ace. , , ace.



тАЬenableSnippetsтАЭ , .


import 'brace/snippets/python'

, .




, , . .


, plunker, : name, value, score, meta. , . . ,


getCompletions: function(editor, session, pos, prefix, callback)

callback . Editor . Session тАФ . Pos тАФ , , prefix тАФ .


, ace/ext/language_tools.js. ,


getDocTooltip: function(item)

innerHTML .


, :


export interface ICompleter {

  getCompletions(
    editor: ace.Editor,
    session: ace.IEditSession,
    pos: ace.Position,
    prefix: string,
    callback: (data: any | null, completions: CompletionModel[]) => void
  ): void;

  getTooltip(item: CompletionModel): void;

}

callback: completions . data тАФ , null. , , :)


, caption. Name Meta. snippet, , . , , . : тАЬ{1:variable}тАЭ. 1 тАФ (, 1), variable тАФ -.


:


export interface CompletionModel {
  caption: string;
  description?: string;
  snippet?: string;
  meta: string;
  type: string;
  value?: string;
  parent?: string;
  docHTML?: string;
  //  .   -  ,  - 
  inputParameters?: { [name: string]: string };
}

InputParameters. , , :)



, :


export interface MetaInfoModel {
  //  
  Name: string;
  // 
  Description: string;
  //   
  Type: string;
  //   
  Children: MetaInfoModel[];
  //  ,   
  InputParameters?: { [name: string]: string };
}

, , . , , .


, . :


  1. completions: { [name: string]: CompletionModel[] } тАФ : . , . .
  2. completionsTree: { [name: string]: string[] } : . .
  3. roots: string[] тАФ , .

-, getCompletions , , caption. . , , . . , - WebApi, GetRoleById. GetRoleById, . :


  1. (.. WebApi.GetRoleById, GetRoleById)
  2. , .

, - ( WebApi if. ). , .


. , ( ):


  • тАФ -.
  • , , + .
  • , , . , , , .

, . (, , ).


, , -. HTML , .


getDocTooltip completion. ( ) . :


рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рд╕реНрдирд┐рдкреЗрдЯ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ docHTML рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХреЗрдд (рдХреАрд╡рд░реНрдб, рд╕реНрдирд┐рдкреЗрдЯ, рдЖрджрд┐) рдорд╛рдирддреЗ рд╣реИрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред


  item.docHTML = [
          '<b>',
          item.caption,
          '</b>',
          '<hr></hr>',
          item.snippet
        ].join('');

рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдЖрдкрдХреЛ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреВрд░реНрдг рдкрде, рдПрдХ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВ рдФрд░ HTML рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред


//   
      let signature = Object.keys(item.inputParameters)
        .map(x => `${x} ${item.inputParameters[x]}`)
        .join(', ');

      if (signature) {
        signature = `(${signature})`;
      }

      const path = [];
      //     
      if (item.parent) {
        let parentId = item.parent;
        while (parentId) {
          path.push(parentId);
          parentId = this.completions[parentId][0].parent;
        }
      }
      const displayName =
        [...path.reverse(), item.caption].join('.') + signature;
      let type = item.type;
      if (item.meta === 'class') {
        type = 'class';
      }

      const description = item.description || '';
      let html = `<b>${type} ${displayName}</b><hr>`;
      if (description) {
        html += `<p style="max-width: 400px; white-space: normal;">${description}</p>`;
      }
      item.docHTML = html;

рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛ред


рд╕реНрд╡рдЪреНрдЫ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП:




рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИрдВред

рдмрд┐рдВрджреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП:



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рдж рд╣рдо рдХреЗрд╡рд▓ рд╡реЗрдмрдПрдкреА рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдмрдЪреНрдЪреЗ рдХреЗ рддрд░реАрдХреЗ рджреЗрдЦрддреЗ рд╣реИрдВ ред

рдпрджрд┐ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ



рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдСрдЯреЛ-рдкреВрд░реНрддрд┐ рдорд┐рд▓реА, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рдирд╛ рджрд░реНрдж рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :)


.

Source: https://habr.com/ru/post/undefined/


All Articles