Code Editor

TsgcHTMLComponent_CodeEditor: um editor de código para páginas web construído sobre o CodeMirror 6. Ele destaca SQL, JSON, JavaScript, HTML, CSS, XML, Markdown, Python e Pascal, dobra blocos, localiza e substitui, completa SQL com as tabelas e colunas do seu esquema e marca erros de JSON enquanto você digita. Seu texto é enviado com o formulário como um textarea, em Delphi, C++ Builder e .NET.

TsgcHTMLComponent_CodeEditor

Defina o Language e coloque o seu HTML dentro de um formulário. O texto vive em um <textarea> que o formulário envia como qualquer outro campo, de modo que o editor não precisa de código próprio e ainda funciona como um textarea simples sem JavaScript. O evento opcional OnChange envia o texto ao servidor enquanto o usuário digita.

Classe do componente

TsgcHTMLComponent_CodeEditor, um editor de código cujo texto é um campo de formulário enviado

Renderiza

Um editor CodeMirror 6 sobre um <textarea>. A biblioteca está embutida nos recursos do componente e é servida pelo motor como /codemirror.min.js, sem CDN

Linguagens

Delphi, C++ Builder, .NET

Um editor SQL em um formulário, JSON verificado no servidor

SQLSchema dá ao autocompletar as tabelas e colunas do seu banco de dados. No envio, GetValueFromRequest lê o texto do editor e ValidateJSONValue verifica o JSON antes de você guardá-lo.

uses
  sgcHTML_Component_CodeEditor;

// a SQL editor in a form
oSQL := TsgcHTMLComponent_CodeEditor.Create(Self);
oSQL.Name := 'query';
oSQL.Language := celSQL;
oSQL.SQLDialect := cesPostgreSQL;
oSQL.SQLSchema.Add('customers=id,name,email,country');
oSQL.SQLSchema.Add('orders=id,customer_id,total,created_at');
oSQL.Placeholder := 'SELECT ...';
oSQL.CSSHeight := '240px';
oSQL.Required := True;
sHtml := '<form method="post" action="/report">' + oSQL.HTML +
  '<button type="submit" class="btn btn-primary mt-2">Run</button></form>';

// a JSON settings editor that grows with the text
oSettings := TsgcHTMLComponent_CodeEditor.Create(Self);
oSettings.Name := 'settings';
oSettings.Language := celJSON;
oSettings.CSSHeight := 'auto';
oSettings.CSSMaxHeight := '400px';
oSettings.Value := LoadSettings;

// the post of the settings form
procedure TForm1.SaveSettingsPost(const aParams: TStrings; var aResponse: string);
var
  vJSON, vError: string;
begin
  vJSON := oSettings.GetValueFromRequest(aParams);
  if oSettings.ValidateJSONValue(vJSON, vError) then
  begin
    SaveSettings(vJSON);
    aResponse := '<div class="alert alert-success">Saved</div>';
  end
  else
    aResponse := '<div class="alert alert-danger">' + sgcHTMLEncode(vError) + '</div>';
end;
@* a SQL editor and a JSON editor in one form *@
<form method="post">
  <label for="query_input" class="form-label">Query</label>
  <sgc-code-editor name="query" language="sql" sql-dialect="postgresql"
                   sql-schema="customers=id,name,email;orders=id,customer_id,total"
                   value="@Model.Query" css-height="240px" required="true" />
  <sgc-code-editor name="settings" language="json" css-height="auto"
                   css-max-height="400px" value="@Model.Settings"
                   on-change="Model.SettingsChanged" />
  <button type="submit" class="btn btn-primary mt-2">Save</button>
</form>
using esegece.sgcWebSockets;

// a SQL editor in a form
var sql = new TsgcHTMLComponent_CodeEditor();
sql.Name = "query";
sql.Language = TsgcHTMLCodeEditorLanguage.celSQL;
sql.SQLDialect = TsgcHTMLCodeEditorSQLDialect.cesPostgreSQL;
sql.SQLSchema.Add("customers=id,name,email,country");
sql.SQLSchema.Add("orders=id,customer_id,total,created_at");
sql.CSSHeight = "240px";
sql.Required = true;

// a JSON settings editor that grows with the text
var settings = new TsgcHTMLComponent_CodeEditor();
settings.Name = "settings";
settings.Language = TsgcHTMLCodeEditorLanguage.celJSON;
settings.CSSHeight = "auto";
settings.CSSMaxHeight = "400px";
settings.Value = LoadSettings();

// the post of the settings form
string SaveSettingsPost(IReadOnlyList<string> fields)
{
    string json = settings.GetValueFromRequest(fields);
    if (settings.ValidateJSONValue(json, out string error))
    {
        SaveSettings(json);
        return "<div class=\"alert alert-success\">Saved</div>";
    }
    return "<div class=\"alert alert-danger\">" + WebUtility.HtmlEncode(error) + "</div>";
}

O que seus usuários recebem

O editor de uma IDE de desktop dentro de uma página web, e um campo que seus formulários enviam sem código próprio.

Dez linguagens

Language seleciona SQL, JSON, JavaScript, HTML com o seu CSS e JavaScript embutidos, CSS, XML, Markdown, Python, Pascal ou texto simples. Toda linguagem é destacada, SQL adiciona autocompletar e JSON adiciona uma verificação de sintaxe.

Autocompletar SQL e dialetos

SQLDialect seleciona as palavras-chave, os tipos, as funções e as aspas de identificadores de SQL padrão, PostgreSQL, MySQL, Microsoft SQL Server (T-SQL) ou SQLite. SQLSchema lista as suas tabelas e colunas, e SQLSchemaGrid adiciona as colunas de uma Grid como mais uma tabela. Digite o nome de uma tabela e um ponto para ver as suas colunas, ou pressione Ctrl+Espaço.

