Commit 8afe9e6d authored by ankraft's avatar ankraft
Browse files

Now using absolute filenames

parent 4e5fb541
Loading
Loading
Loading
Loading
+62 −6
Original line number Diff line number Diff line
@@ -37,6 +37,8 @@ def analyseMarkdown(filename:str) -> list[Clause]:
			The list of clauses.
	"""

	print(f'[gray]Analyzing file "{filename}"')

	with open(filename, 'r') as file:
		inLines = file.readlines()
	
@@ -165,7 +167,7 @@ def writeClauses(outLines:list[Clause], filename:str, navTitle:str) -> None:
		# write to single files
		with open(f'{os.path.dirname(filename)}/{navTitle}/{i}.md', 'w') as file:
			file.writelines(f.lines)
			print(f'[green]File "{i}.md" written')
			print(f'[green]File "{i}.md" written - "{f.title}"')

	
	# write nav.yml file
@@ -181,6 +183,58 @@ def writeClauses(outLines:list[Clause], filename:str, navTitle:str) -> None:
	print(f'[green]File "_nav.yml" written')


_markdownLink = re.compile(r'\[.*\]\((.*)\)', re.IGNORECASE)
_htmlLink = re.compile(r'<a\s+href="([^"\']*)">[^<]*</a>', re.IGNORECASE)
_anchorLink = re.compile(r'<a\s+name="([^"]*)">[^<]*</a>', re.IGNORECASE)

def updateLinks(clauses:list[Clause]) -> list[Clause]:
	"""	Update the links in the clauses to the new structure.

		Args:
			clauses: The list of clauses.
		
		Returns:
			The list of clauses.
	"""

	# Build the link target dictionary
	linkTargets = {}


	for clause in clauses:
		for i, line in enumerate(clause.lines):
			if (lnk := _anchorLink.findall(line)):
				linkTargets[lnk[0]] = clause

			# # Check if the line contains a link
			# if not (lnk := _markdownLink.search(line)) and not (lnk := _htmlLink.search(line)) and not (lnk := _anchorLink.search(line)):
			# 	continue
			# print(lnk)
			# print(lnk.groups()[0])
			



			# Update links in the markdown file
			for title in [ c.title for c in clauses ]:
				if title in line:
					clause.lines[i] = line.replace(title, f'{title}/{title.casefold()}.md')

	# Create a dictionary with the titles and the corresponding clause
	clauseDict = {}
	for clause in clauses:
		clauseDict[clause.title] = clause

	# Go through the clauses and update the links
	for clause in clauses:
		for i, line in enumerate(clause.lines):
			# Update links in the markdown file
			for title in clauseDict.keys():
				if title in line:
					clause.lines[i] = line.replace(title, f'{title}/{title.casefold()}.md')

	return clauses

def copyMediaFiles(filename:str, navTitle:str, mediaDirectory:str = 'media') -> None:
	"""	Copy media files from the source directory to the target directory.

@@ -193,18 +247,20 @@ def copyMediaFiles(filename:str, navTitle:str, mediaDirectory:str = 'media') ->
	targetDirectory = f'{os.path.dirname(filename)}/{navTitle}/{mediaDirectory}'

	if os.path.exists(sourceDirectory):
		print(f'[green]Copying media files from "{sourceDirectory}" to "{targetDirectory}"')
		shutil.copytree(sourceDirectory, targetDirectory, dirs_exist_ok = True)
		print(f'[green]Copied media files from "{sourceDirectory}" to "{targetDirectory}"')
	else:
		print(f'[red]Media directory "{sourceDirectory}" does not exist')

	
def processDocument(args:argparse.Namespace) -> None:
	clauses = analyseMarkdown(args.document)
	document = os.path.abspath(args.document)
	clauses = analyseMarkdown(document)
	clauses = splitMarkdownDocument(clauses, [ t.casefold() for t in args.ignore_clause ], args.split_level)
	# clauses = updateLinks(clauses)
	clauses = prepareForMkdocs(clauses)
	writeClauses(clauses, args.document, args.title)
	copyMediaFiles(args.document, args.title, args.media_directory)
	writeClauses(clauses, document, args.title)
	copyMediaFiles(document, args.title, args.media_directory)


if __name__ == '__main__':
@@ -213,7 +269,7 @@ if __name__ == '__main__':
	parser.add_argument('--title', '-t', metavar = 'title', required = True, help = 'mkdocs navigation tile')
	parser.add_argument('--ignore-clause', '-i', metavar = 'clause', nargs = '+', default = [ 'Contents', 'History' ], help = 'ignore headers in the markdown document')
	parser.add_argument('--split-level', '-sl', metavar = 'level', type = int, default = 2, help = 'split clauses on which level')
	parser.add_argument('--media-directory', '-md', metavar = 'media-directory', default = 'media', help = 'directory where media files are stored')
	parser.add_argument('--media-directory', '-md', metavar = 'media-directory', default = 'media', help = 'directory name where media files are stored')
	parser.add_argument('document', type = str, help = 'a oneM2M markdown specification document to process')

	args = parser.parse_args()