Un sencillo editor de texto

facebook-svg gplus-svg twitter-svg

Para crear un sencillo editor de texto necesitamos un elemento <textarea> cuyo valor es el texto que queremos editar.


<textarea id="Texto" rows="5">Sed ut perspiciatis ...... sequi nesciunt.</textarea>

Texto en negrita

Si queremos poner el texto seleccionado dentro de una etiqueta <strong> hay que:

1. recuperar el valor del texto seleccionado. Para esto utilizamos las propiedades selectionStart y selectionEnd del texto seleccionado.

let desde = Texto.selectionStart; 
let hasta = Texto.selectionEnd;
let elTexto = Texto.value; // Texto es el textarea;
let sel = elTexto.substring(desde, hasta);

2. crear una cadena donde el texto seleccionado aparece entre etiquetas <strong>

<strong>el texto seleccionado</strong>

3. reemplazar el texto seleccionado con la nueva cadena de texto.
Para esto utilizamos el método setRangeText()

En el siguiente ejemplo además del elemento <textarea> hay un botón <button id="bold">. También hay un párafo <p id="resultado"></p> cuyo innerHTML es el valor del elemento <textarea>. Quiero que al hacer clic en el botón, el texto seleccionado del <textarea> aparezca entre etiquetas <strong>. Al mismo tiempo voy a actualizar el innerHTML del #resultado.


<textarea id="Texto" rows="5">Sed ut perspiciatis ...... sequi nesciunt.</textarea>
<p><button id="bold">Bold</button></p>

<p id="resultado"></p>
function etiquetaStrong() {
    //recuperar el valor del texto seleccionado
    let desde = Texto.selectionStart; 
    let hasta = Texto.selectionEnd;
    let elTexto = Texto.value; 
    let sel = elTexto.substring(desde, hasta);
    // si hay algo seleccionado
    if (sel.length > 0) {
      /*reemplazar el texto seleccionado con una cadena 
      donde el texto seleccionado aparece entre etiquetas strong*/
      Texto.setRangeText(`<strong>${sel}</strong>`,desde,hasta,'select');
      // actualizar el innerHTML del resultado
      resultado.innerHTML = Texto.value;
    }
  }

See the Pen Seleccionar texto y ponerlo en negrita*** by Gabi (@enxaneta) on CodePen.

Crear un encabezado

Si queremos crear un nuevo encabezado las cosas se complican un poco ya que, a diferencia de los elementos inline como <strong> un elemento <h1> - por ejemplo – es un elemento block. Recuerde que en el HTML hay un párafo <p id="resultado"></p> dentro de cual ponemos como innerHTML el valor del <textarea>. Voy a cambiar este párrafo con un <div id="resultado"></div>, y cada vez que actualice el valor del resultado voy a poner el valor del texto dentro de un párrafo:

resultado.innerHTML = `<p>${Texto.value}</p>`;

Para crear un nuevo encabezado, primero voy a cerrar el párrafo al inicio del texto seleccionado ( </p> ). A continuación voy a poner el texto seleccionado dentro de una etiqueta <h1> y, al final voy a abrir un nuevo párrafo ( <p> )  para el texto que viene a continuación. La estructura del HTML será más o menos así:
`</p><h1>${Texto_seleccionado}</h1><p>`

<div id="resultado">
<p>. . . . .</p>
<h1> Texto_seleccionado </h1>
<p>. . . . .</p>
</div>

See the Pen Crear un nuevo encabezado*** by Gabi (@enxaneta) on CodePen.

A continuación viene un ejemplo que me permite poner texto en negrita y añadir encabezados a la vez.

See the Pen Crear un sencillo editor de texto*** by Gabi (@enxaneta) on CodePen.