Verificação de sintaxe JSON

Com ValidateJSON o editor marca erros de sintaxe JSON enquanto o usuário digita, e a lista de erros diz o que está errado. No servidor, ValidateJSONValue verifica o texto enviado e devolve o erro, de modo que um arquivo de configurações quebrado nunca chega ao seu armazenamento.

Localizar, substituir e ir para a linha

Ctrl+F abre o painel de localizar e substituir no topo do editor, com opções de diferenciar maiúsculas, expressão regular e palavra inteira, substituir e substituir tudo. F3 e Shift+F3 localizam a próxima e a anterior ocorrência, e Ctrl+Alt+G vai para uma linha.

Dobramento e edição

Números de linha, uma linha ativa destacada e uma calha de dobra, cada um ligado ou desligado com LineNumbers, HighlightActiveLine e FoldGutter. Ctrl+Shift+[ e Ctrl+Shift+] dobram e desdobram o bloco no cursor, Tab recua em TabSize espaços, e Ctrl+Z e Ctrl+Y desfazem e refazem. WordWrap quebra as linhas longas.

Funciona em qualquer formulário

O editor copia cada alteração para o seu textarea e dispara um evento input, de modo que um formulário envia o texto atual e as bibliotecas de formulários veem a mudança. Um clique no seu rótulo move o foco para o editor. Com Required o navegador, e a validação de um Form, não enviam o formulário enquanto o editor está vazio.

Claro e escuro

Theme cetAuto segue o data-bs-theme da página, com o tema One Dark do CodeMirror quando está escuro, e troca as cores na hora quando o tema muda. cetLight e cetDark fixam as cores. CSSHeight define uma altura fixa, ou auto para crescer com o texto entre CSSMinHeight e CSSMaxHeight.

Acessibilidade

O textarea e a área de edição compartilham o nome acessível de AriaLabel, ou Editor de código da localidade, e informam somente leitura e obrigatório. Dentro do editor o Tab recua, então Esc e depois Tab move o foco para fora. No macOS o Cmd faz o papel do Ctrl.

Principais propriedades, métodos & eventos

Os membros que você mais usa.

Value e o campo enviado

Value é o texto do editor. O textarea é enviado em FieldName, senão no Name do componente, senão em code (GetFieldName). No servidor GetValueFromRequest devolve o texto enviado e LoadFromRequest define Value a partir dele. Um envio de formulário manda as quebras de linha como CRLF, a regra dos navegadores para um textarea.

OnChange

OnChange(Sender, aValue, aResponse) recebe o texto ChangeDelay ms (500 por padrão) depois que o usuário para de digitar, pelos eventos de componentes do HTMXEngine, ou da sua própria rota com ActionURL e DispatchComponentEvent. O navegador envia apenas enquanto o manipulador está atribuído e o editor não é ReadOnly, e o htmx insere o HTML que você devolve quando os seus elementos estão marcados com hx-swap-oob="true".

API JavaScript

window.sgcHTMLCodeEditor oferece get(id), setValue(id, text), focus(id) e scan(node). Os editores em conteúdo que o htmx insere são criados, e os editores que o htmx remove são destruídos, sem código seu.

Uma biblioteca por página

O CodeMirror 6 está embutido nos recursos do componente e é servido pelo motor como /codemirror.min.js. O navegador o carrega uma vez por página, somente nas páginas que têm um editor, não importa quantos editores tenham. Quando não consegue carregar, todo editor da página continua sendo um textarea simples e o formulário ainda o envia. O CodeMirror é distribuído sob a licença MIT.

Localização

O painel de localizar e substituir, o prompt de ir para a linha, os marcadores de dobra, a lista de autocompletar e os erros de JSON tiram seus textos da localidade da biblioteca, nos 17 idiomas que ela fornece.

Limites

OnChange envia o texto inteiro pelo endpoint de eventos de servidor, cujo limite de corpo é 64 KB. Use-o para textos pequenos, e leia os grandes a partir do envio do formulário. Um componente atende todos os usuários: leia o texto enviado com GetValueFromRequest e não altere o componente em OnChange.

ASP.NET Core

Em uma view Razor o Tag Helper <sgc-code-editor> renderiza o editor. A primeira renderização cria um componente por motor e nome, e cada renderização define as suas propriedades de novo a partir dos atributos. name é obrigatório, e o Tag Helper não tem atributo para SQLSchemaGrid: liste as colunas da grade em sql-schema.

A demo

Demos\60.HTML\01.RunTime\30.CodeEditor é o sgc Admin Console, um servidor na porta 8132: um console SQL com autocompletar do esquema que executa consultas no servidor para uma Grid, configurações JSON validadas no servidor e aplicadas ao vivo em todos os navegadores, e um visualizador de trechos somente leitura. As versões em design time, Lazarus e .NET a espelham.

Continue explorando

Experimente onlineVeja na demo Editor de código, rodando ao vivo no servidor de demos da eSeGeCe.
Ajuda onlineReferência completa da API e guia de uso para este componente.
Componente Rich EditorO editor WYSIWYG para texto formatado, enviado com o formulário da mesma maneira.
Todos os Componentes sgcHTMLExplore a matriz completa de recursos com mais de 80 componentes.
Baixar Versão de Avaliação GratuitaA avaliação de 30 dias inclui os projetos de demonstração 60.HTML.
PreçosLicenças Single, Team e Site com código-fonte completo.
Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Pronto para Começar?

Baixe a versão de avaliação gratuita e comece a construir UIs web em Delphi, C++ Builder e .NET.