ぜのぜ

しりとりしようぜのぜのぜのぜ

350日目

日記

明日は六甲山上たあとキャノボのほんの最初だけ試走して返ってくることにした

今日書いたコード

できた

動く様子
***

// タイトルのレベルをctrl (+ shift) + 8で変えるUser Script
const pattern = /\[(\*+) +(\S+)\]/

function deleteLine() {
  var eventToMoveToStartOfLine = new KeyboardEvent('keydown', {
    ctrlKey: true,
    keyCode: '69', // e
    bubbles: true,
    cancelable: true,
  })
  document.getElementById('text-input').dispatchEvent(eventToMoveToStartOfLine)
  var eventToMoveToEndOfLine = new KeyboardEvent('keydown', {
    ctrlKey: true,
    shiftKey: true,
    keyCode: '65', // a
    bubbles: true,
    cancelable: true,
  })
  document.getElementById('text-input').dispatchEvent(eventToMoveToEndOfLine)
  var eventToDelete = new KeyboardEvent('keydown', {
    keyCode: '8', // Backspace
    bubbles: true,
    cancelable: true,
  })
  document.getElementById('text-input').dispatchEvent(eventToDelete)
}

document.addEventListener('keydown', e => {
  if (e.ctrlKey && e.key == '8') {
    const currentContent = document.querySelector('.lines div.line.cursor-line').textContent
    var content

    if (e.shiftKey) {
      if (!pattern.test(currentContent)) {
        return
      }

      const [, asterisks, title] = currentContent.match(pattern)
      const slicedAsterisks = asterisks.slice(1, asterisks.length)
      if (asterisks.length == 1) {
        content = title
      } else {
        content = `[${asterisks.slice(1, asterisks.length)} ${title}]`
      }
    } else {
      if (pattern.test(currentContent)) {
        const [, asterisks, title] = currentContent.match(pattern)
        content = `${asterisks}* ${title}`
      } else {
        content = `* ${currentContent}`
      }
      content = `[${content}]`
    }

    deleteLine()
    const textInput = document.getElementById('text-input')
    textInput.value = content
    textInput.focus()
    const inputEvent = new InputEvent('input', {
      bubbles: true,
      cancelable: true
    })
    textInput.dispatchEvent(inputEvent)
  }
})

感想

KeyboardEventのコンストラクタに渡すオプション、keyだとだめでkeyCodeだとよかった。あとcancelableをtrueにしておくのがお作法?

置換するところはもっとうまい書き方がありそうだけど動けばいいので