I exported a notebook to markdown (which is great), but I found that the files don't have links to other files like they were in Siyuan.
So, is there anyway to make markdown exports have links to other files?
I exported a notebook to markdown (which is great), but I found that the files don't have links to other files like they were in Siyuan.
So, is there anyway to make markdown exports have links to other files?
I appreciate your resonse, but it is not only for complete batch export for users to turn away from siyuan, but rather for collaborative reasons and to publish notes. Users of Siyuan can collaborate and share specific notes.
I just want a guide on how to use anchor hash
. How would I proceed after I used the feature after export, so post anchor hash
. I do not quite understand what to do with the new file after export.
I was able to do it (for documents only, not blocks, as I don't know how to find out if the link is of a block or a document, and I don't want to mutate the linked documents anyway).
Here's the Python script:
import os
import re
import requests
# Replace 'YOUR_API_ENDPOINT' with the actual Siyuan API endpoint
SIYUAN_API_ENDPOINT = "http://localhost:6806"
# Function to make a SQL query to Siyuan API
def query_block_details(block_id):
query = {"stmt": f"SELECT * FROM blocks WHERE id='{block_id}'"}
response = requests.post(f"{SIYUAN_API_ENDPOINT}/api/query/sql", json=query)
return response.json()
# Function to process each markdown file
def process_markdown_file(file_path):
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
# Use regex to find instances of [Anchor text](siyuan://blocks/block-id)
matches = re.findall(r"\[.*?\]\(siyuan://blocks/(.*?)\)", content)
for block_id in matches:
# Query Siyuan API to get block details
result = query_block_details(block_id)
# Assumes ref is of a document, not a block
if result:
hpath_value = result["data"][0].get("hpath")
# Replace the siyuan://blocks/block-id with hpath_value.md
new_link = f"({hpath_value}.md)"
# Replace the old link in the content
content = content.replace(f"(siyuan://blocks/{block_id})", new_link)
# Write the updated content back to the file
with open(file_path, "w", encoding="utf-8") as file:
file.write(content)
def process_markdown_directory(directory_path):
for root, _, files in os.walk(directory_path):
for file_name in files:
if file_name.endswith(".md"):
file_path = os.path.join(root, file_name)
process_markdown_file(file_path)
# Replace 'YOUR_MARKDOWN_DIRECTORY_PATH' with the actual path to your exported markdown files
markdown_directory_path = "YOUR_MARKDOWN_DIRECTORY_PATH"
# Process each markdown file in the specified path
process_markdown_directory(markdown_directory_path)
I think there is a fairly simple solution to this, which I will describe below. I think it can be implemented as a simple Python script that does some post-processing of the exported markdown files. I will try to create a proof-of-concept script, but it will take me a few days because I am not a programmer and will need to learn some Python programming first.
In Settings > Export configure 'Ref' to 'Anchor text with block URL'. After doing this, a link to another block in a SiYuan note appears in the exported Markdown file as [Anchor text](siyuan://blocks/block-id)
.
Write a Python script that opens each exported markdown file and uses regex matching to identify all instances of [Anchor text](siyuan://blocks/block-id)
. For each instance,
Use the /api/query/sql
API endpoint to get details of the block-id
by making a query like:
{ "stmt": "SELECT * FROM blocks WHERE id='block-id'" }
In the query result, you can find the hpath
key whose value is a human readable path.
siyuan://blocks/block-id
with hpath_value.md which would be the relative path to the exported markdown file that the link points to.hpath
for that block-id), find the start of the paragraph and add an <a name="block-id"></a>
anchor at the start of the paragraph. Then, the siyuan://blocks/block-id
in the exported markdown file can be replaced by hpath_value.md#block-id
This would basically solve the problem of having correct links in the exported markdown files and additionally the exported notes can easily be converted to HTML and published e.g. with a static site generator like Hugo.
@88250 Do you see any problems with this approach? I don't understand why SiYuan does not do this already when exporting to markdown.. but in any case, a Python script that does the above can post-process the exported markdown files from SiYuan and fix all the links. What do you think?
Here's the before and after comparison.
Before:
# Networking
The most important things to know are the networking protocols.
* [TCP](siyuan://blocks/20231110002225-jzlfmvr)
* [UDP](siyuan://blocks/20231111114912-9gi1l0p)
* [HTTP](siyuan://blocks/20231110002250-b9w413n)
* [TLS](siyuan://blocks/20231111114933-oti4rz4)
* [WebSockets](siyuan://blocks/20231111115839-xw23n4k)
* [WebRTC](siyuan://blocks/20231111114916-nevtkga)
After:
# Networking
The most important things to know are the networking protocols.
* [TCP](/Networking/TCP.md)
* [UDP](/Networking/UDP.md)
* [HTTP](/Networking/HTTP.md)
* [TLS](/Networking/TLS.md)
* [WebSockets](/Networking/WebSockets.md)
* [WebRTC](/Networking/WebRTC.md)
Welcome to here!
Here we can learn from each other how to use SiYuan, give feedback and suggestions, and build SiYuan together.
Signup About