Skip to content

Commit a55894c

Browse files
authored
Merge pull request #12 from lukasrynt/main
Fix broken links to pages with the same name as title
2 parents 5dae201 + 01d591c commit a55894c

2 files changed

Lines changed: 40 additions & 16 deletions

File tree

obsidian_interactive_graph/plugin.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,7 @@ def get_page_path(self, page: MkDocsPage) -> str:
3636

3737
def page_if_exists(self, page: str) -> str:
3838
page = self.get_path(self.site_path, page)
39-
for k,_ in self.nodes.items():
40-
if k == page:
41-
return page
42-
return None
39+
return page if page in self.nodes else None
4340

4441
def collect_pages(self, nav: MkDocsNav, config: MkDocsConfig):
4542
for page in nav.pages:
@@ -74,13 +71,7 @@ def parse_markdown(self, markdown: str, page: MkDocsPage):
7471
wikilink = self.page_if_exists(wikilink) or self.page_if_exists(self.get_path(page_path, wikilink)) or wikilink
7572

7673
# find something that matches: shortest path depth
77-
abslen = None
78-
for k,_ in self.nodes.items():
79-
for _ in re.finditer(re.compile(r"(.*" + wikilink + r")"), k):
80-
curlen = k.count('/')
81-
if abslen == None or curlen < abslen:
82-
target_page_path = k
83-
abslen = curlen
74+
target_page_path = find_best_target(self.nodes, wikilink)
8475

8576
if target_page_path == "":
8677
self.logger.warning(page.file.src_uri + ": no target page found for wikilink: " + wikilink)
@@ -97,12 +88,12 @@ def parse_markdown(self, markdown: str, page: MkDocsPage):
9788
self.nodes[target_page_path]["symbolSize"] = self.nodes[target_page_path].get("symbolSize", 1) + 1
9889

9990
def create_graph_json(self, config: MkDocsConfig):
100-
for i, (k,v) in enumerate(self.nodes.items()):
91+
for i, (k, v) in enumerate(self.nodes.items()):
10192
node = {
102-
"id": str(i),
103-
"name": v["title"],
104-
"symbolSize": v["symbolSize"],
105-
"value": v["url"]
93+
"id": str(i),
94+
"name": v["title"],
95+
"symbolSize": v["symbolSize"],
96+
"value": v["url"]
10697
}
10798
self.data["nodes"].append(node)
10899

@@ -122,3 +113,15 @@ def on_page_markdown(self, markdown: str, page: MkDocsPage, config: MkDocsConfig
122113

123114
def on_env(self, env, config: MkDocsConfig, files: MkDocsFiles):
124115
self.create_graph_json(config)
116+
117+
118+
def find_best_target(nodes, wikilink: str) -> str:
119+
abslen = None
120+
target_page_path = ""
121+
for k in nodes.keys():
122+
for _ in re.finditer(re.compile(r"(.*" + wikilink + r"[^/]*$)"), k):
123+
curlen = k.count('/')
124+
if abslen is None or curlen < abslen:
125+
target_page_path = k
126+
abslen = curlen
127+
return target_page_path
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from obsidian_interactive_graph.plugin import find_best_target
2+
3+
4+
def test_find_best_target_normal():
5+
nodes = {
6+
"Example page/docs/optional/Test": {},
7+
"Example page/docs/Test": {},
8+
"Example page/docs/Example": {},
9+
"Example page/index": {}
10+
}
11+
best_target = find_best_target(nodes, "Test")
12+
assert best_target == "Example page/docs/Test"
13+
14+
best_target = find_best_target(nodes, "Example")
15+
assert best_target == "Example page/docs/Example"
16+
17+
best_target = find_best_target(nodes, "index")
18+
assert best_target == "Example page/index"
19+
20+
best_target = find_best_target(nodes, "index")
21+
assert best_target == "Example page/index"

0 commit comments

Comments
 (0)