From 289e3e0ae66c226680e87999fde215ef2178a11f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nata=C5=A1a=20Kralj?= Date: Mon, 27 Mar 2023 14:28:32 +0200 Subject: [PATCH 1/2] Add scripts and guide --- _scripts/checkAliases-requirements.txt | Bin 0 -> 512 bytes _scripts/checkAliases.py | 247 +++++++++++++++++++++++++ _scripts/generics.py | 21 +++ _scripts/guide-for-checkAliases.md | 28 +++ _scripts/tableFunctions.py | 88 +++++++++ 5 files changed, 384 insertions(+) create mode 100644 _scripts/checkAliases-requirements.txt create mode 100644 _scripts/checkAliases.py create mode 100644 _scripts/generics.py create mode 100644 _scripts/guide-for-checkAliases.md create mode 100644 _scripts/tableFunctions.py diff --git a/_scripts/checkAliases-requirements.txt b/_scripts/checkAliases-requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..3a0e96fe45f49379acc0d4747813212780af3ddd GIT binary patch literal 512 zcmZvZu};H45Jaa&;!}*`pg=`IPb6B(Kw_}4ljvfH@bkc%Jzo$KvQ9pEXWs6tzrWUM zbx zh;4B9+)bMYsnB|@l+doBec<{}ogF6k=zeLH_VgO{8vPDI|C`AA5q@{BImbM5>~L@B z=($dl!Z}Q+r>y3$n7(1UG<8qxu;f^rX{HQ%L+1<)YTpJt_78MQ;mUg~=^t@D>0V1c qMD-^6JL$-7E8Hz_vz#^WuMp};aYT{ekM!~X+Uht>mvfky^Zo!k9!*C8 literal 0 HcmV?d00001 diff --git a/_scripts/checkAliases.py b/_scripts/checkAliases.py new file mode 100644 index 00000000000..a6b00961493 --- /dev/null +++ b/_scripts/checkAliases.py @@ -0,0 +1,247 @@ +""" +checkAliases.py goes through all .md files to grab 'aliases' parameter in front matter +It goes through every .md file within given startDir. +It outputs a JSON list of all files containing aliases. +It outputs a CSV list of all files containing aliases. +It goes through content again to check all cross-reference links against aliases list. +It outputs the aliases in cross-references to warnings.log +""" +import generics +import tableFunctions +import frontmatter +from markdown_it import MarkdownIt +from markdown_it.tree import SyntaxTreeNode +import json +import pathlib + +# Add front matter to list of dict entries +def addItem(post): + # Grabs front matter data + aliases = post.get("aliases") + title = post.get("title") + url = post.get("url") + map = post.get("mapped") + # Creates a dictionary entry for file with aliases + append = False + itemDict = {"Title": title, "URL": "docs.mendix.com" + url, "Front matter": "", "aliases": aliases} + + # If 'aliases' exists in front matter + if aliases != None: + # Flags append + append = True + # Each entry of alias in a file gets added to aliasCompare list + for each in aliases: + aliasCompare.append(each) + # If 'mapped' exists in front matter and is true + if map == True: + # Flags append + append = True + # Appends dictionary to aliasList if doc is mapped + itemDict["Front matter"] = "mapped" + # Appends dictionary to aliasList + if append == True: + aliasList.append(itemDict) + +# Checks for the use of aliases in cross reference links +def aliasCheck(post, relDir): + # Calls Markdown class and sets type to GitHub-like + md = MarkdownIt("gfm-like") + # Makes text parsable, won't work with feeding file + text = post.content + # Gives Markdown tokens + tokens = md.parse(text) + # Takes tokens to create a SyntaxTree + node = SyntaxTreeNode(tokens) + + # Walks through all tree nodes + for node in node.walk(): + # If a node is a link type + if node.type == "link": + # Gives back the dict value of node attribute with key 'href' + link = node.attrs['href'] + # Removes any anchor from link + cleanedLink = link.split('#', maxsplit=1) + # If the link contains anything before # + if cleanedLink[0] != '': + # Checks if the link is in the alias list + if cleanedLink[0] in aliasCompare: + # If it is an alias, adds it to log + aliasLogger.warning('Link %s in file %s is an alias, please replace', cleanedLink[0], relDir) + +# Go through .md file types +# Can toggle parsing of front matter +# Can toggle finding aliases in .md body content +def parseMdFile(filePath, frontMatterGrab=True, checkAlias=False): + # creates a relative path from starting directory + # used in logs + relDir = filePath.relative_to(start) + # Opens Markdown file + with open(filePath, mode='r', encoding="utf-8") as file: + # Loads .md file into post via frontmatter module + post = frontmatter.load(file) + # Flag for going through functions that parse front matter + if frontMatterGrab == True: + addItem(post) + # Flag for going through content body to check for aliases used in cross references + if checkAlias == True: + # Calls function that checks aliases in cross references + aliasCheck(post, relDir) + +# Compare two lists and log the difference +# URL value of items in list is used as the first verification step. If URL values don't match the search loop is stopped. +def compareLists(list1: list, list2: list): + # List for logger at end of comparison + diff = [] + # For each item in docs content list + for item in list1: + # Set flags to empty/false for each item + end1Flag = False + list1Msg = "" + title1Flag = False + URL1Flag = False + mapped1Flag = False + alias1Flag = False + # If item URL matches to URL already in diff list, it doesn't need to be checked again + for d1 in diff: + if item["URL"] == d1["URL"]: + end1Flag = True + break + # As long as item URL is not in diff list, the loop below continues + if end1Flag == False: + # For each item in Excel list + for i in list2: + # If the item's URL from docs list and item's URL from Excel list don't match this part is skipped + # If item values match, flags get set to true + if item["URL"] == i["URL"]: + URL1Flag = True + if item["Title"] == i["Title"]: + title1Flag = True + if item["Front matter"] == i["Front matter"]: + mapped1Flag = True + if item["aliases"] == i["aliases"]: + alias1Flag = True + break + # If all flags are false, the entire entry is not present in Excel + # Depending on the flags, text gets added to the warning message + if URL1Flag == False and title1Flag == False and mapped1Flag == False and alias1Flag == False: + list1Msg += "| Entry missing from Excel |" + else: + # Each flag can be true or false separately from others, each is checked + if URL1Flag == False: + list1Msg += "| URL mismatch" + if title1Flag == False: + list1Msg += "| Title mismatch" + if mapped1Flag == False: + list1Msg += "| Front matter mismatch" + if alias1Flag == False: + list1Msg += "| Aliases mismatch" + # If the warning message is not empty, add the item to the diff list + if list1Msg != "": + item["Warning"] = list1Msg + diff.append(item) + # Repeat loop with logic for opposite lists + # For each item in Excel list + for item in list2: + # Set flags to empty/false for each item + end2Flag = False + list2Msg = "" + title2Flag = False + URL2Flag = False + mapped2Flag = False + alias2Flag = False + # If item URL matches to URL already in diff list, it doesn't need to be checked again + for d2 in diff: + if item["URL"] == d2["URL"]: + end2Flag = True + break + # As long as item URL is not in diff list, the loop below continues + if end2Flag == False: + # For each item in docs content list + for i in list1: + # If the item's URL from Excel list and item's URL from docs list don't match this part is skipped + # If item values match, flags get set to true + if item["URL"] == i["URL"]: + URL2Flag = True + if item["Title"] == i["Title"]: + title2Flag = True + if item["Front matter"] == i["Front matter"]: + mapped2Flag = True + if item["aliases"] == i["aliases"]: + alias2Flag = True + break + # If all flags are false, the entire entry is not present in docs content + # Depending on the flags, text gets added to the warning message + if URL2Flag == False and title2Flag == False and mapped2Flag == False and alias2Flag == False: + list2Msg += "| Doc missing in repo |" + else: + # Each flag can be true or false separately from others, each is checked + if URL2Flag == False: + list2Msg += "| URL mismatch " + if title2Flag == False: + list2Msg += "| Title mismatch " + if mapped2Flag == False: + list2Msg += "| Front matter mismatch " + if alias2Flag == False: + list2Msg += "| Aliases mismatch " + # If the warning message is not empty, add the item to the diff list + if list2Msg != "": + item["Warning"] = list2Msg + diff.append(item) + # If the diff list is not empty then log results for each entry in list + result = len(diff) == 0 + if not result: + compareLogger.warning('The lists do not match! There are %d differences:',len(diff)) + for line in diff: + compareLogger.warning('%d. %s', (diff.index(line)+1), line) + +# Grab working directory +# TO DO - the hardcoded link will need changing +startDir = input('Specify FULL PATH to local content directory:\n(For example, C:\\Users\\user.name\\Documents\\docs\\content\\en\\docs\\) ') +start = pathlib.Path(startDir) + +# Empty lists to help with parsing data +aliasList = [] +aliasCompare = [] + +# Intitialize loggers for aliases and comparison +aliasLogger = generics.initLogger('aliasLog', 'aliasLinkWarnings.log') +compareLogger = generics.initLogger('compareLog', 'compareDocsToExcel.log') + +# Walk through all directories and files to find .md files +dirList = generics.dirWalk(start, "**/*.md") + +# For all .md files in dirList parse their front matter +for path in dirList: + parseMdFile(path, frontMatterGrab=True, checkAlias=False) + +# Uncomment and run lines below only if there is no mapping table +populateTablePrompt = input("Do you want to populate the mapping table? (Y/n)") +if populateTablePrompt.lower() == "y": + tableName = input("What is the Excel table name?") + ".xlsx" + tableFunctions.populateExcelFromList(aliasList, tableName) +else: + pass + +# Parse Excel file into managable list +tableToParse = input("Specify FULL PATH and name of Excel table to compare against content\n(For example, C:\\Users\\user.name\\Documents\\mapping-table.xlsx)") +myNewList = tableFunctions.createListFromExcel(tableToParse) + +# Store all docs grabbed and all excel entries into sorted lists +# This is just for testing +docsList = sorted(aliasList, key=lambda x: x['URL'], reverse=False) +excelList = sorted(myNewList, key=lambda x: x['URL'], reverse=False) + +# Writes a list of all aliases as a JSON file (list of dicts) +# Useful for troubleshooting or if one wants to compare the list results in JSON +# with open('listFromExcel.json', 'w') as logfile: +# json.dump(excelList, logfile) +# with open('docsList.json', 'w') as logfile: +# json.dump(docsList, logfile) + +# Compares the lists, logs any differences +compareLists(docsList, excelList) + +# For all .md files in dirList check their text body for aliases instead of proper relative URL in cross references +# Comment out to skip +for path in dirList: + parseMdFile(path, frontMatterGrab=False, checkAlias=True) diff --git a/_scripts/generics.py b/_scripts/generics.py new file mode 100644 index 00000000000..69b30c18f3f --- /dev/null +++ b/_scripts/generics.py @@ -0,0 +1,21 @@ +""" +Module for generic functions that can be reused in other scripts +""" + +import logging + +# Walk through all directories and files of given directory +# globPattern can be used to specify file type, defualts to all directories and files +# Returns a list of path objects +def dirWalk(start, globPattern="**/*"): + dirList = list(start.glob(globPattern)) + return dirList + +# To setup multiple loggers +def initLogger(name, logFile, level=logging.WARNING): + handler = logging.FileHandler(logFile) + handler.setFormatter(logging.Formatter('%(message)s')) + logger = logging.getLogger(name) + logger.setLevel(level) + logger.addHandler(handler) + return logger \ No newline at end of file diff --git a/_scripts/guide-for-checkAliases.md b/_scripts/guide-for-checkAliases.md new file mode 100644 index 00000000000..3124df3c371 --- /dev/null +++ b/_scripts/guide-for-checkAliases.md @@ -0,0 +1,28 @@ +## Script Overview + +The script checkAliases.py goes through all of docs content and tries to help with keeping track of aliases. It is meant to do several things: + +1. Combs through all of docs content files. If a doc has `aliases` or `mapped` parameters in their front matter data, it gets added to a list. Each doc in the list has the `title`, `url`, `mapped` and `aliases` parameters saved. +2. Using the list it can create an excel table from this data. This excel table is only meant to be created once. After it is populated for the first time it should be used to replace the current Mapping doc. +3. The script takes an excel file (with columns `title`, `url`, `mapped` and `aliases`) and saves it as a list. +4. It orders both lists based on the URL of the entries. +5. It compares the ordered lists and logs any differences in compareDocsToExcel.log. +6. As a last step it loops through all of content docs again, checking if any alias entry is used in a cross reference link. If so, it's logged in aliasLinkWarnings.log. + +## Assumptions + +The script and its intended use assume the following: + +* The script will initially be run on a local checkout of the repository. +* On the first run an excel table will be generated. This excel table will replace the current Mapping doc. This will be done by porting over any useful information from the Mapping doc into the excel table. +* A new front matter parameter `mapped: true` will be added to docs that are mapped from other Mendix products. The parameter does not need to be present for the initial table creation, but should be present in content files for any subsequent script run. This enables better tracking of mapped files through the repo and the excel table. The idea is to add `mapped: true` to any doc that is mapped, as well as "mapped" to any document entry in the excel table, under column "Front matter". +* After the inital table has been created, the function for its generation can be commented out of the script to skip. +* It is possible to comment out (skip) the check for aliases within cross references. + +## Script Dependencies + +The script has been tested on Python version 3.10.5. + +The package dependencies for the script can be found in file checkAliases-requirements.txt. To install dependencies for running the script via pip run: + +`python -m pip install -r checkAliases-requirements.txt` diff --git a/_scripts/tableFunctions.py b/_scripts/tableFunctions.py new file mode 100644 index 00000000000..4786d1b154a --- /dev/null +++ b/_scripts/tableFunctions.py @@ -0,0 +1,88 @@ +import openpyxl + +# Populates a blank excel table with aliases and mapped URLs from .md files +# Should only be run once, after table exists is not needed +def populateExcelFromList(list, table): + # Open excel file + #workbook = openpyxl.load_workbook(filename=table) + workbook = openpyxl.Workbook() + + sheet = workbook.active + + # Go through list + for item in list: + # Sets special row number for first list item + # TO DO - see if there's a better way to set this + if list.index(item) == 0: + sheet.cell(row=1, column=1, value="Title") + sheet.cell(row=1, column=2, value="URL") + sheet.cell(row=1, column=3, value="Front matter") + sheet.cell(row=1, column=4, value="Aliases") + sheet.cell(row=1, column=5, value="Product") + sheet.cell(row=1, column=6, value="First version") + sheet.cell(row=1, column=7, value="Last version") + sheet.cell(row=1, column=8, value="Location in product") + sheet.cell(row=1, column=9, value="Reported to team") + sheet.cell(row=1, column=10, value="Follow up") + sheet.cell(row=1, column=11, value="Notes") + rowNumber = 2 + # For every subsequent list item calculate the row number + else: + rowNumber = rowNumber + 1 + # Put in values from list to cells + scratchedCell = openpyxl.styles.PatternFill("lightGrid",fill_type=None,fgColor="00C0C0C0") + sheet.cell(row=rowNumber, column=1, value=item["Title"]) + sheet.cell(row=rowNumber, column=2, value=item["URL"]) + sheet.cell(row=rowNumber, column=3, value=item["Front matter"]) + sheet.cell(row=rowNumber, column=4, value="").fill = scratchedCell + if item["aliases"] != None: + # Aliases jump to a new blank row + # There can be more than one + for alias in item["aliases"]: + rowNumber = rowNumber + 1 + sheet.cell(row=rowNumber, column=1, value="").fill = scratchedCell + sheet.cell(row=rowNumber, column=2, value="").fill = scratchedCell + sheet.cell(row=rowNumber, column=3, value="").fill = scratchedCell + sheet.cell(row=rowNumber, column=4, value=alias) + # Save the excel file + workbook.save(filename=table) + +# Creates a list for comparison from excel table +# The list matches the format of initial .md file parsing +# which enables comparison of this and the initial list +def createListFromExcel(table): + # Open excel file + workbook = openpyxl.load_workbook(filename=table) + + sheet = workbook.active + startRow = 2 + listFromTable = [] + + # Loop to keep going through rows until the last one is reached + while startRow < sheet.max_row: + + aliases = [] + nextRow = startRow + 1 + # Grab values from cells + title = sheet.cell(row=startRow, column=1).value + url = sheet.cell(row=startRow, column=2).value + mapped = sheet.cell(row=startRow, column=3).value + if mapped == None: + mapped = "" + # Aliases jump to a new blank row + # There can be more than one + checkNext = sheet.cell(row=nextRow, column=1).value + alias = sheet.cell(row=nextRow, column=4).value + while (checkNext == None) and (alias != None): + aliases.append(alias) + nextRow = nextRow + 1 + alias = sheet.cell(row=nextRow, column=4).value + checkNext = sheet.cell(row=nextRow, column=1).value + # Dump all grabbed values into dict for list + itemDict = {"Title": title, "URL": url, "Front matter": mapped, "aliases": aliases} + listFromTable.append(itemDict) + startRow = nextRow + # Save the excel file + workbook.save(filename=table) + # Return the new list + return listFromTable From 83fe59b2e7418a1ccc8b912db9716e5c244f8d8d Mon Sep 17 00:00:00 2001 From: Karuna-Mendix Date: Mon, 16 Feb 2026 16:02:44 +0530 Subject: [PATCH 2/2] test --- .gitignore | 7 ++++++- _scripts/aliases-list.xlsx | Bin 0 -> 47836 bytes _scripts/checkAliases.py | 2 ++ _scripts/guide-for-checkAliases.md | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 _scripts/aliases-list.xlsx diff --git a/.gitignore b/.gitignore index 25f1bab61d9..ecb1a695302 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,12 @@ hugo.exe /htmltest.exe /.hugo_build.lock - +/_scripts/venv/ +/_scripts/aliasLinkWarnings.log +/_scripts/compareDocsToExcel.log + +/_scripts/~$aliases-list.xlsx + # For Mac users .DS_Store diff --git a/_scripts/aliases-list.xlsx b/_scripts/aliases-list.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b30e1eb4782f88696f6c4926ec947090ebc4ccd9 GIT binary patch literal 47836 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 z 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 YV?9$n4-6L((PiLY7Kq>x4QJo}50)}3!T