From fe2aefee35c62878deccfca34b30b6d5f41c065d Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 09:21:14 +0100 Subject: [PATCH 01/13] Show languages in the docs sidebar --- .../src/docs/user/languages/_category_.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 packages/cursorless-org-docs/src/docs/user/languages/_category_.json diff --git a/packages/cursorless-org-docs/src/docs/user/languages/_category_.json b/packages/cursorless-org-docs/src/docs/user/languages/_category_.json deleted file mode 100644 index e7b327b868..0000000000 --- a/packages/cursorless-org-docs/src/docs/user/languages/_category_.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "className": "hidden" -} From 5f8e369c30eed93f2358994ad98b74c72a9329a8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 12:15:48 +0100 Subject: [PATCH 02/13] Refactoring --- packages/common/src/index.ts | 1 + packages/common/src/util/capitalize.ts | 3 + .../src/docs/user/languages/ScopeSupport.tsx | 82 ---------------- .../src/docs/user/languages/c.mdx | 2 +- .../src/docs/user/languages/clojure.mdx | 2 +- .../languages/{ => components}/Language.tsx | 4 +- .../languages/components/ScopeSupport.tsx | 76 +++++++++++++++ .../components/ScopeSupportForLevel.tsx | 95 +++++++++++++++++++ .../src/docs/user/languages/cpp.mdx | 2 +- .../src/docs/user/languages/csharp.mdx | 2 +- .../src/docs/user/languages/css.mdx | 2 +- .../src/docs/user/languages/dart.mdx | 4 +- .../src/docs/user/languages/go.mdx | 2 +- .../src/docs/user/languages/html.mdx | 2 +- .../src/docs/user/languages/java.mdx | 2 +- .../src/docs/user/languages/javascript.mdx | 2 +- .../docs/user/languages/javascriptreact.mdx | 2 +- .../src/docs/user/languages/json.mdx | 2 +- .../src/docs/user/languages/jsonc.mdx | 2 +- .../src/docs/user/languages/jsonl.mdx | 2 +- .../src/docs/user/languages/latex.mdx | 2 +- .../src/docs/user/languages/lua.mdx | 2 +- .../src/docs/user/languages/markdown.mdx | 2 +- .../src/docs/user/languages/php.mdx | 2 +- .../src/docs/user/languages/python.mdx | 2 +- .../src/docs/user/languages/ruby.mdx | 2 +- .../src/docs/user/languages/rust.mdx | 2 +- .../src/docs/user/languages/scala.mdx | 2 +- .../src/docs/user/languages/scm.mdx | 2 +- .../src/docs/user/languages/scss.mdx | 2 +- .../src/docs/user/languages/talon.mdx | 2 +- .../src/docs/user/languages/typescript.mdx | 2 +- .../docs/user/languages/typescriptreact.mdx | 2 +- .../src/docs/user/languages/xml.mdx | 2 +- .../src/docs/user/languages/yaml.mdx | 2 +- .../src/updateLanguageScopeSupportConfig.ts | 2 +- .../src/TestCaseRecorder.ts | 5 +- 37 files changed, 209 insertions(+), 119 deletions(-) create mode 100644 packages/common/src/util/capitalize.ts delete mode 100644 packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx rename packages/cursorless-org-docs/src/docs/user/languages/{ => components}/Language.tsx (55%) create mode 100644 packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx create mode 100644 packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 49599e44f2..488f87ce3f 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -93,6 +93,7 @@ export * from "./types/TreeSitter"; export * from "./types/tutorial.types"; export * from "./util"; export * from "./util/camelCaseToAllDown"; +export * from "./util/capitalize"; export * from "./util/clientSupportsFallback"; export * from "./util/CompositeKeyDefaultMap"; export * from "./util/CompositeKeyMap"; diff --git a/packages/common/src/util/capitalize.ts b/packages/common/src/util/capitalize.ts new file mode 100644 index 0000000000..7519095d07 --- /dev/null +++ b/packages/common/src/util/capitalize.ts @@ -0,0 +1,3 @@ +export function capitalize(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} diff --git a/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx deleted file mode 100644 index d291f722d1..0000000000 --- a/packages/cursorless-org-docs/src/docs/user/languages/ScopeSupport.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { - ScopeSupportFacetLevel, - languageScopeSupport, - scopeSupportFacets, - type ScopeSupportFacet, -} from "@cursorless/common"; -import React from "react"; - -interface Props { - languageId: string; -} - -export default function ScopeSupport({ languageId }: Props) { - const scopesSorted = [...scopeSupportFacets].sort(); - const scopeSupport = languageScopeSupport[languageId] ?? {}; - - const supportedScopes = scopesSorted.filter( - (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supported, - ); - const supportedLegacyScopes = scopesSorted.filter( - (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supportedLegacy, - ); - const unsupportedScopes = scopesSorted.filter( - (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.unsupported, - ); - const unspecifiedScopes = scopesSorted.filter( - (facet) => scopeSupport[facet] == null, - ); - - return ( - <> - {getContentForSupportLevel( - supportedScopes, - "Supported facets", - "These facets are supported", - )} - {getContentForSupportLevel( - supportedLegacyScopes, - "Supported Legacy facets", - "These facets are supported with the legacy implementation and should be migrated to the new implementation", - )} - {getContentForSupportLevel( - unsupportedScopes, - "Unsupported facets", - "These facets are not supported yet and needs a developer to implement them", - )} - {getContentForSupportLevel( - unspecifiedScopes, - "Unspecified facets", - <> - These facets are unspecified
- - Note that in many instances we actually do support these scopes, but - we have not yet updated `languageScopeSupport` to reflect this fact - - , - )} - - ); -} - -function getContentForSupportLevel( - facets: ScopeSupportFacet[], - title: string, - description: React.ReactNode, -) { - if (facets.length === 0) { - return null; - } - return ( -
-

{title}

-

{description}

- -
    - {facets.map((facet) => ( -
  • {facet}
  • - ))} -
-
- ); -} diff --git a/packages/cursorless-org-docs/src/docs/user/languages/c.mdx b/packages/cursorless-org-docs/src/docs/user/languages/c.mdx index 561b32b48f..ce075f921b 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/c.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/c.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # C diff --git a/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx b/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx index a430ed47e4..55c123d0c4 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/clojure.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Clojure diff --git a/packages/cursorless-org-docs/src/docs/user/languages/Language.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx similarity index 55% rename from packages/cursorless-org-docs/src/docs/user/languages/Language.tsx rename to packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx index 811d3377ee..1fa19d671d 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/Language.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/Language.tsx @@ -1,10 +1,10 @@ import React from "react"; -import ScopeSupport from "./ScopeSupport"; +import { ScopeSupport } from "./ScopeSupport"; interface Props { languageId: string; } -export default function Language({ languageId }: Props) { +export function Language({ languageId }: Props) { return ; } diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx new file mode 100644 index 0000000000..f6d26fad44 --- /dev/null +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -0,0 +1,76 @@ +import { + ScopeSupportFacetLevel, + languageScopeSupport, + scopeSupportFacets, +} from "@cursorless/common"; +import React from "react"; +import { ScopeSupportForLevel } from "./ScopeSupportForLevel"; + +interface Props { + languageId: string; +} + +export function ScopeSupport({ languageId }: Props): JSX.Element { + const scopesSorted = [...scopeSupportFacets].sort(); + const scopeSupport = languageScopeSupport[languageId] ?? {}; + + const supportedScopes = scopesSorted.filter( + (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supported, + ); + const supportedLegacyScopes = scopesSorted.filter( + (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.supportedLegacy, + ); + const unsupportedScopes = scopesSorted.filter( + (facet) => scopeSupport[facet] === ScopeSupportFacetLevel.unsupported, + ); + const unspecifiedScopes = scopesSorted.filter( + (facet) => scopeSupport[facet] == null, + ); + + return ( + <> + + + + + + These facets are not supported yet and needs a developer to + implement them.
+ We would happily accept + [contributions](https://www.cursorless.org/docs/contributing/adding-a-new-scope). + + } + /> + + + These facets are unspecified
+ + Note that in many instances we actually do support these scopes, + but we have not yet updated `languageScopeSupport` to reflect this + fact. We would happily accept + [contributions](https://www.cursorless.org/docs/contributing/adding-a-new-scope). + + + } + /> + + ); +} diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx new file mode 100644 index 0000000000..67222255cf --- /dev/null +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx @@ -0,0 +1,95 @@ +import { + camelCaseToAllDown, + capitalize, + groupBy, + type ScopeSupportFacet, + type ScopeSupportFacetInfo, + scopeSupportFacetInfos, + type ScopeType, + type SimpleScopeTypeType, +} from "@cursorless/common"; +import React from "react"; + +interface Props { + facets: ScopeSupportFacet[]; + title: string; + description: React.ReactNode; +} + +export function ScopeSupportForLevel({ + facets, + title, + description, +}: Props): JSX.Element | null { + if (facets.length === 0) { + return null; + } + const facetInfos = facets.map( + (facet): AugmentedFacetInfo => ({ + facet, + ...scopeSupportFacetInfos[facet], + }), + ); + const scopeGroups: Map = groupBy( + facetInfos, + (facetInfo) => serializeScopeType(facetInfo.scopeType), + ); + const scopeTypes = Array.from(scopeGroups.keys()).sort(); + return ( +
+

{title}

+

{description}

+ + {scopeTypes.map((scopeType) => { + const facetInfos = scopeGroups.get(scopeType) ?? []; + return ( +
+

{prettifyScopeType(scopeType)}

+
    + {facetInfos.map((facetInfo) => { + return ( +
  • + + {prettifyFacet(facetInfo.facet)} + + : {facetInfo.description} +
  • + ); + })} +
+
+ ); + })} +
+ ); +} + +interface AugmentedFacetInfo extends ScopeSupportFacetInfo { + facet: ScopeSupportFacet; +} + +function prettifyScopeType(scopeType: string): string { + return capitalize(camelCaseToAllDown(scopeType)); +} + +function prettifyFacet(facet: ScopeSupportFacet): string { + const parts = facet.split(".").map(camelCaseToAllDown); + if (parts.length === 1) { + return capitalize(parts[0]); + } + const isIteration = parts[parts.length - 1] === "iteration"; + if (isIteration) { + parts.pop(); + } + const name = capitalize(parts.slice(1).join(" ")); + return isIteration ? `${name} (iteration)` : name; +} + +function serializeScopeType( + scopeType: SimpleScopeTypeType | ScopeType, +): string { + if (typeof scopeType === "string") { + return scopeType; + } + return scopeType.type; +} diff --git a/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx b/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx index f4fd89dd05..86f2175a9d 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/cpp.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # C++ diff --git a/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx b/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx index 2352ae98c8..64cbda64f4 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/csharp.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # C# diff --git a/packages/cursorless-org-docs/src/docs/user/languages/css.mdx b/packages/cursorless-org-docs/src/docs/user/languages/css.mdx index c68e63f9cd..cb6de3f8a9 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/css.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/css.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # CSS diff --git a/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx b/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx index fe37a25c4f..7b18b06670 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/dart.mdx @@ -1,5 +1,5 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; -# dart +# Dart diff --git a/packages/cursorless-org-docs/src/docs/user/languages/go.mdx b/packages/cursorless-org-docs/src/docs/user/languages/go.mdx index f4da2f5dec..3c0b9c041e 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/go.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/go.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Go diff --git a/packages/cursorless-org-docs/src/docs/user/languages/html.mdx b/packages/cursorless-org-docs/src/docs/user/languages/html.mdx index 603c34f00d..34304c31e1 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/html.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/html.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # HTML diff --git a/packages/cursorless-org-docs/src/docs/user/languages/java.mdx b/packages/cursorless-org-docs/src/docs/user/languages/java.mdx index bc895469cb..77d64f7276 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/java.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/java.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Java diff --git a/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx b/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx index 66b80498ab..4a86aa892d 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/javascript.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Javascript diff --git a/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx b/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx index 6f9b4b8779..72272270cc 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/javascriptreact.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Javascript react diff --git a/packages/cursorless-org-docs/src/docs/user/languages/json.mdx b/packages/cursorless-org-docs/src/docs/user/languages/json.mdx index 732709bfe9..076ad1aebb 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/json.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/json.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # JSON diff --git a/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx b/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx index a83af5d7bd..d9d32c3ac5 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/jsonc.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # JSON with comments (JSONC) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx b/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx index 03614b7850..5e5cb9851a 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/jsonl.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # JSON lines (JSONL) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx b/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx index c56cfbccfa..2122e8b23b 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/latex.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Latex diff --git a/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx b/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx index f0722123cf..f76d593649 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/lua.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Lua diff --git a/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx b/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx index 4b53715921..e6a256e223 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/markdown.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Markdown diff --git a/packages/cursorless-org-docs/src/docs/user/languages/php.mdx b/packages/cursorless-org-docs/src/docs/user/languages/php.mdx index f46cb45e51..9551cb922e 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/php.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/php.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # PHP diff --git a/packages/cursorless-org-docs/src/docs/user/languages/python.mdx b/packages/cursorless-org-docs/src/docs/user/languages/python.mdx index f84d93f9b2..250536d69d 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/python.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/python.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Python diff --git a/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx b/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx index 434490a711..9f9215458b 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/ruby.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Ruby diff --git a/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx b/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx index f4bd8d55ab..d0b1f73959 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/rust.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Rust diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx index 921ad69194..ffba794182 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/scala.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Scala diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx index 2c6e3d7a44..cca1d1e187 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/scm.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Tree sitter query language (scm) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx b/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx index 44891422a4..e86ec7e2a3 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/scss.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # SCSS diff --git a/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx b/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx index 9072d500ed..47c6cc1c98 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/talon.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Talon diff --git a/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx b/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx index 855dfa95f1..c8588b5f63 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/typescript.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Typescript diff --git a/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx b/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx index e8af5501f9..fe16d1c820 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/typescriptreact.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Typescript react diff --git a/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx b/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx index a6176bec74..b61d67a423 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/xml.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # XML diff --git a/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx b/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx index b44892f5ac..9ba23a4a87 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx +++ b/packages/cursorless-org-docs/src/docs/user/languages/yaml.mdx @@ -1,4 +1,4 @@ -import Language from "./Language"; +import { Language } from "./components/Language"; # Yaml diff --git a/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts b/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts index e20fbe3649..57c3b6e82c 100644 --- a/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts +++ b/packages/meta-updater/src/updateLanguageScopeSupportConfig.ts @@ -14,7 +14,7 @@ export function updateLanguageMdxConfig( } const expected = ` -import Language from "./Language"; +import { Language } from "./components/Language"; # ${languageId} diff --git a/packages/test-case-recorder/src/TestCaseRecorder.ts b/packages/test-case-recorder/src/TestCaseRecorder.ts index d70ace7e79..fb6dd24c6b 100644 --- a/packages/test-case-recorder/src/TestCaseRecorder.ts +++ b/packages/test-case-recorder/src/TestCaseRecorder.ts @@ -12,6 +12,7 @@ import type { TextEditorOptions, } from "@cursorless/common"; import { + capitalize, DEFAULT_TEXT_EDITOR_OPTIONS_FOR_TEST, extractTargetedMarks, getKey, @@ -507,10 +508,6 @@ function camelize(str: string) { .join(""); } -function capitalize(str: string) { - return str.charAt(0).toUpperCase() + str.slice(1); -} - async function readJsonIfExists( path: string, ): Promise { From 73ff2d6a9a7963f68202f469e3a2fe6764580580 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 13:05:19 +0100 Subject: [PATCH 03/13] Added cards --- .../cursorless-org-docs/src/css/custom.css | 16 ++++ .../languages/components/ScopeSupport.tsx | 39 ++++---- .../components/ScopeSupportForLevel.tsx | 96 ++++++++++++------- 3 files changed, 96 insertions(+), 55 deletions(-) diff --git a/packages/cursorless-org-docs/src/css/custom.css b/packages/cursorless-org-docs/src/css/custom.css index f6b6fa3065..8b22e925ff 100644 --- a/packages/cursorless-org-docs/src/css/custom.css +++ b/packages/cursorless-org-docs/src/css/custom.css @@ -28,3 +28,19 @@ .hidden { display: none; } + +.card { + border: 1px solid rgba(0, 0, 0, 0.175); + margin-bottom: 1rem; +} + +.card-header { + background-color: #f8f9fa; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); + padding: 0.5rem 1rem; + cursor: pointer; +} + +.card-body { + padding: 1rem; +} diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index f6d26fad44..e7af0aced5 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -31,43 +31,44 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { <> - These facets are not supported yet and needs a developer to - implement them.
- We would happily accept - [contributions](https://www.cursorless.org/docs/contributing/adding-a-new-scope). + We would happily accept{" "} + + contributions + } /> - These facets are unspecified
- - Note that in many instances we actually do support these scopes, - but we have not yet updated `languageScopeSupport` to reflect this - fact. We would happily accept - [contributions](https://www.cursorless.org/docs/contributing/adding-a-new-scope). - + Note that in many instances we actually do support these scopes, but + we have not yet updated 'languageScopeSupport' to reflect this fact. +
+ We would happily accept{" "} + + contributions + } /> diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx index 67222255cf..15929edf70 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx @@ -8,58 +8,82 @@ import { type ScopeType, type SimpleScopeTypeType, } from "@cursorless/common"; -import React from "react"; +import React, { useState } from "react"; interface Props { facets: ScopeSupportFacet[]; title: string; - description: React.ReactNode; + subtitle: string; + description?: React.ReactNode; + expanded?: boolean; } export function ScopeSupportForLevel({ facets, title, + subtitle, description, + expanded: expandedProp, }: Props): JSX.Element | null { + const [expanded, setExpanded] = useState(expandedProp ?? false); + if (facets.length === 0) { return null; } - const facetInfos = facets.map( - (facet): AugmentedFacetInfo => ({ - facet, - ...scopeSupportFacetInfos[facet], - }), - ); - const scopeGroups: Map = groupBy( - facetInfos, - (facetInfo) => serializeScopeType(facetInfo.scopeType), - ); - const scopeTypes = Array.from(scopeGroups.keys()).sort(); + + const renderBody = () => { + if (!expanded) { + return null; + } + + const facetInfos = facets.map( + (facet): AugmentedFacetInfo => ({ + facet, + ...scopeSupportFacetInfos[facet], + }), + ); + const scopeGroups: Map = groupBy( + facetInfos, + (facetInfo) => serializeScopeType(facetInfo.scopeType), + ); + const scopeTypes = Array.from(scopeGroups.keys()).sort(); + + return ( +
+ {description &&

{description}

} + + {scopeTypes.map((scopeType) => { + const facetInfos = scopeGroups.get(scopeType) ?? []; + return ( +
+

{prettifyScopeType(scopeType)}

+
    + {facetInfos.map((facetInfo) => { + return ( +
  • + + {prettifyFacet(facetInfo.facet)} + + : {facetInfo.description} +
  • + ); + })} +
+
+ ); + })} +
+ ); + }; + return ( -
-

{title}

-

{description}

+
+
setExpanded(!expanded)}> +

{title}

+ {subtitle} +
- {scopeTypes.map((scopeType) => { - const facetInfos = scopeGroups.get(scopeType) ?? []; - return ( -
-

{prettifyScopeType(scopeType)}

-
    - {facetInfos.map((facetInfo) => { - return ( -
  • - - {prettifyFacet(facetInfo.facet)} - - : {facetInfo.description} -
  • - ); - })} -
-
- ); - })} + {renderBody()}
); } From 70461fb69aedb0b7633da14f9fd62e7d5b1177d8 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 13:06:05 +0100 Subject: [PATCH 04/13] Update description --- .../src/docs/user/languages/components/ScopeSupport.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index e7af0aced5..bc8f875033 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -62,8 +62,9 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { subtitle="These facets are unspecified" description={ <> - Note that in many instances we actually do support these scopes, but - we have not yet updated 'languageScopeSupport' to reflect this fact. + Note that in many instances we actually do support these scopes and + facets, but we have not yet updated 'languageScopeSupport' to + reflect this fact.
We would happily accept{" "} From 08d0fe908eaf4b096a0b81a195a2990571e3587d Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 13:23:48 +0100 Subject: [PATCH 05/13] Reduce font weight on facet names --- packages/cursorless-org-docs/src/css/custom.css | 4 ++++ .../docs/user/languages/components/ScopeSupportForLevel.tsx | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/cursorless-org-docs/src/css/custom.css b/packages/cursorless-org-docs/src/css/custom.css index 8b22e925ff..e85ded5046 100644 --- a/packages/cursorless-org-docs/src/css/custom.css +++ b/packages/cursorless-org-docs/src/css/custom.css @@ -44,3 +44,7 @@ .card-body { padding: 1rem; } + +.facet-name { + font-weight: 600; +} diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx index 15929edf70..1026ea64d9 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupportForLevel.tsx @@ -61,9 +61,9 @@ export function ScopeSupportForLevel({ {facetInfos.map((facetInfo) => { return (
  • - + {prettifyFacet(facetInfo.facet)} - + : {facetInfo.description}
  • ); From e540dd4b287db59d5c489960108f72a4efe6ab7f Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 13:30:42 +0100 Subject: [PATCH 06/13] Added description of a facet --- .../docs/user/languages/components/ScopeSupport.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index bc8f875033..830699d1b8 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -29,19 +29,25 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { return ( <> +

    Scope facets

    +

    + A scope facet is a specific subset of a scope that Cursorless can + target. For example take the value scope. One facet of value is the + right hand side of a variable assignment. Another facet of value is the + value in a map pair. +

    + c - - } /> - Date: Wed, 19 Feb 2025 13:32:01 +0100 Subject: [PATCH 07/13] Update description --- .../src/docs/user/languages/components/ScopeSupport.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index 830699d1b8..bb8c471af3 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -33,8 +33,9 @@ export function ScopeSupport({ languageId }: Props): JSX.Element {

    A scope facet is a specific subset of a scope that Cursorless can target. For example take the value scope. One facet of value is the - right hand side of a variable assignment. Another facet of value is the - value in a map pair. + right hand side of a variable assignment, another facet of value is the + value in a map pair and a third is the return value in a return + statement.

    c Date: Wed, 19 Feb 2025 13:32:21 +0100 Subject: [PATCH 08/13] Clean up --- .../src/docs/user/languages/components/ScopeSupport.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index bb8c471af3..e3e5a3b682 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -37,7 +37,7 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { value in a map pair and a third is the return value in a return statement.

    - c + Date: Wed, 19 Feb 2025 13:33:45 +0100 Subject: [PATCH 09/13] Padding --- .../src/docs/user/languages/components/ScopeSupport.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index e3e5a3b682..f889f9e3c0 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -44,11 +44,13 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { subtitle="These facets are supported" expanded /> + + } /> + Date: Wed, 19 Feb 2025 13:34:12 +0100 Subject: [PATCH 10/13] More padding --- .../src/docs/user/languages/components/ScopeSupport.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index f889f9e3c0..8c11f55e92 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -30,6 +30,7 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { return ( <>

    Scope facets

    +

    A scope facet is a specific subset of a scope that Cursorless can target. For example take the value scope. One facet of value is the From 5b8cf20f225471643dc352609e0af608ce979206 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 13:36:42 +0100 Subject: [PATCH 11/13] Added changelog --- changelog/2025-02-addedLanguagesToDocs.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 changelog/2025-02-addedLanguagesToDocs.md diff --git a/changelog/2025-02-addedLanguagesToDocs.md b/changelog/2025-02-addedLanguagesToDocs.md new file mode 100644 index 0000000000..7bde40e5ff --- /dev/null +++ b/changelog/2025-02-addedLanguagesToDocs.md @@ -0,0 +1,6 @@ +--- +tags: [enhancement, documentation] +pullRequest: 2859 +--- + +- Added languages sidebar to documents page. Here you can see the supported scope facets for each language. From 7f16548947a91b0ccde558793ed3016b980e76ef Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Wed, 19 Feb 2025 13:37:50 +0100 Subject: [PATCH 12/13] Update tags --- changelog/2025-02-addedLanguagesToDocs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/2025-02-addedLanguagesToDocs.md b/changelog/2025-02-addedLanguagesToDocs.md index 7bde40e5ff..f94812f99c 100644 --- a/changelog/2025-02-addedLanguagesToDocs.md +++ b/changelog/2025-02-addedLanguagesToDocs.md @@ -1,5 +1,5 @@ --- -tags: [enhancement, documentation] +tags: [documentation] pullRequest: 2859 --- From b66ea8d148555d36fd235324e62d26f5fb46677b Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Fri, 21 Feb 2025 15:30:40 +0100 Subject: [PATCH 13/13] Rename header and remove facet description --- .../docs/user/languages/components/ScopeSupport.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx index 8c11f55e92..fc344857a4 100644 --- a/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx +++ b/packages/cursorless-org-docs/src/docs/user/languages/components/ScopeSupport.tsx @@ -29,15 +29,7 @@ export function ScopeSupport({ languageId }: Props): JSX.Element { return ( <> -

    Scope facets

    - -

    - A scope facet is a specific subset of a scope that Cursorless can - target. For example take the value scope. One facet of value is the - right hand side of a variable assignment, another facet of value is the - value in a map pair and a third is the return value in a return - statement. -

    +

    Scopes