summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/gemspec_linker.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/gemspec_linker.js')
-rw-r--r--app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/gemspec_linker.js39
1 files changed, 39 insertions, 0 deletions
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/gemspec_linker.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/gemspec_linker.js
new file mode 100644
index 00000000000..35de8fd13d6
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/gemspec_linker.js
@@ -0,0 +1,39 @@
+import { joinPaths } from '~/lib/utils/url_utility';
+import { GEM_URL } from '../../constants';
+import { createLink, generateHLJSOpenTag } from './dependency_linker_util';
+
+const methodRegex = '.*add_dependency.*|.*add_runtime_dependency.*|.*add_development_dependency.*';
+const openTagRegex = generateHLJSOpenTag('string', '(&.*;)');
+const closeTagRegex = '&.*</span>';
+
+const DEPENDENCY_REGEX = new RegExp(
+ /*
+ * Detects gemspec dependencies inside of content that is highlighted by Highlight.js
+ * Example: s.add_dependency(<span class="hljs-string">&#x27;rugged&#x27;</span>, <span class="hljs-string">&#x27;~&gt; 0.24.0&#x27;</span>)
+ *
+ * Group 1 (method) : s.add_dependency(
+ * Group 2 (delimiter) : &#x27;
+ * Group 3 (packageName): rugged
+ * Group 4 (closeTag) : &#x27;</span>
+ * Group 5 (rest) : , <span class="hljs-string">&#x27;~&gt; 0.24.0&#x27;</span>)
+ */
+ `(${methodRegex})${openTagRegex}(.*)(${closeTagRegex})(.*${closeTagRegex})`,
+ 'gm',
+);
+
+const handleReplace = (method, delimiter, packageName, closeTag, rest) => {
+ // eslint-disable-next-line @gitlab/require-i18n-strings
+ const openTag = generateHLJSOpenTag('string linked', delimiter);
+ const href = joinPaths(GEM_URL, packageName);
+ const packageLink = createLink(href, packageName);
+
+ return `${method}${openTag}${packageLink}${closeTag}${rest}`;
+};
+
+export default (result) => {
+ return result.value.replace(
+ DEPENDENCY_REGEX,
+ (_, method, delimiter, packageName, closeTag, rest) =>
+ handleReplace(method, delimiter, packageName, closeTag, rest),
+ );
+};