I’m really stuck again on how to properly combine these lines to auto-replace straight quotes into smart ones in the text area.
It was working earlier, however after I added a line to fix the cursor going at the end after replacing a character.
Here’s what is currently looks like:
var area = document.getElementById("textarea1"); var getCount = function (str, search) { return str.split(search).length - 1; }; var replaceText = function (search, replaceWith) { if (area.value.indexOf(search) >= 0) { var start = area.selectionStart; var end = area.selectionEnd; var textBefore = area.value.substr(0, end); var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore, search); area.value = area.value.replace(search, replaceWith); area.selectionStart = start + lengthDiff; area.selectionEnd = end + lengthDiff; } }; area.addEventListener("keypress", function (e) { setTimeout(function () { replaceText(" ,", ",") replaceText(" ;", ";") replaceText(" .", ".") replaceText(" ", " ") replaceText("--", "—") replaceText(/(^|[-u2014s(["])'/g, "$1u2018") replaceText(/'/g, "u2019") replaceText(/(^|[-u2014/[(u2018s])"/g, "$1u201c") replaceText(/"/g, "u201d"); }, 0) });
<textarea id="textarea1" cols="40" rows="8"></textarea>
Commas, semicolon, period, em dash, and double spaces is working already.But it’s not for the quote marks. What can I do to correct these regex lines?
Here’s exactly where I’m stuck:
replaceText(/(^|[-u2014s(["])'/g, "$1u2018") replaceText(/'/g, "u2019") replaceText(/(^|[-u2014/[(u2018s])"/g, "$1u201c") replaceText(/"/g, "u201d");
Thanks in advance
Advertisement
Answer
In your replaceText you need to distinguish when you pass a regex or a string. .indexOf() does not accept a regex.
Moreover, I would suggest to change the keypress event with the input one.
The snippet:
window.addEventListener('DOMContentLoaded', function(e) { var area = document.getElementById("textarea1"); var getCount = function (str, search) { return str.split(search).length - 1; }; var replaceText = function (search, replaceWith) { if (typeof(search) == "object") { area.value = area.value.replace(search, replaceWith); return; } if (area.value.indexOf(search) >= 0) { var start = area.selectionStart; var end = area.selectionEnd; var textBefore = area.value.substr(0, end); var lengthDiff = (replaceWith.length - search.length) * getCount(textBefore, search); area.value = area.value.replace(search, replaceWith); area.selectionStart = start + lengthDiff; area.selectionEnd = end + lengthDiff; } }; area.addEventListener("input", function (e) { replaceText(" ,", ","); replaceText(" ;", ";"); replaceText(" .", "."); replaceText(" ", " "); replaceText("--", "—"); replaceText(/(^|[-u2014s(["])'/g, "$1u2018"); replaceText(/'/g, "u2019"); replaceText(/(^|[-u2014/[(u2018s])"/g, "$1u201c"); replaceText(/"/g, "u201d"); }); });
<textarea id="textarea1" cols="40" rows="8"></textarea>