Skip to content

Instantly share code, notes, and snippets.

@barisbikmaz
Last active March 24, 2023 11:58
Show Gist options
  • Save barisbikmaz/2ea213aeaec48d2521322f3d0723a066 to your computer and use it in GitHub Desktop.
Save barisbikmaz/2ea213aeaec48d2521322f3d0723a066 to your computer and use it in GitHub Desktop.
name: Preview Styles API Experiment
description: ''
host: WORD
api_set: {}
script:
content: "$(\"#get-styles-from-base64-document\").click(() => tryCatch(logBase64DocumentStyles));\n$(\"#get-styles-from-current-document\").click(() => tryCatch(logCurrentDocumentStyles));\n$(\"#update-style\").click(() => tryCatch(updateStyle));\n$(\"#add-style\").click(() => tryCatch(addStyle));\n$(\"#remove-style\").click(() => tryCatch(removeStyle));\n$(\"#replace-style\").click(() => tryCatch(replaceStyle));\n\n// PROBLEM: You cannot add style names with spaces or dots\n// const styleName = \"ofaw\";\n// const styleToApplyNameLocal = \"ofaw.styles.1\";\n\n// #region -- LOGGING STYLES INTO CONSOLE --\nasync function logBase64DocumentStyles() {\n const styles = await loadBase64DocumentStyles();\n console.log(styles);\n}\n\nasync function logCurrentDocumentStyles() {\n await Word.run(async (context) => {\n const styles = context.document.getStyles();\n styles.load();\n await context.sync();\n\n console.log(styles.items);\n });\n}\n\n// #endregion\n\n// #region -- LOAD STYLES FROM DOCUMENT --\n// PROBLEM 1: Returned JSON is in Upper CamelCase\n// PROBLEM 2: Styles come just with the NameLocal Property which is different for every language\nasync function loadBase64DocumentStyles() {\n return await Word.run(async (context) => {\n const result = context.application.retrieveStylesFromBase64(stylesBase64Document);\n await context.sync();\n\n const json = jsonParseWithLowerCase(result.value);\n return json.styles as Word.Style[];\n });\n}\n\nasync function loadStyleFromSourceDocument(styleName: string) {\n const sourceStyles = await loadBase64DocumentStyles();\n const sourceStyle = sourceStyles.find((s) => s.nameLocal === styleName);\n\n if (!sourceStyle) {\n throw `\U0001F6D1 Could not find style in source document!`;\n }\n\n return sourceStyle;\n}\n// #endregion\n\n// #region -- CRUD OPERATIONS\n\nfunction sourceDocumentStyleName() {\n return $(\"input[name=sourceStyleName]\").val() as string;\n}\n\nfunction targetDocumentStyleName() {\n return $(\"input[name=targetStyleName]\").val() as string;\n}\n\n// -------------------------------\n// ➕ ADDING STYLE\n// -------------------------------\nasync function addStyle() {\n console.log(\"---- Add Style Start ----\");\n const styleToApplyNameLocal = sourceDocumentStyleName();\n if (!styleToApplyNameLocal) {\n console.log(`\U0001F6D1 Pls Enter a style name!`);\n return;\n }\n\n console.log(`⚙️ Searching for style ${styleToApplyNameLocal} in source document...`);\n\n const styles = await loadBase64DocumentStyles();\n const sourceDocumentStyle = styles.find((style) => {\n return style.nameLocal === styleToApplyNameLocal;\n });\n\n if (!sourceDocumentStyle) {\n console.log(`\U0001F6D1 Style ${styleToApplyNameLocal} not found in the source document.`);\n return;\n }\n\n console.log(`✔️ Source style found. `);\n\n const styleWithoutUnchangableStyles = removeUnchangableStyleProperties(sourceDocumentStyle);\n const styleWithoutNullProps = removeNullProperties(styleWithoutUnchangableStyles);\n console.log(styleWithoutNullProps);\n\n await Word.run(async (context) => {\n const targetStyleName = targetDocumentStyleName();\n const newStyle = context.document.addStyle(targetStyleName, Word.StyleType.paragraph);\n console.log(`✔️ Source style added. `);\n\n console.log(`⚙️ Changing Source style properties ... `);\n // PROBLEM: I cannot apply the whole style. I must remove null values and properties which cannot be set\n newStyle.set({\n ...styleWithoutNullProps,\n font: styleWithoutNullProps.font,\n quickStyle: true\n });\n\n await context.sync();\n console.log(\"✔️ Style properties changed.\");\n\n console.log(\"⚙️ Applying style to selection.\");\n const selectedRange = context.document.getSelection();\n selectedRange.style = targetStyleName;\n await context.sync();\n console.log(\"✔️ Style applied.\");\n });\n}\n\n// -------------------------------\n// ➖ REMOVING STYLES\n// -------------------------------\n// PROBLEM: Removing style is not instant. It takes some seconds until it is removed form UI or it stays in the\n// list until I refresh manually\nasync function removeStyle() {\n console.log(\"---- Remove Style Start ----\");\n const styleName = targetDocumentStyleName();\n console.log(`⚙️ Removing ${styleName} ...`);\n\n await Word.run(async (context) => {\n const styles = context.document.getStyles();\n const style = styles.getByNameOrNullObject(styleName);\n style.delete();\n await context.sync();\n console.log(\"✔️ Style removed!\");\n });\n}\n\n// -------------------------------\n// \U0001FA84 REPLACING STYLES\n// -------------------------------\n\nasync function replaceStyle() {\n const styleName = targetDocumentStyleName();\n const styleNameInSource = sourceDocumentStyleName();\n\n console.log(`✔️ Replacing Style \"${styleName}\" with ${styleNameInSource} from source document.`);\n\n await Word.run(async (context) => {\n console.log(`⚙️ Loading style ${styleNameInSource} from source document...`);\n const sourceStyle = await loadStyleFromSourceDocument(styleNameInSource);\n console.log(sourceStyle);\n\n console.log(`⚙️ Loading styles in document...`);\n const stylesInTargetDocument = context.document.getStyles();\n const styleToReplace = stylesInTargetDocument.getByNameOrNullObject(styleName);\n styleToReplace.load({\n select: \"*\",\n });\n await context.sync();\n\n if (!styleToReplace.nameLocal) {\n console.log(`\U0001F6D1 ${styleName} could not be found in the current document.`);\n return;\n }\n\n console.log(`✔️ Style ${styleName} found in the current document.`);\n console.log(styleToReplace);\n\n const cleanSourceStyle = removeUnchangableStyleProperties(sourceStyle);\n console.log(cleanSourceStyle);\n\n console.log(\"⚙️ Updating source style...\");\n styleToReplace.set({\n font: cleanSourceStyle.font,\n paragraphFormat: cleanSourceStyle.paragraphFormat\n });\n await context.sync();\n\n console.log(`✔️ Style ${styleName} updated in source document!`);\n });\n}\n\n// ----------------------------------\n// \U0001FA84 UPDATING STYLE PROPERTIES\n// -----------------------------------\n\nasync function updateStyle() {\n console.log(\"---- Update Style Start ----\");\n const styleToUpdate = $(\"input[name=updateStyleName]\").val() as string;\n console.log(`⚙️ Loading Style \"${styleToUpdate}\"\"`);\n\n await Word.run(async (context) => {\n // PROBLEM 1: getStyles loads all styles which is slow\n // I would like to decide which styles I want to load, like only paragraphs\n const styles = context.document.getStyles();\n const style = styles.getByNameOrNullObject(styleToUpdate);\n\n style.load({\n select: \"*\",\n expand: \"font\"\n });\n await context.sync();\n\n if (!style.nameLocal) {\n console.log(`\U0001F6D1 ${styleToUpdate} style not found.`);\n return;\n }\n\n console.log(\"✔️ Style loaded.\");\n\n const styleJson = style.toJSON();\n\n // PROBLEM 2: I cant' pass null values. I need to remove them.\n const fontWithoutNullValues = removeNullProperties(styleJson.font);\n\n const color = $(\"input[name=fontColor]\").val() as string;\n\n if (!color) {\n console.log(\"\U0001F6D1 Please enter a color.\");\n return;\n }\n\n console.log(`⚙️ Appliying color: ${color}`);\n\n style.set({\n font: {\n ...fontWithoutNullValues,\n color\n }\n });\n await context.sync();\n\n console.log(`✔️ Style ${styleToUpdate} updated!`);\n });\n}\n\n// #endregion\n\n// #region -- HELPER METHODS --\n\nfunction removeNullProperties<T>(obj: T): Partial<T> {\n const partialObj: Partial<T> = {};\n\n Object.keys(obj).forEach((key) => {\n if (obj[key] === Object(obj[key])) {\n partialObj[key] = removeNullProperties(obj[key]);\n } else if (obj[key] != null) {\n partialObj[key] = obj[key];\n }\n });\n\n return partialObj;\n}\n\nfunction removeUnchangableStyleProperties(style: Word.Style) {\n const partialStyle = JSON.parse(JSON.stringify(style));\n const propsToRemove = [\"baseStyle\", \"builtIn\", \"inUse\", \"linked\", \"nameLocal\", \"type\", \"nextParagraphStyle\"];\n\n propsToRemove.forEach((prop) => {\n delete partialStyle[prop];\n });\n\n return partialStyle;\n}\n\nfunction jsonParseWithLowerCase(text: string) {\n return JSON.parse(text, function(key, value) {\n if (value == null) {\n return undefined;\n }\n\n if (value && typeof value === \"object\")\n for (var k in value) {\n if (/^[A-Z]/.test(k) && Object.hasOwnProperty.call(value, k)) {\n value[k.charAt(0).toLowerCase() + k.substring(1)] = value[k];\n delete value[k];\n }\n }\n return value;\n });\n}\n\n// #endregion\n\n/** Default helper for invoking an action and handling errors. */\nasync function tryCatch(callback) {\n try {\n await callback();\n } catch (error) {\n // Note: In a production add-in, you'd want to notify the user through your add-in's UI.\n console.error(error);\n }\n}\n\nconst stylesBase64Document =\n \"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\";\n"
language: typescript
template:
content: "<section class=\"samples ms-font-m\">\n\t<h3>\U0001F58A Output to console</h3>\n\t<button id=\"get-styles-from-base64-document\" class=\"ms-Button\">\n <span class=\"ms-Button-label\">\U0001F58A Log base64 document styles</span>\n </button>\n\n\t<button id=\"get-styles-from-current-document\" class=\"ms-Button\">\n\t\t\t<span class=\"ms-Button-label\">\U0001F58A Log current document styles</span>\n\t</button>\n</section>\n\n<section class=\"samples ms-font-m\">\n\t<h3>\U0001FA84 Update Styles</h3>\n\n\t<div class=\"ms-TextField\">\n\t\t<label class=\"ms-Label\">Style Name</label>\n\t\t<input name=\"updateStyleName\" class=\"ms-TextField-field\" type=\"text\" value=\"ofaw\" />\n\t</div>\n\n\t\t<div class=\"ms-TextField\">\n\t\t\t<label class=\"ms-Label\">Font Color</label>\n\t\t\t<input name=\"fontColor\" class=\"ms-TextField-field\" type=\"text\" value=\"#FF0000\" />\n\t</div>\n\n\t\t\t<button id=\"update-style\" class=\"ms-Button\">\n\t\t<span class=\"ms-Button-label\">\U0001FA84 Update Style</span>\n\t</button>\n</section>\n\n\n<section class=\"samples ms-font-m\">\n\t<h3>➕ CRUD Operations on Styles</h3>\n\n\t<div class=\"ms-TextField\">\n\t\t<label class=\"ms-Label\">Name of Style in Source Document</label>\n\t\t<input name=\"sourceStyleName\" class=\"ms-TextField-field\" type=\"text\" value=\"ofaw.styles.1\" />\n\t</div>\n\n\t\t<div class=\"ms-TextField\">\n\t\t\t<label class=\"ms-Label\">Style in Target Document</label>\n\t\t\t<input name=\"targetStyleName\" class=\"ms-TextField-field\" type=\"text\" value=\"ofaw\" />\n\t</div>\n\n\t\t\t<button id=\"add-style\" class=\"ms-Button\">\n\t\t\t<span class=\"ms-Button-label\">➕ Add Source Style</span>\n\t</button>\n\n\t\t\t<button id=\"remove-style\" class=\"ms-Button\">\n\t\t\t<span class=\"ms-Button-label\">➖ Remove Style </span>\n\t</button>\n\n\t\t\t<button id=\"replace-style\" class=\"ms-Button\">\n\t\t\t<span class=\"ms-Button-label\">\U0001FA84 Replace Style</span>\n\t</button>\n</section>"
language: html
style:
content: |
section {
padding: 0 20px 20px;
border-top: 1px solid grey;
}
.ms-Button, input {
margin-bottom: 10px;
width: 100%;
}
language: css
libraries: |-
https://appsforoffice.microsoft.com/lib/beta/hosted/office.js
@types/office-js-preview
office-ui-fabric-js@1.4.0/dist/css/fabric.min.css
office-ui-fabric-js@1.4.0/dist/css/fabric.components.min.css
core-js@2.4.1/client/core.min.js
@types/core-js
jquery@3.1.1
@types/jquery@3.3.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment