From 47b28c415a01949492b25e6685576ae7f8ec4e32 Mon Sep 17 00:00:00 2001 From: Addison Date: Tue, 1 Oct 2024 18:44:55 +0800 Subject: [PATCH 1/2] Boilerplate for smartcat translation --- integrations/smartcat/.eslintrc.json | 3 ++ integrations/smartcat/.gitignore | 2 ++ integrations/smartcat/gitbook-manifest.yaml | 12 ++++++++ integrations/smartcat/package.json | 17 +++++++++++ integrations/smartcat/src/index.tsx | 33 +++++++++++++++++++++ integrations/smartcat/src/script.raw.js | 19 ++++++++++++ integrations/smartcat/tsconfig.json | 6 ++++ 7 files changed, 92 insertions(+) create mode 100644 integrations/smartcat/.eslintrc.json create mode 100644 integrations/smartcat/.gitignore create mode 100644 integrations/smartcat/gitbook-manifest.yaml create mode 100644 integrations/smartcat/package.json create mode 100644 integrations/smartcat/src/index.tsx create mode 100644 integrations/smartcat/src/script.raw.js create mode 100644 integrations/smartcat/tsconfig.json diff --git a/integrations/smartcat/.eslintrc.json b/integrations/smartcat/.eslintrc.json new file mode 100644 index 000000000..99e7792b9 --- /dev/null +++ b/integrations/smartcat/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["@gitbook/eslint-config/integration"] +} \ No newline at end of file diff --git a/integrations/smartcat/.gitignore b/integrations/smartcat/.gitignore new file mode 100644 index 000000000..04c58bdf8 --- /dev/null +++ b/integrations/smartcat/.gitignore @@ -0,0 +1,2 @@ +/node_modules +package-lock.json \ No newline at end of file diff --git a/integrations/smartcat/gitbook-manifest.yaml b/integrations/smartcat/gitbook-manifest.yaml new file mode 100644 index 000000000..e59dfa3f1 --- /dev/null +++ b/integrations/smartcat/gitbook-manifest.yaml @@ -0,0 +1,12 @@ +name: softwareone-smartcat +title: Smartcat (SoftwareOne) +organization: gitbook +visibility: unlisted +description: "The SoftwareOne instance of Smartcat’s translations." +script: src/index.tsx +scopes: + - space:script:inject + - site:script:inject +secrets: {} +contentSecurityPolicy: + script-src: https://cdn.smartcat-proxy.com; diff --git a/integrations/smartcat/package.json b/integrations/smartcat/package.json new file mode 100644 index 000000000..722510094 --- /dev/null +++ b/integrations/smartcat/package.json @@ -0,0 +1,17 @@ +{ + "name": "softwareone-smartcat", + "private": true, + "scripts": { + "lint": "eslint --ext .js,.jsx,.ts,.tsx .", + "typecheck": "tsc --noEmit", + "publish": "gitbook publish ." + }, + "dependencies": { + "@gitbook/runtime": "*" + }, + "devDependencies": { + "@gitbook/cli": "^0.15.2", + "@gitbook/eslint-config": "*", + "@gitbook/tsconfig": "*" + } +} \ No newline at end of file diff --git a/integrations/smartcat/src/index.tsx b/integrations/smartcat/src/index.tsx new file mode 100644 index 000000000..30e51da4a --- /dev/null +++ b/integrations/smartcat/src/index.tsx @@ -0,0 +1,33 @@ +import { + createIntegration, + FetchPublishScriptEventCallback, + RuntimeContext, + RuntimeEnvironment, +} from '@gitbook/runtime'; + +import script from './script.raw.js'; + +type SmartcatRuntimeContext = RuntimeContext< + RuntimeEnvironment< + {}, + { + site_tag?: string; + } + > +>; + +export const handleFetchEvent: FetchPublishScriptEventCallback = async ( + event, + { environment }: SmartcatRuntimeContext +) => { + return new Response(script, { + headers: { + 'Content-Type': 'application/javascript', + 'Cache-Control': 'max-age=604800', + }, + }); +}; + +export default createIntegration({ + fetch_published_script: handleFetchEvent, +}); diff --git a/integrations/smartcat/src/script.raw.js b/integrations/smartcat/src/script.raw.js new file mode 100644 index 000000000..61bee683e --- /dev/null +++ b/integrations/smartcat/src/script.raw.js @@ -0,0 +1,19 @@ +function loadScript() { + const divElement = document.createElement('div'); + divElement.id = 'scLangSelectorContainer'; + divElement.style.cssText = 'position:fixed; right:10px; bottom:10px; z-index:9999;'; + document.body.appendChild(divElement); + const script = document.createElement('script'); + script.id = 'sc-script'; + script.src = + 'https://cdn.smartcat-proxy.com//script-v1/__translator.js?hash='; + document.head.appendChild(script); +} + +(function () { + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', loadScript); + } else { + loadScript(); + } +})(); diff --git a/integrations/smartcat/tsconfig.json b/integrations/smartcat/tsconfig.json new file mode 100644 index 000000000..f2558f29c --- /dev/null +++ b/integrations/smartcat/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "@gitbook/tsconfig/integration.json", + "compilerOptions": { + "lib": ["ES6", "DOM"], + } +} \ No newline at end of file From 95c5d80bc237982cb6d7ddb44abe473c49f62505 Mon Sep 17 00:00:00 2001 From: Addison Date: Wed, 2 Oct 2024 19:51:06 +0900 Subject: [PATCH 2/2] Add regex to extract ids --- integrations/smartcat/gitbook-manifest.yaml | 21 +++++++++++++++------ integrations/smartcat/src/index.tsx | 4 +++- integrations/smartcat/src/script.raw.js | 14 ++++++++++++-- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/integrations/smartcat/gitbook-manifest.yaml b/integrations/smartcat/gitbook-manifest.yaml index e59dfa3f1..d3999085b 100644 --- a/integrations/smartcat/gitbook-manifest.yaml +++ b/integrations/smartcat/gitbook-manifest.yaml @@ -1,12 +1,21 @@ -name: softwareone-smartcat -title: Smartcat (SoftwareOne) +name: smartcat +title: Smartcat organization: gitbook visibility: unlisted -description: "The SoftwareOne instance of Smartcat’s translations." +description: 'Add Smartcat to your GitBook to translate your content.' script: src/index.tsx scopes: - - space:script:inject - - site:script:inject + - space:script:inject + - site:script:inject secrets: {} contentSecurityPolicy: - script-src: https://cdn.smartcat-proxy.com; + script-src: https://cdn.smartcat-proxy.com; +configurations: + site: + properties: + site_tag: + type: string + title: Smartcat Site Tag + description: Available in Smartcat’s settings. + required: + - site_tag diff --git a/integrations/smartcat/src/index.tsx b/integrations/smartcat/src/index.tsx index 30e51da4a..83d6e1314 100644 --- a/integrations/smartcat/src/index.tsx +++ b/integrations/smartcat/src/index.tsx @@ -20,7 +20,9 @@ export const handleFetchEvent: FetchPublishScriptEventCallback = async ( event, { environment }: SmartcatRuntimeContext ) => { - return new Response(script, { + const smartCatScriptTag = environment.siteInstallation?.configuration?.site_tag; + + return new Response(script.replace('', smartCatScriptTag), { headers: { 'Content-Type': 'application/javascript', 'Cache-Control': 'max-age=604800', diff --git a/integrations/smartcat/src/script.raw.js b/integrations/smartcat/src/script.raw.js index 61bee683e..2edea7dfb 100644 --- a/integrations/smartcat/src/script.raw.js +++ b/integrations/smartcat/src/script.raw.js @@ -1,12 +1,22 @@ function loadScript() { + const smartCatScriptTag = ''; + + const smartcatOrgIDRegExp = + 'https://cdn.smartcat-proxy.com/([^/]+)/script-v1/__translator.js?hash=.*'; + + const smartcatHashRegExp = + 'https://cdn.smartcat-proxy.com/[^/]+/script-v1/__translator.js?hash=([^/]+)'; + + const smartcatOrgID = smartCatScriptTag.match(smartcatOrgIDRegExp)[1]; + const smartcatHash = smartCatScriptTag.match(smartcatHashRegExp)[1]; + const divElement = document.createElement('div'); divElement.id = 'scLangSelectorContainer'; divElement.style.cssText = 'position:fixed; right:10px; bottom:10px; z-index:9999;'; document.body.appendChild(divElement); const script = document.createElement('script'); script.id = 'sc-script'; - script.src = - 'https://cdn.smartcat-proxy.com//script-v1/__translator.js?hash='; + script.src = `https://cdn.smartcat-proxy.com/${smartcatOrgID}/script-v1/__translator.js?hash=${smartcatHash}`; document.head.appendChild(script); }