Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

Description

@nmay231

Using tomlkit 0.14.0 and trying to read the following example:

# example.toml
[my_table]
key = {
inner = 1
}

Running:

uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

Gets the following error:

tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

Traceback (most recent call last):
File "<string>", line 1, in<module>
import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
return parse(string)
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
returnParser(string).parse()
~~~~~~~~~~~~~~~~~~~~^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
key, value = self._parse_table()
~~~~~~~~~~~~~~~~~^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
item = self._parse_item()
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
return self._parse_key_value(True)
~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
val = self._parse_value()
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
returnself._parse_inline_table()
~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
key, val = self._parse_key_value(False)
~~~~~~~~~~~~~~~~~~~~~^^^^^^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
key = self._parse_key()
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
returnself._parse_bare_key()
~~~~~~~~~~~~~~~~~~~~^^
File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
raise self.parse_error(EmptyKeyError)
tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

Thank you for your time and effort with this package.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
       blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      
      Skip to content

      Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

      Description

      @nmay231

      Using tomlkit 0.14.0 and trying to read the following example:

      # example.toml
      [my_table]
      key = {
      inner = 1
      }

      Running:

      uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

      Gets the following error:

      tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

      Traceback (most recent call last):
      File "<string>", line 1, in<module>
      import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
      ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
      return parse(string)
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
      returnParser(string).parse()
      ~~~~~~~~~~~~~~~~~~~~^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
      key, value = self._parse_table()
      ~~~~~~~~~~~~~~~~~^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
      item = self._parse_item()
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
      return self._parse_key_value(True)
      ~~~~~~~~~~~~~~~~~~~~~^^^^^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
      val = self._parse_value()
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
      returnself._parse_inline_table()
      ~~~~~~~~~~~~~~~~~~~~~~~~^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
      key, val = self._parse_key_value(False)
      ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
      key = self._parse_key()
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
      returnself._parse_bare_key()
      ~~~~~~~~~~~~~~~~~~~~^^
      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
      raise self.parse_error(EmptyKeyError)
      tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

      And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

      Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

      Thank you for your time and effort with this package.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

          Description

          @nmay231

          Using tomlkit 0.14.0 and trying to read the following example:

          # example.toml
          [my_table]
          key = {
          inner = 1
          }

          Running:

          uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

          Gets the following error:

          tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

          Traceback (most recent call last):
          File "<string>", line 1, in<module>
          import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
          ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
          return parse(string)
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
          returnParser(string).parse()
          ~~~~~~~~~~~~~~~~~~~~^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
          key, value = self._parse_table()
          ~~~~~~~~~~~~~~~~~^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
          item = self._parse_item()
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
          return self._parse_key_value(True)
          ~~~~~~~~~~~~~~~~~~~~~^^^^^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
          val = self._parse_value()
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
          returnself._parse_inline_table()
          ~~~~~~~~~~~~~~~~~~~~~~~~^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
          key, val = self._parse_key_value(False)
          ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
          key = self._parse_key()
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
          returnself._parse_bare_key()
          ~~~~~~~~~~~~~~~~~~~~^^
          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
          raise self.parse_error(EmptyKeyError)
          tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

          And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

          Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

          Thank you for your time and effort with this package.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

              Description

              @nmay231

              Using tomlkit 0.14.0 and trying to read the following example:

              # example.toml
              [my_table]
              key = {
              inner = 1
              }

              Running:

              uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

              Gets the following error:

              tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

              Traceback (most recent call last):
              File "<string>", line 1, in<module>
              import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
              ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
              return parse(string)
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
              returnParser(string).parse()
              ~~~~~~~~~~~~~~~~~~~~^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
              key, value = self._parse_table()
              ~~~~~~~~~~~~~~~~~^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
              item = self._parse_item()
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
              return self._parse_key_value(True)
              ~~~~~~~~~~~~~~~~~~~~~^^^^^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
              val = self._parse_value()
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
              returnself._parse_inline_table()
              ~~~~~~~~~~~~~~~~~~~~~~~~^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
              key, val = self._parse_key_value(False)
              ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
              key = self._parse_key()
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
              returnself._parse_bare_key()
              ~~~~~~~~~~~~~~~~~~~~^^
              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
              raise self.parse_error(EmptyKeyError)
              tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

              And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

              Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

              Thank you for your time and effort with this package.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

                  Description

                  @nmay231

                  Using tomlkit 0.14.0 and trying to read the following example:

                  # example.toml
                  [my_table]
                  key = {
                  inner = 1
                  }

                  Running:

                  uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

                  Gets the following error:

                  tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                  Traceback (most recent call last):
                  File "<string>", line 1, in<module>
                  import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
                  ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
                  return parse(string)
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
                  returnParser(string).parse()
                  ~~~~~~~~~~~~~~~~~~~~^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
                  key, value = self._parse_table()
                  ~~~~~~~~~~~~~~~~~^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
                  item = self._parse_item()
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
                  return self._parse_key_value(True)
                  ~~~~~~~~~~~~~~~~~~~~~^^^^^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
                  val = self._parse_value()
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
                  returnself._parse_inline_table()
                  ~~~~~~~~~~~~~~~~~~~~~~~~^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
                  key, val = self._parse_key_value(False)
                  ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
                  key = self._parse_key()
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
                  returnself._parse_bare_key()
                  ~~~~~~~~~~~~~~~~~~~~^^
                  File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
                  raise self.parse_error(EmptyKeyError)
                  tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                  And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

                  Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

                  Thank you for your time and effort with this package.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

                      Description

                      @nmay231

                      Using tomlkit 0.14.0 and trying to read the following example:

                      # example.toml
                      [my_table]
                      key = {
                      inner = 1
                      }

                      Running:

                      uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

                      Gets the following error:

                      tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                      Traceback (most recent call last):
                      File "<string>", line 1, in<module>
                      import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
                      ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
                      return parse(string)
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
                      returnParser(string).parse()
                      ~~~~~~~~~~~~~~~~~~~~^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
                      key, value = self._parse_table()
                      ~~~~~~~~~~~~~~~~~^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
                      item = self._parse_item()
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
                      return self._parse_key_value(True)
                      ~~~~~~~~~~~~~~~~~~~~~^^^^^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
                      val = self._parse_value()
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
                      returnself._parse_inline_table()
                      ~~~~~~~~~~~~~~~~~~~~~~~~^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
                      key, val = self._parse_key_value(False)
                      ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
                      key = self._parse_key()
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
                      returnself._parse_bare_key()
                      ~~~~~~~~~~~~~~~~~~~~^^
                      File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
                      raise self.parse_error(EmptyKeyError)
                      tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                      And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

                      Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

                      Thank you for your time and effort with this package.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

                          Description

                          @nmay231

                          Using tomlkit 0.14.0 and trying to read the following example:

                          # example.toml
                          [my_table]
                          key = {
                          inner = 1
                          }

                          Running:

                          uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

                          Gets the following error:

                          tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                          Traceback (most recent call last):
                          File "<string>", line 1, in<module>
                          import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
                          ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
                          return parse(string)
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
                          returnParser(string).parse()
                          ~~~~~~~~~~~~~~~~~~~~^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
                          key, value = self._parse_table()
                          ~~~~~~~~~~~~~~~~~^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
                          item = self._parse_item()
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
                          return self._parse_key_value(True)
                          ~~~~~~~~~~~~~~~~~~~~~^^^^^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
                          val = self._parse_value()
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
                          returnself._parse_inline_table()
                          ~~~~~~~~~~~~~~~~~~~~~~~~^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
                          key, val = self._parse_key_value(False)
                          ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
                          key = self._parse_key()
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
                          returnself._parse_bare_key()
                          ~~~~~~~~~~~~~~~~~~~~^^
                          File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
                          raise self.parse_error(EmptyKeyError)
                          tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                          And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

                          Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

                          Thank you for your time and effort with this package.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Multiline inline-tables are allowed in TOML 1.1.0, but not yet supported by tomlkit #465

                              Description

                              @nmay231

                              Using tomlkit 0.14.0 and trying to read the following example:

                              # example.toml
                              [my_table]
                              key = {
                              inner = 1
                              }

                              Running:

                              uv run python -c "import tomlkit, pathlib; tomlkit.loads(pathlib.Path('./example.toml').read_text())"

                              Gets the following error:

                              tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                              Traceback (most recent call last):
                              File "<string>", line 1, in<module>
                              import tomlkit, pathlib;tomlkit.loads(pathlib.Path('./example.toml').read_text())
                              ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 52, in loads
                              return parse(string)
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/api.py", line 99, in parse
                              returnParser(string).parse()
                              ~~~~~~~~~~~~~~~~~~~~^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 154, in parse
                              key, value = self._parse_table()
                              ~~~~~~~~~~~~~~~~~^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 1001, in _parse_table
                              item = self._parse_item()
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 238, in _parse_item
                              return self._parse_key_value(True)
                              ~~~~~~~~~~~~~~~~~~~~~^^^^^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 331, in _parse_key_value
                              val = self._parse_value()
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 437, in _parse_value
                              returnself._parse_inline_table()
                              ~~~~~~~~~~~~~~~~~~~~~~~~^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 654, in _parse_inline_table
                              key, val = self._parse_key_value(False)
                              ~~~~~~~~~~~~~~~~~~~~~^^^^^^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 311, in _parse_key_value
                              key = self._parse_key()
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 360, in _parse_key
                              returnself._parse_bare_key()
                              ~~~~~~~~~~~~~~~~~~~~^^
                              File "/home/acsi/tmp-tomlkit-bug/.venv/lib/python3.13/site-packages/tomlkit/parser.py", line 404, in _parse_bare_key
                              raise self.parse_error(EmptyKeyError)
                              tomlkit.exceptions.EmptyKeyError: Empty key at line 3 col 7

                              And according to the TOML 1.1.0 spec, newlines inside of inline tables should now be supported.

                              Inline tables can have multiple key/value pairs on the same line, or they can be put on different lines. A terminating comma (also called trailing comma) is permitted after the last key/value pair.

                              Thank you for your time and effort with this package.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions