<commit_before><!DOCTYPE html>
<html>

<head>
  <title>Teks</title>
  <style media="screen">
    body {
      margin: 0;
      padding: 0
    }

    #editor {
      width: 98vw;
      height: 98vh;
      border: none;
      resize: none;
    }

    #editor:focus {
      outline: none !important;
      border-color: none;
      box-shadow: none;
    }
  </style>
  <script>
    var arbol = null
    var ctrl = false
    // install babel hooks in the renderer process
    require('babel-register');
    const {
      ipcRenderer
    } = require('electron');
    window.onload = function() {
      ipcRenderer.send('obtenerArbol');
      ipcRenderer.on('arbolRecibido', (event, arg) => {
        arbol = arg
      })
    }

    document.addEventListener('keyup', function() {
      if (/[a-zA-ZÀ-ƒ]+/g.test(event.key)) {
        var textfield = document.getElementById('editor')
        var caretPos = posicionCursor(textfield)
        var palabra = ReturnWord(textfield.value, caretPos);
        if (palabra != null && !(/[^a-zA-ZÀ-ƒ]+/g.test(palabra))) {
          ipcRenderer.send('buscarSugerencias', palabra.toUpperCase())
        }
        ctrl = false
      }
    })

    document.addEventListener('keydown', function(e) {
      if ((e.metaKey || e.ctrlKey) && (String.fromCharCode(e.which) === ' ')) {
        taskItemInContext = clickInsideElement(e);

        if (taskItemInContext) {
          e.preventDefault();
          toggleMenuOn();
          positionMenu(e);
        } else {
          taskItemInContext = null;
          toggleMenuOff();
        }
      }
    });

    function clickInsideElement(e) {
      console.log(e.srcElement);
      console.log(e.target);
      var el = e.srcElement || e.target;
      console.log(el);
      return el;
    }

    function ReturnWord(text, caretPos) {
      var index = text.indexOf(caretPos);
      var preText = text.substring(0, caretPos);
      if (preText.indexOf(" ") > 0) {
        var words = preText.split(" ");
        return words[words.length - 1]; //return last word
      } else {
        return preText;
      }
    }

    function posicionCursor(ctrl) {
      var CaretPos = 0; // IE Support
      if (document.selection) {
        ctrl.focus();
        var Sel = document.selection.createRange();
        Sel.moveStart('character', -ctrl.value.length);
        CaretPos = Sel.text.length;
      }
      // Firefox support
      else if (ctrl.selectionStart || ctrl.selectionStart == '0')
        CaretPos = ctrl.selectionStart;
      return (CaretPos);
    }

    ipcRenderer.on('sugerencias', (event, arg) => {
      console.log(arg);
    })
  </script>
</head>

<body>
  <textarea autofocus id="editor"></textarea>
</body>

</html><commit_msg>Funciones con teclado Añadidas las funciones con el teclado de abrir y guardar TODO: validar al cerrar<commit_after><!DOCTYPE html>
<html>

