Is it possible for markdown export to link to other files?

This post was last updated for 613 days ago, and the information may already be changed

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?

    Welcome to here!

    Here we can learn from each other how to use SiYuan, give feedback and suggestions, and build SiYuan together.

    Signup About
    Please input reply content ...
    • Siysuy

      The anchor hash feature currently creates a span object <span id="20231110120736-ze6m41f"></span>. Some kind of program should be able to understand and find this block inside the note as reference. Can anyone help me understand how this can be useful after export, where do I use this, which program understands this syntax?

      The export mode Anchor hash for notebook Markdown exporting has some limitations.

      In the case i want to publish a particular note (with links to other notes) my approach is:

      1. From main notebook export the notebook you want to publish to .sy.zip file
      2. Create new (temporary) notebook
      3. import .sy.zip file to new temp notebook
      4. Export temp notebook export it to any selectable format (only markdown is currently selectable)

      Other limitation of Anchor has export and the only way I got it to work (performed testing by exporting to Obsidian):

      • currently only works for notebook and does not allow nested notes. In the process of exporting all notes must be unnested inside notebook for .md export to function.
      • Currently does not support block reference. Can only link to main note. Tested by importing to obsidian (not a siyuan issue, but a markdown syntax limitation i presume)

      Depending on the responses here I might add a feature request soon that involves the concept of user selectable export syntax. In which before execution of export using anchor hash a user can type in the conversion syntax to apply. User is presented with input fields much like the settings > Export > Anchor text wrapping symbol fields.

      Conversion syntax for siyuan > obsidian would be: [[test3.md/Note 2#^d8bf62|Note 2]] and conversion input fields could somehow be [[ .. / .. #^ .. | .. ]]

      1 Reply
    • MiscReply
    • adham via Linux
      Author

      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)
    • sagar 2 1 Up via Ubuntu
      VIP Warrior

      @88250 I think this is an important missing feature when it comes to publishing the notes. Let me explain:

      Many users, including me, like to make a lot of links between notes. We also like to publish some set of notes on our websites/blogs/digital gardens. With most other note-taking software, you can export the notes to markdown, which includes links to other markdown documents (or even specific paragraphs in the markdown documents). Then, static site generators like Hugo can ingest the markdown files and produce HTML pages for the web. These HTML pages have all the correct links to other notes' HTML pages. With SiYuan, since the exported markdown does not contain links to other notes, publishing notes with links to other notes is not possible at all. I think this is a problem for many potential users. Do you have any other suggestions for how to publish notes in SiYuan with all links-between-notes working properly?

      I think this is important for another reason: With other tools like Obsidian, the notes are stored as normal markdown files. This means that the notes are not "trapped" inside the note-taking software. SiYuan does not store content as markdown files. Even if the format is still open, it still feels like the notes are "trapped" or "locked inside" SiYuan. If SiYuan has an excellent ability to export the notes to markdown (e.g. with all the links preserved) it would feel less like the notes are locked away inside SiYuan. I think this will increase trust in SiYuan, since users will not worry that if SiYuan unfortunately disappears, then their notes will disappear with it.

      I understand that because SiYuan offers a lot more complex formatting options, exporting to Markdown with everything properly preserved is not possible. This comes from the limitations of Markdown. However, there should ideally be a way to publish the notes (perhaps to HTML) so that all the formatting and links are preserved. I think maybe this is currently possible for each entry in the Doc Tree, but ideally, it should be possible for an entire hierarchy in the Doc Tree i.e. a given note and all notes below it should be exported. Please let me know if this is already possible.

      1 Reply
      1 Operate
      sagar updated this reply at 2023-11-29 02:41:05
    • adham 1 via Linux
      Author

      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)
    • Visit all replies