From 0077e467c6f714a29b3425c298f406aaa9a56507 Mon Sep 17 00:00:00 2001 From: keshav234156 Date: Sun, 14 Jun 2020 23:59:11 +0530 Subject: [PATCH] changed wrapping function --- src/html/boldOrItalic.js | 124 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 4 deletions(-) diff --git a/src/html/boldOrItalic.js b/src/html/boldOrItalic.js index 6061a9c..ffe7a1c 100644 --- a/src/html/boldOrItalic.js +++ b/src/html/boldOrItalic.js @@ -1,10 +1,126 @@ 'use strict'; var strings = require('../strings'); -var wrapping = require('./wrapping'); -function boldOrItalic (chunks, type) { - wrapping(type === 'bold' ? 'strong' : 'em', strings.placeholders[type], chunks); +function boldOrItalic(chunks, type) { + wrappingBoldItalic(type === 'bold' ? 'strong' : 'em', strings.placeholders[type], chunks); } -module.exports = boldOrItalic; +function wrappingBoldItalic(tag, placeholders, chunks) { + var open = '<' + tag; + var close = ']*)?>$', 'i'); + var rtrailing = new RegExp('^' + close + '>', 'i'); + var ropen = new RegExp(open + '( [^>]*)?>', 'ig'); + var rclose = new RegExp(close + '( [^>]*)?>', 'ig'); + + chunks.trim(); + + var trail = rtrailing.exec(chunks.after); + var lead = rleading.exec(chunks.before); + if (lead && trail) { + chunks.before = chunks.before.replace(rleading, ''); + chunks.after = chunks.after.replace(rtrailing, ''); + } else if (!chunks.selection) { + if (!trail && !lead && !surrounded(chunks, tag)) { + chunks.selection = placeholders; + chunks.after = close + '>' + chunks.after; + chunks.before += open + '>'; + } else if (!trail && !lead && surrounded(chunks, tag)) { + chunks.before = chunks.before + close + '>'; + chunks.after = '​' + open + '>' + chunks.after; + } else if (trail) { + chunks.after = chunks.after.replace(rtrailing, '​'); + chunks.before = chunks.before + close + '>'; + } + } else { + var opened = ropen.test(chunks.selection); + if (opened) { + chunks.selection = chunks.selection.replace(ropen, ''); + if (!surrounded(chunks, tag)) { + chunks.before += open + '>'; + } + } + var closed = rclose.test(chunks.selection); + if (closed) { + chunks.selection = chunks.selection.replace(rclose, ''); + if (!surrounded(chunks, tag)) { + chunks.after = close + '>' + chunks.after; + } + } + if (opened || closed) { + pushover(); + return; + } + if (surrounded(chunks, tag)) { + if (rleading.test(chunks.before)) { + chunks.before = chunks.before.replace(rleading, ''); + } else { + chunks.before += close + '>'; + } + if (rtrailing.test(chunks.after)) { + chunks.after = chunks.after.replace(rtrailing, ''); + } else { + chunks.after = open + '>' + chunks.after; + } + } + if (!closebounded(chunks, tag)) { + chunks.after = close + '>' + chunks.after; + chunks.before += open + '>'; + } + pushover(); + } + + function pushover() { + chunks.selection.replace(/<(\/)?([^> ]+)( [^>]*)?>/ig, pushoverOtherTags); + } + + function pushoverOtherTags(all, closing, tag, a, i) { + var attrs = a || ''; + var open = !closing; + var rclosed = new RegExp('<\/' + tag.replace(/', 'i'); + var ropened = new RegExp('<' + tag + '( [^>]*)?>', 'i'); + if (open && !rclosed.test(chunks.selection.substr(i))) { + chunks.selection += ''; + chunks.after = chunks.after.replace(/^(<\/[^>]+>)/, '$1<' + tag + attrs + '>'); + } + + if (closing && !ropened.test(chunks.selection.substr(0, i))) { + chunks.selection = '<' + tag + attrs + '>' + chunks.selection; + chunks.before = chunks.before.replace(/(<[^>]+(?: [^>]*)?>)$/, '$1'); + } + } +} + +function closebounded(chunks, tag) { + var rcloseleft = new RegExp('$', 'i'); + var ropenright = new RegExp('^<' + tag + '(?: [^>]*)?>', 'i'); + var bounded = rcloseleft.test(chunks.before) && ropenright.test(chunks.after); + if (bounded) { + chunks.before = chunks.before.replace(rcloseleft, ''); + chunks.after = chunks.after.replace(ropenright, ''); + } + return bounded; +} + +function surrounded(chunks, tag) { + var ropen = new RegExp('<' + tag + '(?: [^>]*)?>', 'ig'); + var rclose = new RegExp('<\/' + tag.replace(/', 'ig'); + var opensBefore = count(chunks.before, ropen); + var opensAfter = count(chunks.after, ropen); + var closesBefore = count(chunks.before, rclose); + var closesAfter = count(chunks.after, rclose); + var open = opensBefore - closesBefore > 0; + var close = closesAfter - opensAfter > 0; + return open && close; + + function count(text, regex) { + var match = text.match(regex); + if (match) { + return match.length; + } + return 0; + } +} + +module.exports = boldOrItalic; \ No newline at end of file