summaryrefslogtreecommitdiff
path: root/docs/src/components/codes/Description.jsx
diff options
context:
space:
mode:
authorinnovaker <66737976+innovaker@users.noreply.github.com>2020-11-06 19:42:54 +0000
committerPete Johanson <peter@peterjohanson.com>2020-11-06 15:02:12 -0500
commitff638eb0105a22780d5084da58da83c98dc6d324 (patch)
treec1b6c9678dbc3b0ec4355f4177ff777816777479 /docs/src/components/codes/Description.jsx
parent194854ff7b61999f935e46d7a99060a655292490 (diff)
docs(codes): Add (key) codes documentation
Create codes documentation for standardized keys. Closes #218. Fixes #308. Ref #21.
Diffstat (limited to 'docs/src/components/codes/Description.jsx')
-rw-r--r--docs/src/components/codes/Description.jsx51
1 files changed, 51 insertions, 0 deletions
diff --git a/docs/src/components/codes/Description.jsx b/docs/src/components/codes/Description.jsx
new file mode 100644
index 0000000..6d8c5f6
--- /dev/null
+++ b/docs/src/components/codes/Description.jsx
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2020 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: CC-BY-NC-SA-4.0
+ */
+
+import React from "react";
+import PropTypes from "prop-types";
+
+const specialCharactersRegex = /(?:^|\s)((?:&(?:(?:\w+)|(?:#\d+));)|[_]|[^\w\s])(?:\s*\[([^[\]]+?)\])/g;
+
+function renderSpecialCharacters(description) {
+ const matches = Array.from(description.matchAll(specialCharactersRegex));
+ if (matches.length == 0) return description;
+ let lastIndex = 0;
+ const parts = matches.reduce((acc, match, i) => {
+ const { index } = match;
+ const str = match[0];
+ const chars = match[1];
+ const meaning = match[2];
+ if (index != lastIndex) {
+ acc.push(description.substring(lastIndex, index));
+ }
+ const pos = str.indexOf(chars);
+ if (pos > 0) {
+ acc.push(description.substr(index, pos));
+ }
+ acc.push(
+ <span key={i} className="symbol" title={meaning ?? ""}>
+ <code>{description.substr(index + pos, chars.length)}</code>
+ {meaning ? <span className="meaning">{meaning}</span> : undefined}
+ </span>
+ );
+ lastIndex = index + str.length;
+ return acc;
+ }, []);
+ if (lastIndex < description.length) {
+ parts.push(description.substr(lastIndex));
+ }
+ return parts;
+}
+
+export default function Description({ description = "" }) {
+ return (
+ <span className="description">{renderSpecialCharacters(description)}</span>
+ );
+}
+
+Description.propTypes = {
+ description: PropTypes.string.isRequired,
+};