Skip to content

Commit d18322b

Browse files
committed
fix(mnq): script
1 parent d3ec758 commit d18322b

File tree

2 files changed

+388
-21
lines changed

2 files changed

+388
-21
lines changed
Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 1,
6+
"id": "1f19b09f",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"import os"
11+
]
12+
},
13+
{
14+
"cell_type": "code",
15+
"execution_count": 13,
16+
"id": "5d9eaf32",
17+
"metadata": {},
18+
"outputs": [],
19+
"source": [
20+
"BASE_DIR = \"../serverless/messaging/\""
21+
]
22+
},
23+
{
24+
"cell_type": "code",
25+
"execution_count": 14,
26+
"id": "6cb56242",
27+
"metadata": {},
28+
"outputs": [],
29+
"source": [
30+
"def get_markdown_files(base_dir):\n",
31+
" md_files = []\n",
32+
" for root, dirs, files in os.walk(base_dir):\n",
33+
" for file in files:\n",
34+
" if file.endswith(\".mdx\"):\n",
35+
" md_files.append(os.path.join(root, file))\n",
36+
" return md_files"
37+
]
38+
},
39+
{
40+
"cell_type": "code",
41+
"execution_count": 15,
42+
"id": "d9ec5c2b",
43+
"metadata": {},
44+
"outputs": [],
45+
"source": [
46+
"md_files = get_markdown_files(BASE_DIR)"
47+
]
48+
},
49+
{
50+
"cell_type": "code",
51+
"execution_count": 16,
52+
"id": "0de47c9f",
53+
"metadata": {},
54+
"outputs": [
55+
{
56+
"name": "stdout",
57+
"output_type": "stream",
58+
"text": [
59+
"['../serverless/messaging/quickstart.mdx', '../serverless/messaging/concepts.mdx', '../serverless/messaging/index.mdx', '../serverless/messaging/api-cli/sqs-sns-aws-cli.mdx', '../serverless/messaging/api-cli/nats-cli.mdx', '../serverless/messaging/api-cli/python-node-sns.mdx', '../serverless/messaging/api-cli/connect-aws-cli.mdx', '../serverless/messaging/api-cli/python-node-sqs.mdx', '../serverless/messaging/api-cli/index.mdx', '../serverless/messaging/reference-content/sns-support.mdx', '../serverless/messaging/reference-content/sqs-overview.mdx', '../serverless/messaging/reference-content/sqs-support.mdx', '../serverless/messaging/reference-content/sns-overview.mdx', '../serverless/messaging/reference-content/limitations.mdx', '../serverless/messaging/reference-content/nats-overview.mdx', '../serverless/messaging/reference-content/index.mdx', '../serverless/messaging/how-to/create-credentials.mdx', '../serverless/messaging/how-to/monitor-mnq-cockpit.mdx', '../serverless/messaging/how-to/create-manage-queues.mdx', '../serverless/messaging/how-to/get-started.mdx', '../serverless/messaging/how-to/manage-credentials.mdx', '../serverless/messaging/how-to/deactivate-delete-messaging.mdx', '../serverless/messaging/how-to/create-manage-topics.mdx', '../serverless/messaging/how-to/create-manage-subscriptions.mdx', '../serverless/messaging/how-to/index.mdx']\n"
60+
]
61+
}
62+
],
63+
"source": [
64+
"print(md_files)"
65+
]
66+
},
67+
{
68+
"cell_type": "code",
69+
"execution_count": 17,
70+
"id": "cb145406",
71+
"metadata": {},
72+
"outputs": [],
73+
"source": [
74+
"def clean_string(input_string):\n",
75+
" # Remove everything before the first '/'\n",
76+
" first_slash_index = input_string.find('/')\n",
77+
" if first_slash_index != -1:\n",
78+
" cleaned_string = input_string[first_slash_index + 1:] # Get the substring after the first '/'\n",
79+
" else:\n",
80+
" cleaned_string = input_string # If '/' not found, use the original string\n",
81+
" \n",
82+
" # Remove all occurrences of '.mdx'\n",
83+
" cleaned_string = cleaned_string.replace('.mdx', '')\n",
84+
"\n",
85+
" return cleaned_string"
86+
]
87+
},
88+
{
89+
"cell_type": "code",
90+
"execution_count": 31,
91+
"id": "996ea396",
92+
"metadata": {},
93+
"outputs": [
94+
{
95+
"name": "stdout",
96+
"output_type": "stream",
97+
"text": [
98+
"Checking file ../serverless/messaging/quickstart.mdx\n",
99+
"Checking file ../serverless/messaging/concepts.mdx\n",
100+
"checking anchor link /serverless/messaging/concepts#publishsubscribe\n",
101+
"In file ['../serverless/messaging/concepts.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/concepts#publishsubscribe\n",
102+
"checking anchor link /serverless/messaging/concepts#fifo\n",
103+
"checking anchor link /serverless/messaging/concepts#standard\n",
104+
"checking anchor link /serverless/messaging/concepts#topic-based\n",
105+
"checking anchor link /serverless/messaging/concepts#queues\n",
106+
"checking anchor link /serverless/messaging/concepts#messaging-protocol\n",
107+
"checking anchor link /serverless/messaging/concepts#nats\n",
108+
"checking anchor link /serverless/messaging/concepts#nats\n",
109+
"checking anchor link /serverless/messaging/concepts#queuing\n",
110+
"checking anchor link /serverless/messaging/concepts#queue\n",
111+
"checking anchor link /serverless/messaging/concepts#sqs\n",
112+
"checking anchor link /serverless/messaging/concepts#standard\n",
113+
"checking anchor link /serverless/messaging/concepts#publishsubscribe\n",
114+
"In file ['../serverless/messaging/concepts.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/concepts#publishsubscribe\n",
115+
"checking anchor link /serverless/messaging/concepts#topic-based\n",
116+
"checking anchor link /serverless/messaging/concepts#publishsubscribe\n",
117+
"In file ['../serverless/messaging/concepts.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/concepts#publishsubscribe\n",
118+
"checking anchor link /serverless/messaging/concepts#queuing\n",
119+
"checking anchor link /serverless/messaging/concepts#fifo\n",
120+
"checking anchor link /serverless/messaging/concepts#publishsubscribe\n",
121+
"In file ['../serverless/messaging/concepts.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/concepts#publishsubscribe\n",
122+
"checking anchor link /serverless/messaging/concepts#region\n",
123+
"checking anchor link /serverless/messaging/concepts#queue\n",
124+
"checking anchor link /serverless/messaging/concepts#standard\n",
125+
"checking anchor link /serverless/messaging/concepts#publishsubscribe\n",
126+
"In file ['../serverless/messaging/concepts.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/concepts#publishsubscribe\n",
127+
"checking anchor link /serverless/messaging/concepts#sns\n",
128+
"Checking file ../serverless/messaging/index.mdx\n",
129+
"Checking file ../serverless/messaging/api-cli/sqs-sns-aws-cli.mdx\n",
130+
"Checking file ../serverless/messaging/api-cli/nats-cli.mdx\n",
131+
"Checking file ../serverless/messaging/api-cli/python-node-sns.mdx\n",
132+
"Checking file ../serverless/messaging/api-cli/connect-aws-cli.mdx\n",
133+
"Checking file ../serverless/messaging/api-cli/python-node-sqs.mdx\n",
134+
"Checking file ../serverless/messaging/api-cli/index.mdx\n",
135+
"Checking file ../serverless/messaging/reference-content/sns-support.mdx\n",
136+
"checking anchor link /serverless/messaging/reference-content/sns-support#sns-api-support-topic-attributes\n",
137+
"In file ['../serverless/messaging/reference-content/sns-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sns-support#sns-api-support-topic-attributes\n",
138+
"checking anchor link /serverless/messaging/reference-content/sns-support#sns-api-support-subscription-attributes\n",
139+
"In file ['../serverless/messaging/reference-content/sns-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sns-support#sns-api-support-subscription-attributes\n",
140+
"checking anchor link /serverless/messaging/reference-content/sns-support#sns-api-support-topic-attributes\n",
141+
"In file ['../serverless/messaging/reference-content/sns-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sns-support#sns-api-support-topic-attributes\n",
142+
"checking anchor link /serverless/messaging/reference-content/sns-support#sns-api-support-topic-attributes\n",
143+
"In file ['../serverless/messaging/reference-content/sns-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sns-support#sns-api-support-topic-attributes\n",
144+
"checking anchor link /serverless/messaging/reference-content/sns-support#sns-api-support-subscription-attributes\n",
145+
"In file ['../serverless/messaging/reference-content/sns-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sns-support#sns-api-support-subscription-attributes\n",
146+
"checking anchor link /serverless/messaging/reference-content/sns-support#sns-api-support-subscription-attributes\n",
147+
"In file ['../serverless/messaging/reference-content/sns-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sns-support#sns-api-support-subscription-attributes\n",
148+
"Checking file ../serverless/messaging/reference-content/sqs-overview.mdx\n",
149+
"Checking file ../serverless/messaging/reference-content/sqs-support.mdx\n",
150+
"checking anchor link /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
151+
"In file ['../serverless/messaging/reference-content/sqs-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
152+
"checking anchor link /serverless/messaging/reference-content/sqs-support#sqs-api-support-message-attributes\n",
153+
"In file ['../serverless/messaging/reference-content/sqs-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sqs-support#sqs-api-support-message-attributes\n",
154+
"checking anchor link /serverless/messaging/reference-content/sqs-support#sqs-api-support-message-attributes\n",
155+
"In file ['../serverless/messaging/reference-content/sqs-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sqs-support#sqs-api-support-message-attributes\n",
156+
"checking anchor link /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
157+
"In file ['../serverless/messaging/reference-content/sqs-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
158+
"checking anchor link /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
159+
"In file ['../serverless/messaging/reference-content/sqs-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
160+
"checking anchor link /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
161+
"In file ['../serverless/messaging/reference-content/sqs-support.mdx'] there is an internal link to non-existant anchor: /serverless/messaging/reference-content/sqs-support#sqs-api-support-queue-attributes\n",
162+
"checking anchor link /serverless/messaging/reference-content/sqs-support#changemessagevisibility\n",
163+
"Checking file ../serverless/messaging/reference-content/sns-overview.mdx\n",
164+
"Checking file ../serverless/messaging/reference-content/limitations.mdx\n",
165+
"Checking file ../serverless/messaging/reference-content/nats-overview.mdx\n",
166+
"Checking file ../serverless/messaging/reference-content/index.mdx\n",
167+
"Checking file ../serverless/messaging/how-to/create-credentials.mdx\n",
168+
"Checking file ../serverless/messaging/how-to/monitor-mnq-cockpit.mdx\n",
169+
"Checking file ../serverless/messaging/how-to/create-manage-queues.mdx\n",
170+
"Checking file ../serverless/messaging/how-to/get-started.mdx\n",
171+
"Checking file ../serverless/messaging/how-to/manage-credentials.mdx\n",
172+
"Checking file ../serverless/messaging/how-to/deactivate-delete-messaging.mdx\n",
173+
"Checking file ../serverless/messaging/how-to/create-manage-topics.mdx\n",
174+
"Checking file ../serverless/messaging/how-to/create-manage-subscriptions.mdx\n",
175+
"Checking file ../serverless/messaging/how-to/index.mdx\n"
176+
]
177+
}
178+
],
179+
"source": [
180+
"## FIND HEADERS\n",
181+
"\n",
182+
"for md_file in md_files:\n",
183+
" \n",
184+
" headers_in_file = []\n",
185+
" anchor_links_in_file = []\n",
186+
" links_to_anchors_in_other_files = []\n",
187+
" \n",
188+
" with open(md_file, 'r', encoding='utf-8') as file:\n",
189+
" lines = file.readlines()\n",
190+
" filename = str(md_file)\n",
191+
" print(\"Checking file\", filename)\n",
192+
" \n",
193+
" for line in lines:\n",
194+
" line = line.strip()\n",
195+
" \n",
196+
" ## Extract headers in anchor form\n",
197+
" if line.startswith(\"##\"):\n",
198+
" header = line.lstrip('#').strip()\n",
199+
" header = header.lower().replace(' ', '-').replace('.', '').replace('\\'', '')\n",
200+
" header = \"#\" + header\n",
201+
" # rebuild anchor link so its a complete link\n",
202+
" header = \"/\" + filename[2:] + header\n",
203+
" header = clean_string(header)\n",
204+
" headers_in_file.append(header)\n",
205+
"\n",
206+
" ## Extract internal links to anchors on the page\n",
207+
" if '](#' in line and ')' in line:\n",
208+
" # Extract text inside the brackets [] and the link inside parentheses ()\n",
209+
" start_link = line.find('](#') + 2\n",
210+
" sep = ')'\n",
211+
" anchor_link = line[start_link:].split(sep,1)[0]\n",
212+
" # rebuild anchor link so its a complete link\n",
213+
" anchor_link = '/' + filename[2:] + anchor_link\n",
214+
" anchor_link = clean_string(anchor_link)\n",
215+
" anchor_links_in_file.append(anchor_link)\n",
216+
" \n",
217+
" ## Extract internal links to anchors on other doc pages\n",
218+
" if '](/' in line and ')' in line and '#' in line:\n",
219+
" start_link = line.find('](/') + 2\n",
220+
" sep = ')'\n",
221+
" link_to_anchors_in_other_file = line[start_link:].split(sep,1)[0]\n",
222+
" links_to_anchors_in_other_files.append(link_to_anchors_in_other_file)\n",
223+
" \n",
224+
" ## Check whether there are links that aren't anchors in the file\n",
225+
" for anchor_link in anchor_links_in_file:\n",
226+
" print(\"checking anchor link\", anchor_link)\n",
227+
" if anchor_link not in headers_in_file:\n",
228+
" print(\"In file\", [md_file], \"there is an internal link to non-existant anchor:\", anchor_link)\n"
229+
]
230+
},
231+
{
232+
"cell_type": "code",
233+
"execution_count": 8,
234+
"id": "18a22ba3",
235+
"metadata": {},
236+
"outputs": [
237+
{
238+
"ename": "NameError",
239+
"evalue": "name 'headers_in_file' is not defined",
240+
"output_type": "error",
241+
"traceback": [
242+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
243+
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
244+
"Cell \u001b[0;32mIn[8], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43mheaders_in_file\u001b[49m)\n",
245+
"\u001b[0;31mNameError\u001b[0m: name 'headers_in_file' is not defined"
246+
]
247+
}
248+
],
249+
"source": [
250+
"print(headers_in_file)"
251+
]
252+
},
253+
{
254+
"cell_type": "code",
255+
"execution_count": null,
256+
"id": "d781eb6d",
257+
"metadata": {},
258+
"outputs": [],
259+
"source": []
260+
},
261+
{
262+
"cell_type": "code",
263+
"execution_count": null,
264+
"id": "b8933c87",
265+
"metadata": {},
266+
"outputs": [],
267+
"source": []
268+
}
269+
],
270+
"metadata": {
271+
"kernelspec": {
272+
"display_name": "Python 3 (ipykernel)",
273+
"language": "python",
274+
"name": "python3"
275+
},
276+
"language_info": {
277+
"codemirror_mode": {
278+
"name": "ipython",
279+
"version": 3
280+
},
281+
"file_extension": ".py",
282+
"mimetype": "text/x-python",
283+
"name": "python",
284+
"nbconvert_exporter": "python",
285+
"pygments_lexer": "ipython3",
286+
"version": "3.10.9"
287+
}
288+
},
289+
"nbformat": 4,
290+
"nbformat_minor": 5
291+
}

0 commit comments

Comments
 (0)