Doc-Note

Convert Note-AI XML results to AsciiDoc

import streamlit as st
import xml.etree.ElementTree as ET
import os
import subprocess
import textwrap

Print banner.

@st.cache_data
def print_banner():
    print("""
         _                             _
      __| | ___   ___      _ __   ___ | |_ ___
     / _` |/ _ \\ / __|____| '_ \\ / _ \\| __/ _ \\
    | (_| | (_) | (_|_____| | | | (_) | ||  __/
     \\__,_|\\___/ \\___|    |_| |_|\\___/ \\__\\___|
    """)
    return 1

print_banner()

Get num_files newest files with extension from the provided directory.

def get_newest_files(directory, num_files, extension):
    # Check if the directory exists
    if not os.path.isdir(directory):
        raise ValueError(f"The directory {directory} does not exist.")

    # Get a list of files in the directory with their full paths and modification times
    files_with_paths = []
    for file_name in os.listdir(directory):
        file_path = os.path.join(directory, file_name)
        if os.path.isfile(file_path) and file_name.endswith(extension):
            files_with_paths.append((file_path, os.path.getmtime(file_path)))

    # Sort files by modification time in descending order (newest first)
    sorted_files = sorted(files_with_paths, key=lambda x: x[1], reverse=True)

    # Extract the num_files newest file names
    newest_files = [os.path.basename(file_with_path[0]) for file_with_path in sorted_files[:num_files]]

    return newest_files

newest_files = get_newest_files(".", 5, ".xml")
note_name = st.selectbox(
   "Note",
   newest_files,
)

with open(note_name, 'r') as file:
    xml_data = file.read()

Parse XML

root = ET.fromstring(xml_data)

Extract the question and answer

question = root.find('question').text
answer = root.find('answer').text
prompt = root.find('prompt').text

Button

if st.button("Convert to AsciiDoc"):
    fname = note_name[:-len(".xml")]

    # Step 1: Save the markdown content to a "{fname}.md" file
    md_filename = f"a/{fname}.md"
    with open(md_filename, 'w') as file:
        file.write(answer)

    # Step 2: Run pandoc to convert markdown to asciidoc
    adoc_filename = f"a/{fname}.adoc"
    subprocess.run(["pandoc", "-s", md_filename, "-o", adoc_filename], check=True)

    # Step 3: Delete the markdown file
    os.remove(md_filename)

    # Step 4: Add header to the "{fname}.adoc" file
    header = textwrap.dedent(f"""\
        = {fname}.java
        :icons: font
        :source-highlighter: coderay
        """)
    with open(adoc_filename, 'r+') as adoc_file:
        original_content = adoc_file.read()
        # Move to the start of the file
        adoc_file.seek(0)
        # Write the new header and original content
        adoc_file.write(header +
            f"\n*{prompt}*\n\n" +
            original_content +
            f"\n---\n```java\n{question}\n```\n")

    # Step 5: Run asciidoctor to convert asciidoc to html
    subprocess.run(["asciidoctor", adoc_filename], check=True)

    st.write(f'AsciiDoc generated')

st.divider()
st.write(answer)