name: core
imports:
  - https://get.silverbullet.md/global.plug.json
syntax:
  Hashtag:
    firstCharacters:
      - "#"
    regex: "#[^#\\d\\s\\[\\]]+\\w+"
    className: sb-hashtag
  NakedURL:
    firstCharacters:
      - "h"
    regex: "https?:\\/\\/[-a-zA-Z0-9@:%._\\+~#=]{1,256}([-a-zA-Z0-9()@:%_\\+.~#?&=\\/]*)"
    className: sb-naked-url
  NamedAnchor:
    firstCharacters:
      - "$"
    regex: "\\$[a-zA-Z\\.\\-\\/]+[\\w\\.\\-\\/]*"
    className: sb-named-anchor
functions:
  setEditorMode:
    path: "./editor.ts:setEditorMode"
    events:
      - editor:init
  toggleVimMode:
    path: "./editor.ts:toggleVimMode"
    command:
      name: "Editor: Toggle Vim Mode"
  toggleDarkMode:
    path: "./editor.ts:toggleDarkMode"
    command:
      name: "Editor: Toggle Dark Mode"

  clearPageIndex:
    path: "./page.ts:clearPageIndex"
    env: server
    events:
      - page:saved
      - page:deleted
  pageQueryProvider:
    path: ./page.ts:pageQueryProvider
    events:
      - query:page
  parseIndexTextRepublish:
    path: "./page.ts:parseIndexTextRepublish"
    events:
      - page:index_text
  reindexSpaceCommand:
    path: "./page.ts:reindexCommand"
    command:
      name: "Space: Reindex"
  reindexSpace:
    path: "./page.ts:reindexSpace"
    env: server
  deletePage:
    path: "./page.ts:deletePage"
    command:
      name: "Page: Delete"

  # Attachments
  attachmentQueryProvider:
    path: ./attachment.ts:attachmentQueryProvider
    events:
      - query:attachment

  # Backlinks
  indexLinks:
    path: "./page.ts:indexLinks"
    events:
      - page:index
  linkQueryProvider:
    path: ./page.ts:linkQueryProvider
    events:
      - query:link
  renamePage:
    path: "./page.ts:renamePage"
    command:
      name: "Page: Rename"
      mac: Cmd-Alt-r
      key: Ctrl-Alt-r
      page: ""

  pageComplete:
    path: "./page.ts:pageComplete"
    events:
      - editor:complete

  # Commands
  commandComplete:
    path: "./command.ts:commandComplete"
    events:
      - editor:complete

  # Item indexing
  indexItem:
    path: "./item.ts:indexItems"
    events:
      - page:index
  itemQueryProvider:
    path: "./item.ts:queryProvider"
    events:
      - query:item

  # Navigation
  linkNavigate:
    path: "./navigate.ts:linkNavigate"
    command:
      name: Navigate To page
      key: Ctrl-Enter
      mac: Cmd-Enter
  clickNavigate:
    path: "./navigate.ts:clickNavigate"
    events:
      - page:click
  navigateHome:
    path: "./navigate.ts:navigateCommand"
    command:
      name: "Navigate: Home"
      key: "Alt-h"
      page: ""

  # Hashtags
  indexTags:
    path: "./tags.ts:indexTags"
    events:
      - page:index
  tagComplete:
    path: "./tags.ts:tagComplete"
    events:
      - editor:complete
  tagProvider:
    path: "./tags.ts:tagProvider"
    events:
      - query:tag

  # Anchors
  indexAnchors:
    path: "./anchor.ts:indexAnchors"
    events:
      - page:index
  anchorComplete:
    path: "./anchor.ts:anchorComplete"
    events:
      - editor:complete

  # Full text search
  searchIndex:
    path: ./search.ts:pageIndex
    events:
      - page:index
  searchUnindex:
    path: "./search.ts:pageUnindex"
    env: server
    events:
      - page:deleted
  searchQueryProvider:
    path: ./search.ts:queryProvider
    events:
      - query:full-text
  searchCommand:
    path: ./search.ts:searchCommand
    command:
      name: "Search Space"
      key: Ctrl-Shift-f
      mac: Cmd-Shift-f
  readPageSearch:
    path: ./search.ts:readFileSearch
    env: server
    pageNamespace:
      pattern: "🔍 .+"
      operation: readFile
  getPageMetaSearch:
    path: ./search.ts:getFileMetaSearch
    env: server
    pageNamespace:
      pattern: "🔍 .+"
      operation: getFileMeta

  # Template commands
  insertTemplateText:
    path: "./template.ts:insertTemplateText"
  applyLineReplace:
    path: ./template.ts:applyLineReplace
  insertFrontMatter:
    redirect: insertTemplateText
    slashCommand:
      name: front-matter
      description: Insert page front matter
      value: |
        ---
        |^|
        ---
  makeH1:
    redirect: applyLineReplace
    slashCommand:
      name: h1
      description: Turn line into h1 header
      match: "^#*\\s*"
      replace: "# "
  makeH2:
    redirect: applyLineReplace
    slashCommand:
      name: h2
      description: Turn line into h2 header
      match: "^#*\\s*"
      replace: "## "
  makeH3:
    redirect: applyLineReplace
    slashCommand:
      name: h3
      description: Turn line into h3 header
      match: "^#*\\s*"
      replace: "### "
  makeH4:
    redirect: applyLineReplace
    slashCommand:
      name: h4
      description: Turn line into h4 header
      match: "^#*\\s*"
      replace: "#### "

  newPage:
    path: ./page.ts:newPageCommand
    command:
      name: "Page: New"
      key: "Alt-Shift-n"

  insertHRTemplate:
    redirect: insertTemplateText
    slashCommand:
      name: hr
      description: Insert a horizontal rule
      value: "---"
  insertTable:
    redirect: insertTemplateText
    slashCommand:
      name: table
      description: Insert a table
      boost: -1 # Low boost because it's likely not very commonly used
      value: |
        | Header A | Header B |
        |----------|----------|
        | Cell A|^| | Cell B |
  quickNoteCommand:
    path: ./template.ts:quickNoteCommand
    command:
      name: "Quick Note"
      key: "Alt-Shift-n"
      priority: 1
  dailyNoteCommand:
    path: ./template.ts:dailyNoteCommand
    command:
      name: "Open Daily Note"
      key: "Alt-Shift-d"
  weeklyNoteCommand:
    path: ./template.ts:weeklyNoteCommand
    command:
      name: "Open Weekly Note"
      key: "Alt-Shift-w"

  instantiateTemplateCommand:
    path: ./template.ts:instantiateTemplateCommand
    command:
      name: "Template: Instantiate Page"
  insertSnippet:
    path: ./template.ts:insertSnippet
    command:
      name: "Template: Insert Snippet"
    slashCommand:
      name: snippet
      description: Insert a snippet
  insertTodayCommand:
    path: "./template.ts:insertTemplateText"
    slashCommand:
      name: today
      description: Insert today's date
      value: "{{today}}"
  insertTomorrowCommand:
    path: "./template.ts:insertTemplateText"
    slashCommand:
      name: tomorrow
      description: Insert tomorrow's date
      value: "{{tomorrow}}"

  # Text editing commands
  quoteSelectionCommand:
    path: ./text.ts:quoteSelection
    command:
      name: "Text: Quote Selection"
      key: "Ctrl-Shift-."
      mac: "Cmd-Shift-."
  listifySelection:
    path: ./text.ts:listifySelection
    command:
      name: "Text: Listify Selection"
      key: "Ctrl-Shift-8"
      mac: "Cmd-Shift-8"
  numberListifySelection:
    path: ./text.ts:numberListifySelection
    command:
      name: "Text: Number Listify Selection"
  linkSelection:
    path: ./text.ts:linkSelection
    command:
      name: "Text: Link Selection"
      key: "Ctrl-Shift-k"
      mac: "Cmd-Shift-k"
  bold:
    path: ./text.ts:wrapSelection
    command:
      name: "Text: Bold"
      key: "Ctrl-b"
      mac: "Cmd-b"
      wrapper: "**"
  italic:
    path: ./text.ts:wrapSelection
    command:
      name: "Text: Italic"
      key: "Ctrl-i"
      mac: "Cmd-i"
      wrapper: "_"
  strikethrough:
    path: ./text.ts:wrapSelection
    command:
      name: "Text: Strikethrough"
      key: "Ctrl-Shift-s"
      mac: "Cmd-Shift-s"
      wrapper: "~~"
  marker:
    path: ./text.ts:wrapSelection
    command:
      name: "Text: Marker"
      key: "Alt-m"
      wrapper: "=="

  # Refactoring Commands
  extractToPageCommand:
    path: ./refactor.ts:extractToPage
    command:
      name: "Extract text to new page"

  # Plug manager
  updatePlugsCommand:
    path: ./plugmanager.ts:updatePlugsCommand
    command:
      name: "Plugs: Update"
      key: "Ctrl-Shift-p"
      mac: "Cmd-Shift-p"
  updatePlugs:
    path: ./plugmanager.ts:updatePlugs
    env: server
  getPlugHTTPS:
    path: "./plugmanager.ts:getPlugHTTPS"
    events:
      - get-plug:https
  getPlugGithub:
    path: "./plugmanager.ts:getPlugGithub"
    events:
      - get-plug:github
  getPlugGithubRelease:
    path: "./plugmanager.ts:getPlugGithubRelease"
    events:
      - get-plug:ghr
  addPlugCommand:
    path: ./plugmanager.ts:addPlugCommand
    command:
      name: "Plugs: Add"

  # Debug commands
  parseCommand:
    path: ./debug.ts:parsePageCommand
    command:
      name: "Debug: Parse Document"
  showLogsCommand:
    path: ./debug.ts:showLogsCommand
    command:
      name: "Show Logs"
      key: "Ctrl-Alt-l"
      mac: "Cmd-Alt-l"
  hideBhsCommand:
    path: ./debug.ts:hideBhsCommand
    command:
      name: "UI: Hide BHS"
      key: "Ctrl-Alt-b"
      mac: "Cmd-Alt-b"
    events:
      - log:hide

  # Link unfurl infrastructure
  unfurlLink:
    path: ./link.ts:unfurlCommand
    command:
      name: "Link: Unfurl"
      key: "Ctrl-Shift-u"
      mac: "Cmd-Shift-u"
      contexts:
        - NakedURL
  unfurlExec:
    env: server
    path: ./link.ts:unfurlExec

  # Title-based link unfurl
  titleUnfurlOptions:
    path: ./link.ts:titleUnfurlOptions
    events:
      - unfurl:options
  titleUnfurl:
    path: ./link.ts:titleUnfurl
    events:
      - unfurl:title-unfurl

  embedWidget:
    path: ./embed.ts:embedWidget
    codeWidget: embed

  # Random stuff
  statsCommand:
    path: ./stats.ts:statsCommand
    command:
      name: "Stats: Show"

  # Cloud pages
  readPageCloud:
    path: ./cloud.ts:readFileCloud
    env: server
    pageNamespace:
      pattern: "💭 .+"
      operation: readFile
  getPageMetaCloud:
    path: ./cloud.ts:getFileMetaCloud
    env: server
    pageNamespace:
      pattern: "💭 .+"
      operation: getFileMeta