# Input rules for wrapping marks

**URL:** https://discuss.prosemirror.net/t/input-rules-for-wrapping-marks/537
**Category:** Uncategorized
**Created:** [December 21, 2016, 8:31am UTC](https://discuss.prosemirror.net/t/input-rules-for-wrapping-marks/537 "2016-12-21T08:31:25Z")
**Posts on this page:** 1
**Showing post:** 12

<div class="post-metadata">

### Author: ![supz](https://discuss.prosemirror.net/user_avatar/discuss.prosemirror.net/supz/32/3599_2.png) [@supz](https://discuss.prosemirror.net/u/supz)
#### Post date: [March 1, 2022, 12:44pm UTC](https://discuss.prosemirror.net/t/input-rules-for-wrapping-marks/537/12 "2022-03-01T12:44:08Z")

</div>

I came up with this:

```nohighlight
function markInputRule(regexp, markType, getAttrs, skipStart) {
    return new InputRule(regexp, (state, match, start, end) => {
        let attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs
        let tr = state.tr
        if (match[1]) {
            let skipMatch;
            let skipLen = 0;

            if (skipMatch = skipStart && match[0].match(skipStart)) {
                console.log(skipMatch)
                skipLen = skipMatch[0].length;
                start += skipLen;
            }

            let textStart = start + match[0].indexOf(match[1]) - skipLen
            let textEnd = textStart + match[1].length
            if (textEnd < end) tr.delete(textEnd, end)
            if (textStart > start) tr.delete(start, textStart)
            end = start + match[1].length
        }
        tr.addMark(start, end, markType.create(attrs))
        tr.removeStoredMark(markType)
        return tr
    })
}

```

(`skipStart` is a hack for emphasis because some browsers don’t yet support lookbehinds in Regex.)

And, here are the rules I used:

```nohighlight
// strong (** AND __)
markInputRule(/(?:\*\*)([^\*]+)(?:\*\*)$/, marks.strong),
markInputRule(/(?:\s__)([^_]+)(?:__)$/, marks.strong),

// em (* and _)
markInputRule(/(?:^|[^\*])(?:\*)([^\*]+)(?:\*)$/, marks.em, {}, /^[^\*]/),
markInputRule(/(?:^|[^_])(?:_)([^_]+)(?:_)$/, marks.em, {}, /^[^_]/),

// links
markInputRule(/(?:\[([^\]]+)\])(\([^\)]+\))$/, marks.link, function(match) {
    return {href: match[2]}
}),

// code (prosemirror-codemark adds this)
markInputRule(/(?:`)([^`]+)(?:`)$/, marks.code),

// strikethrough
markInputRule(/(?:~~)([^~]+)(?:~~)$/, marks.s),

// sup & sub
markInputRule(/(?:\^)([^\^]+)(?:\^)$/, marks.sup),
markInputRule(/(?:~)([^~]+)(?:~)$/, marks.sub),

// mark
markInputRule(/(?:==)([^=]+)(?:==)/, marks.mark),

```

Instead of the code inputrule, I let [prosemirror-codemark](https://discuss.prosemirror.net/t/new-plugin-prosemirror-codemark-to-handle-inline-code-mark-creation-and-manipulation/4159) handle that (with better cursors).

---

_[View the full topic](https://discuss.prosemirror.net/t/input-rules-for-wrapping-marks/537)._
