JavaScript - Palabras reservadas

 
Vista:

Palabras reservadas

Publicado por Eduardo (1 intervención) el 05/06/2023 18:33:10
Estoy haciendo un proyecto de JavaScript que funciona como un tipo de compilador SQL. Estoy utilizando palabras reservadas para que funcionen como una selección. Tú escribes en el cuadro de texto y automáticamente salen sugerencias de lo que quieras escribir. El problema es que quiero que esas palabras reservadas, cuando sean seleccionadas al momento de escribirse en el cuadro de texto, sean de un color distinto.

Soy algo nuevo programando

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Lista de sugerencias
var suggestions = ["SELECT", "FROM", "WHERE", "INSERT", "UPDATE", "DELETE", "CREATE", "ALTER", "DROP", "INDEX",
"AND", "OR", "NOT","ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "ASENSITIVE", "BEFORE", "BETWEEN", "BIGINT",
"BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE", "CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE",
"COLUMN", "CONDITION", "CONNECTION", "CONSTRAINT", "CONTINUE", "CONVERT", "CROSS", "CURRENT_DATE",
"CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND",
"DAY_MINUTE", "DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE", "DESC", "DESCRIBE", "DETERMINISTIC",
"DISTINCT", "DISTINCTROW", "DIV", "DOUBLE", "DROP", "DUAL", "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED", "EXISTS", "EXIT", "EXPLAIN",
"FALSE", "FETCH", "FLOAT", "FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GOTO", "GRANT", "GROUP", "HAVING", "HIGH_PRIORITY", "HOUR_MICROSECOND",
"HOUR_MINUTE", "HOUR_SECOND", "IF", "IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT", "INT", "INTEGER", "INTERVAL",
"INTO", "IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP",
"LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MATCH", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND",
"MINUTE_SECOND", "MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC", "ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR",
"ORDER", "OUT", "OUTER", "OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "READ", "READS", "REAL", "REFERENCES", "REGEXP", "RENAME",
"REPEAT", "REPLACE", "REQUIRE", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT",
"SENSITIVE", "SEPARATOR", "SET", "SHOW", "SMALLINT", "SONAME", "SPATIA", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", "SQLWARNING",
"SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT", "SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", "TINYBLOB",
"TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING",
"UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER", "VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE",
"XOR", "YEAR_MONTH", "ZEROFILL"];
 
// Detectar la entrada del usuario
var codeInput = document.getElementById("code-input");
var suggestionsList = document.getElementById("suggestions");
 
codeInput.addEventListener("keydown", function(event) {
  var key = event.keyCode || event.which;
 
  if (key === 9) { // Tab key
    event.preventDefault();
 
    var input = this.value;
    var lastWord = getLastWord(input);
 
    for (var i = 0; i < suggestions.length; i++) {
      if (suggestions[i].toLowerCase().startsWith(lastWord.toLowerCase())) {
        var suggestion = suggestions[i];
        var updatedInput = input.substr(0, input.lastIndexOf(lastWord)) + suggestion;
        this.value = updatedInput;
        break;
      }
    }
  }
});
 
codeInput.addEventListener("input", function() {
  var input = this.value;
  var lastWord = getLastWord(input);
  var matchingSuggestions = [];
 
  for (var i = 0; i < suggestions.length; i++) {
    if (suggestions[i].toLowerCase().startsWith(lastWord.toLowerCase())) {
      matchingSuggestions.push(suggestions[i]);
    }
  }
 
  showSuggestions(matchingSuggestions);
});
 
function showSuggestions(matchingSuggestions) {
  suggestionsList.innerHTML = "";
 
  for (var i = 0; i < matchingSuggestions.length; i++) {
    var suggestion = document.createElement("a");
    suggestion.innerHTML = matchingSuggestions[i];
    suggestion.addEventListener("click", function() {
      var input = codeInput.value;
      var lastWord = getLastWord(input);
      var updatedInput = input.substr(0, input.lastIndexOf(lastWord)) + this.innerHTML;
      codeInput.value = updatedInput;
      suggestionsList.style.display = "none";
    });
 
    suggestionsList.appendChild(suggestion);
  }
 
  if (matchingSuggestions.length > 0) {
    suggestionsList.style.display = "block";
  } else {
    suggestionsList.style.display = "none";
  }
}
 
// Obtener la última palabra ingresada por el usuario, incluso si está dentro de símbolos
function getLastWord(input) {
  var words = input.split(" ");
  var lastWord = words[words.length - 1];
 
  // Verificar si la última palabra está dentro de símbolos
  var symbols = ["(", ")", "{", "}", "[", "]", ";", ",", ".", "'", "\""];
  while (symbols.includes(lastWord.charAt(0))) {
    lastWord = lastWord.substr(1);
  }
  return lastWord;
}
// Botón para descargar en .sql
document.getElementById("download-btn").addEventListener("click", function() {
  var content = codeInput.value;
  var filename = "archivo.sql";
  var blob = new Blob([content], {type: "text/plain;charset=utf-8"});
  var link = document.createElement("a");
  link.setAttribute("href", window.URL.createObjectURL(blob));
  link.setAttribute("download", filename);
  link.click();
});
 
 
// Quitar linea roja de ortografia
var textInputs = document.querySelectorAll('input[type="text"], textarea');
textInputs.forEach(input => {
  input.spellcheck = false;
});
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro
Val: 1.448
Plata
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

Palabras reservadas

Publicado por Alejandro (532 intervenciones) el 06/06/2023 17:18:58
  • Alejandro se encuentra ahora conectado en el
  • chat de PHP
En lugar de un textarea o input text, puedes usar un div con el attributo contenteditable="true" en el cual si puedes usar HTML para ingresar etiquetas span. A este elemento accedes a su contenido con la propiedad textContent en lugar de value.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar