diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-14 15:08:03 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-11-14 15:08:03 +0300 |
commit | 61a82b8ec062d6f122dadd38783c7754cef7ce2b (patch) | |
tree | 071d1ded4f507d77bac97156aa1fa85c95c0cba5 /app/assets/javascripts/vue_shared/components/source_viewer | |
parent | 3ed578edf525bce3167860b84f6b43bab5065cf5 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/vue_shared/components/source_viewer')
3 files changed, 52 insertions, 0 deletions
diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js index 62036056700..dec2ef1a63a 100644 --- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js +++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/link_dependencies.js @@ -2,12 +2,14 @@ import packageJsonLinker from './utils/package_json_linker'; import gemspecLinker from './utils/gemspec_linker'; import godepsJsonLinker from './utils/godeps_json_linker'; import gemfileLinker from './utils/gemfile_linker'; +import podspecJsonLinker from './utils/podspec_json_linker'; const DEPENDENCY_LINKERS = { package_json: packageJsonLinker, gemspec: gemspecLinker, godeps_json: godepsJsonLinker, gemfile: gemfileLinker, + podspec_json: podspecJsonLinker, }; /** diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js index 299059f62f7..c1a1101afad 100644 --- a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js +++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/dependency_linker_util.js @@ -7,3 +7,21 @@ export const createLink = (href, innerText) => export const generateHLJSOpenTag = (type, delimiter = '"') => `<span class="hljs-${escape(type)}">${delimiter}`; + +export const getObjectKeysByKeyName = (obj, keyName, acc) => { + if (obj instanceof Array) { + obj.map((subObj) => getObjectKeysByKeyName(subObj, keyName, acc)); + } else { + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + if (key === keyName) { + acc.push(...Object.keys(obj[key])); + } + if (obj[key] instanceof Object || obj[key] instanceof Array) { + getObjectKeysByKeyName(obj[key], keyName, acc); + } + } + } + } + return acc; +}; diff --git a/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js new file mode 100644 index 00000000000..e2007fe408b --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/source_viewer/plugins/utils/podspec_json_linker.js @@ -0,0 +1,32 @@ +import { createLink, generateHLJSOpenTag, getObjectKeysByKeyName } from './dependency_linker_util'; + +const COCOAPODS_URL = 'https://cocoapods.org/pods/'; +const beginString = generateHLJSOpenTag('attr'); +const endString = + '"</span><span class="hljs-punctuation">:</span><span class=""> </span><span class="hljs-punctuation">\\['; + +const DEPENDENCY_REGEX = new RegExp( + /* + * Detects dependencies inside of content that is highlighted by Highlight.js + * Example: <span class="hljs-attr">"AFNetworking/Security"</span><span class="hljs-punctuation">:</span><span class=""> </span><span class="hljs-punctuation"> [ + * Group 1: AFNetworking/Serialization + */ + `${beginString}([^/]+/?[^/]+.)${endString}`, + 'gm', +); + +const handleReplace = (original, dependency, dependenciesToLink) => { + if (dependenciesToLink.includes(dependency)) { + const href = `${COCOAPODS_URL}${dependency.split('/')[0]}`; + const link = createLink(href, dependency); + return `${beginString}${link}${endString.replace('\\', '')}`; + } + return original; +}; + +export default (result, raw) => { + const dependenciesToLink = getObjectKeysByKeyName(JSON.parse(raw), 'dependencies', []); + return result.value.replace(DEPENDENCY_REGEX, (original, dependency) => + handleReplace(original, dependency, dependenciesToLink), + ); +}; |