<head>
  <title>Teks</title>
  <style media="screen">
    body {
      margin: 0;
      padding: 0
    }

    #editor {
      width: 98vw;
      height: 98vh;
      border: none;
      resize: none;
    }

    #editor:focus {
      outline: none !important;
      border-color: none;
      box-shadow: none;
    }
  </style>
  <script type="text/javascript">
    var jQuery = require('jquery');
    var caret = require('./caret');
    var fs = require('fs')
    const {
      remote
    } = require('electron')
    const {
      Menu,
      MenuItem,
      dialog
    } = remote
  </script>
  <script>
    'use strict';
    var arbol = null;
    var ctrl = false;
    var sugerencias
    var archivo
    // install babel hooks in the renderer process
    require('babel-register');

    var _require = require('electron'),
      ipcRenderer = _require.ipcRenderer;

    const menu = new Menu()

    window.addEventListener('contextmenu', (e) => {
      e.preventDefault()
      menu.popup(remote.getCurrentWindow())
    }, false)

    window.onload = function() {};

    document.addEventListener('keyup', function() {
      if (/[a-zA-ZÀ-ƒ]+/g.test(event.key)) {
        var posicion = jQuery('#editor').caret('pos');
        var textfield = document.getElementById('editor');
        var palabra = ReturnWord(textfield.value, posicion);
        if (palabra != null && !/[^a-zA-ZÀ-ƒ]+/g.test(palabra)) {
          ipcRenderer.send('buscarSugerencias', palabra.toUpperCase());
        }
        ctrl = false;
      }
    });


    document.addEventListener('keydown', function(e) {
      if ((e.metaKey || e.ctrlKey) && String.fromCharCode(e.which) === ' ') {
        var posicion = jQuery('#editor').caret('pos');
        var textfield = document.getElementById('editor')
        var palabra = ReturnWord(textfield.value, posicion);
        if (palabra != null && !/[^a-zA-ZÀ-ƒ]+/g.test(palabra)) {
          ipcRenderer.send('buscarSugerencias', palabra.toUpperCase());
        }
        var menu = new Menu()
        if (sugerencias[0].toUpperCase() == "N" && sugerencias[1].toUpperCase() == 'O') {
          var menuItem = new MenuItem({
            label: 'No hay sugerencias disponibles'
          })
          menu.append(menuItem)
          menuItem = new MenuItem({
            type: 'separator'
          })
          menu.append(menuItem)
          menuItem = new MenuItem({
            label: 'Agregar a Diccionario',
            palabra: palabra,
            click: function(currentItem) {
              ipcRenderer.send('agregarPalabraDicionario', currentItem.palabra)
            }
          })
          menu.append(menuItem)
        } else {
          for (var i = 0; i < sugerencias.length; i++) {
            var sug = sugerencias[i]
            var texto = textfield.value
            if (palabra[0] === palabra[0].toUpperCase()) {
              if (palabra[1] === palabra[1].toUpperCase()) {
                sug = sug.toUpperCase()
                var menuItem = new MenuItem({
                  label: sug,
                  palabra: palabra,
                  texto: texto,
                  posicion: posicion,
                  click: function(currentItem) {
                    replaceWord(currentItem.palabra, currentItem.label, currentItem.posicion, currentItem.texto)
                  }
                })

                menu.append(menuItem)
              } else {
                sug = sug.toCapital()
                var menuItem = new MenuItem({
                  label: sug,
                  palabra: palabra,
                  texto: texto,
                  posicion: posicion,
                  click: function(currentItem) {
                    replaceWord(currentItem.palabra, currentItem.label, currentItem.posicion, currentItem.texto)
                  }
                })

                menu.append(menuItem)
              }
            } else {
              sug = sug.toLowerCase()
              var menuItem = new MenuItem({
                label: sug,
                palabra: palabra,
                texto: texto,
                posicion: posicion,
                click: function(currentItem) {
                  replaceWord(currentItem.palabra, currentItem.label, currentItem.posicion, currentItem.texto)
                }
              })

              menu.append(menuItem)
            }
          }
        }

        menu.popup(remote.getCurrentWindow())

      } else if (event.ctrlKey || event.metaKey) {
        switch (String.fromCharCode(event.which).toLowerCase()) {
          case 's':
            if (fs.existsSync(archivo)) {
              fs.writeFile(archivo, document.getElementById("editor").value, function(err) {});
            } else {
              dialog.showSaveDialog(function(fileName) {
                if (fileName === undefined) return;
                fs.writeFile(fileName, document.getElementById("editor").value, function(err) {});
              });
            }
            break;
          case 'o':
            if (fs.existsSync(archivo)) {
              archivoNoGuardado()
            } else {
              abrirArchivo()
            }
            break;
        }
      }
    })

    function archivoNoGuardado() {
      var confirmar = dialog.showMessageBox(
        remote.getCurrentWindow(), {
          type: 'question',
          buttons: ['Sí', 'No'],
          title: 'Confirmar',
          message: 'Hay un archivo abierto. \n¿Desea guardarlo antes?'
        });
      if (confirmar === 0) {
        fs.writeFile(archivo, document.getElementById("editor").value, function(err) {});
      }else{
        abrirArchivo()
      }
    }

    function abrirArchivo() {
      dialog.showOpenDialog(function(fileNames) {
        if (fileNames === undefined) return;
        var fileName = fileNames[0];
        archivo = fileName
        fs.readFile(fileName, 'utf-8', function(err, data) {
          document.getElementById("editor").value = data
        });
      })
    }

    function replaceWord(palabra, sugerencia, posicion, texto) {
      var index = texto.indexOf(posicion);
      var preText = texto.substring(0, posicion);
      var palabras = texto.split(' ')
      var i = 0
      while (palabras[i] != palabra) {
        i++
      }
      palabras[i] = sugerencia

      console.log(sugerencia);
      var newText = palabras[0]
      for (var i = 1; i < palabras.length; i++) {
        newText += ' ' + palabras[i]
      }
      console.log(newText);
      jQuery("#editor").val(newText);
    }

    String.prototype.toCapital = function() {
      return this[0].toUpperCase() + this.substring(1, this.length).toLowerCase();
    }

    function ReturnWord(text, caretPos) {
      var index = text.indexOf(caretPos);
      var preText = text.substring(0, caretPos);
      if (preText.indexOf(" ") > 0) {
        var words = preText.split(" ");
        return words[words.length - 1]; //return last word
      } else {
        return preText;
      }
    }

    ipcRenderer.on('sugerencias', function(event, arg) {
      sugerencias = arg;
    });
  </script>
</head>

<body class="container">
  <textarea autofocus id="editor"></textarea>
  <div class="context">

  </div>
</body>

</html>
{'fraction_non_alphanumeric': 0.13314785373608903, 'fraction_numerical': 0.003577106518282989, 'mean_word_length': 1.8724315068493151, 'pattern_counts': {'":': 0, '<': 39, '<?xml version=': 0, '>': 42, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7163711', 'n_tokens_mistral': 3103, 'n_tokens_neox': 3022, 'n_words': 607}