Build with Sanity MCP in Replit. Prizes up for grabs! Submit by June 14

Convert quotation marks for Portable Text

Script to convert quotation marks in Portable Text blocks

By Espen Hovlandsdal


convertQuotationMarks.js

const defaults = {open: '«', close: '»', find: '"'}

module.exports = function convertQuotationMarks(blocks, chars = defaults) {
  const characters = chars === defaults ? defaults : Object.assign({}, defaults, chars)
  const find = characters.find.replace(/([?!${}*:()|=^[\]/\\.+])/g, '\\$1')
  const pattern = new RegExp(find, 'g')

  return blocks.map(block => {
    if (block._type !== 'block' || !block.children) {
      return block
    }

    let isOpen = false
    const children = block.children.map(child => {
      if (child._type !== 'span' || !child.text) {
        return child
      }

      const text = child.text.replace(pattern, () => {
        const char = isOpen ? characters.close : characters.open
        isOpen = !isOpen
        return char
      })

      return Object.assign({}, child, {text})
    })

    return Object.assign({}, block, {children})
  })
}

This script convert quotation marks in top-level Portable Text blocks. Define open and closing quotation marks and the character you want to change from in the defaults object.

Contributor

Espen Hovlandsdal

Open-sourceror @ Sanity.io

United States

Visit Espen Hovlandsdal's profile