From 6fdf52087b527124a88819d6e7cc7c63979b0dfd Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Mon, 1 Jun 2026 09:15:32 +0000 Subject: [PATCH] endnotes and some new styling tags --- RT-style-JS_public.tar | Bin 0 -> 133120 bytes developer/authored/RT/element/citation.js | 56 ++ developer/authored/RT/element/constraint.js | 13 + developer/authored/RT/element/crossref.js | 15 + developer/authored/RT/element/symbol.js | 10 + .../authored/RT/layout/article_tech_ref.js | 19 +- developer/authored/RT/tool/to_pdf2.py | 479 ++++++++++++++++++ 7 files changed, 589 insertions(+), 3 deletions(-) create mode 100644 RT-style-JS_public.tar create mode 100644 developer/authored/RT/element/citation.js create mode 100644 developer/authored/RT/element/constraint.js create mode 100644 developer/authored/RT/element/crossref.js create mode 100644 developer/authored/RT/element/symbol.js create mode 100644 developer/authored/RT/tool/to_pdf2.py diff --git a/RT-style-JS_public.tar b/RT-style-JS_public.tar new file mode 100644 index 0000000000000000000000000000000000000000..3967e2d6757482a36fa4b7091dbb3ac321baad4c GIT binary patch literal 133120 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 { + const refNum = index + 1; + const refText = cite.getAttribute('ref') || cite.innerHTML; + + // Transform the inline tag into a superscript link + cite.innerHTML = `[${refNum}]`; + cite.style.cursor = 'pointer'; + cite.style.color = 'var(--rt-brand-link)'; + cite.style.textDecoration = 'none'; + + // Append the corresponding entry into the endnotes list + const li = document.createElement('li'); + li.id = `note-${refNum}`; + li.innerHTML = `${refText} `; + list.appendChild(li); + }); + + // Style the container + endnoteContainer.style.display = 'block'; + endnoteContainer.style.marginTop = '1rem'; + endnoteContainer.style.borderTop = '1px solid var(--rt-surface-3)'; + endnoteContainer.style.paddingTop = '1rem'; +}; diff --git a/developer/authored/RT/element/constraint.js b/developer/authored/RT/element/constraint.js new file mode 100644 index 0000000..dc4b596 --- /dev/null +++ b/developer/authored/RT/element/constraint.js @@ -0,0 +1,13 @@ +// developer/authored/RT/element/constraint.js +window.StyleRT = window.StyleRT || {}; + +window.StyleRT.constraint = function(){ + document.querySelectorAll('rt-constraint').forEach( (el) => { + el.style.display = 'block'; + el.style.borderLeft = '4px solid var(--rt-state-warning)'; + el.style.backgroundColor = 'var(--rt-surface-1)'; + el.style.padding = '1rem'; + el.style.margin = '1.5rem 0'; + el.style.color = 'var(--rt-content-main)'; + }); +}; diff --git a/developer/authored/RT/element/crossref.js b/developer/authored/RT/element/crossref.js new file mode 100644 index 0000000..f0b2c60 --- /dev/null +++ b/developer/authored/RT/element/crossref.js @@ -0,0 +1,15 @@ +// developer/authored/RT/element/crossref.js +window.StyleRT = window.StyleRT || {}; + +window.StyleRT.crossref = function(){ + document.querySelectorAll('rt-crossref').forEach( (el) => { + el.style.color = 'var(--rt-brand-link)'; + el.style.textDecoration = 'underline'; + el.style.cursor = 'pointer'; + el.style.fontWeight = '500'; + + // Note: To make this fully context-aware across soft limits, + // this module will eventually need to hook into the page + // registry built by paginate_by_element.js. + }); +}; diff --git a/developer/authored/RT/element/symbol.js b/developer/authored/RT/element/symbol.js new file mode 100644 index 0000000..748ad75 --- /dev/null +++ b/developer/authored/RT/element/symbol.js @@ -0,0 +1,10 @@ +// developer/authored/RT/element/symbol.js +window.StyleRT = window.StyleRT || {}; + +window.StyleRT.symbol = function(){ + document.querySelectorAll('rt-symbol').forEach( (el) => { + el.style.fontFamily = '"Courier New", Courier, monospace'; + el.style.fontWeight = '600'; + el.style.padding = '0 0.1em'; + }); +}; diff --git a/developer/authored/RT/layout/article_tech_ref.js b/developer/authored/RT/layout/article_tech_ref.js index 0ac7fec..a663f0f 100644 --- a/developer/authored/RT/layout/article_tech_ref.js +++ b/developer/authored/RT/layout/article_tech_ref.js @@ -32,6 +32,7 @@ let is_layout_locked = true; // 5. Declare Dependencies + RT.include('RT/element/citation'); RT.include('RT/core/utility'); RT.include('RT/element/math'); RT.include('RT/element/code'); @@ -39,10 +40,18 @@ RT.include('RT/element/TOC'); RT.include('RT/element/title'); RT.include('RT/element/theme_selector'); + RT.include('RT/element/symbol'); + RT.include('RT/element/constraint'); + RT.include('RT/element/crossref'); + + RT.include('RT/layout/paginate_by_element'); RT.include('RT/layout/page_fixed_glow'); + RT.include('RT/layout/paginate_by_element'); + RT.include('RT/core/body_visibility_visible'); + // 6. The Typography Layout RT.article = function(){ RT.config = RT.config || {}; @@ -175,16 +184,20 @@ }; // 7. The Execution Sequence - function run_semantics() { - debug.log('scroll', `4. run_semantics starting.`); + function run_semantics(){ + debug.log('scroll' ,`4. run_semantics starting.`); if(RT.theme) RT.theme(); + if(RT.citation) RT.citation(); RT.article(); if(RT.title) RT.title(); if(RT.term) RT.term(); if(RT.math) RT.math(); if(RT.code) RT.code(); + if(RT.symbol) RT.symbol(); + if(RT.constraint) RT.constraint(); + if(RT.crossref) RT.crossref(); - if(window.MathJax && MathJax.Hub && MathJax.Hub.Queue){ + if( window.MathJax && MathJax.Hub && MathJax.Hub.Queue ){ MathJax.Hub.Queue( ["Typeset" ,MathJax.Hub] ,run_layout ); }else{ run_layout(); diff --git a/developer/authored/RT/tool/to_pdf2.py b/developer/authored/RT/tool/to_pdf2.py new file mode 100644 index 0000000..a493d27 --- /dev/null +++ b/developer/authored/RT/tool/to_pdf2.py @@ -0,0 +1,479 @@ +import re +import os +import glob +from weasyprint import HTML + +def process_rt_html(html_str, out_file): + # Fix escaped dollar signs + html_str = html_str.replace('\\$', '$') + + # Remove hardcoded page breaks that cause blank pages + html_str = re.sub(r']*["\']>\s*', '', html_str, flags=re.IGNORECASE) + + css = """ + + """ + + # Inject CSS + html_str = html_str.replace("", css + "") + + # Process Title Block + title_match = re.search(r']+)>(.*?)', html_str, re.DOTALL | re.IGNORECASE) + if title_match: + attrs = title_match.group(1) + title = re.search(r'title="(.*?)"', attrs).group(1) if 'title="' in attrs else 'Document' + author = re.search(r'author="(.*?)"', attrs).group(1) if 'author="' in attrs else '' + date = re.search(r'date="(.*?)"', attrs).group(1) if 'date="' in attrs else '' + copyright_txt = re.search(r'copyright="(.*?)"', attrs).group(1) if 'copyright="' in attrs else '' + + title_block = f''' +
+

{title}

+
{author} | {date}
+ +
+ ''' + html_str = html_str[:title_match.start()] + title_block + html_str[title_match.end():] + + # Process TOC + toc_match = re.search(r'', html_str, re.IGNORECASE) + if toc_match: + level = toc_match.group(1) + headings = [] + if '-' in level: + headings = re.findall(r'(.*?)', html_str, re.IGNORECASE) + else: + headings = re.findall(rf'(.*?)', html_str, re.IGNORECASE) + + toc_html = '
Table of Contents
    ' + for lvl, text in headings: + # exclude COVER SHEET from TOC + if "COVER SHEET" in text: + continue + toc_html += f'
  • {text}
  • ' + toc_html += '
' + + html_str = html_str[:toc_match.start()] + toc_html + html_str[toc_match.end():] + + # Term Replacement (First occurrence) + seen_terms = set() + def term_replace(match): + text = match.group(1) + l_text = text.lower() + if l_text not in seen_terms: + seen_terms.add(l_text) + return f'{text}' + else: + return f'{text}' + + html_str = re.sub(r'(.*?)', term_replace, html_str) + + # Neologism Replacement (First occurrence) + seen_neos = set() + def neo_replace(match): + text = match.group(1) + l_text = text.lower() + if l_text not in seen_neos: + seen_neos.add(l_text) + return f'{text}' + else: + return f'{text}' + + html_str = re.sub(r'(.*?)', neo_replace, html_str) + + HTML(string=html_str).write_pdf(out_file) + +# Locate the uploaded file +uploaded_files = glob.glob('/mnt/data/user_uploads/*abstract.html') +if not uploaded_files: + uploaded_files = glob.glob('/mnt/data/uploads/*abstract.html') +if not uploaded_files: + # Look for it anywhere under /mnt/data + for root, dirs, files in os.walk('/mnt/data'): + for file in files: + if file == 'abstract.html': + uploaded_files.append(os.path.join(root, file)) + +if uploaded_files: + filepath = uploaded_files[0] + with open(filepath, 'r', encoding='utf-8') as f: + html_content = f.read() + process_rt_html(html_content, 'abstract.pdf') + print("PDF successfully generated.") +else: + print("Could not find abstract.html in the data directory.") + +Code output +Traceback (most recent call last): + File "", line 1, in + import bs4 +ModuleNotFoundError: No module named 'bs4' + +Python +import re +import os +import glob +from weasyprint import HTML + +def process_rt_html(html_str, out_file): + html_str = html_str.replace('\\$', '$') + html_str = re.sub(r']*["\']>\s*', '', html_str, flags=re.IGNORECASE) + + css = """ + + """ + + html_str = html_str.replace("", css + "") + + title_match = re.search(r']+)>(.*?)', html_str, re.DOTALL | re.IGNORECASE) + if title_match: + attrs = title_match.group(1) + title = re.search(r'title="(.*?)"', attrs).group(1) if 'title="' in attrs else 'Document' + author = re.search(r'author="(.*?)"', attrs).group(1) if 'author="' in attrs else '' + date = re.search(r'date="(.*?)"', attrs).group(1) if 'date="' in attrs else '' + copyright_txt = re.search(r'copyright="(.*?)"', attrs).group(1) if 'copyright="' in attrs else '' + + title_block = f''' +
+

{title}

+
{author} | {date}
+ +
+ ''' + html_str = html_str[:title_match.start()] + title_block + html_str[title_match.end():] + + toc_match = re.search(r'', html_str, re.IGNORECASE) + if toc_match: + level = toc_match.group(1) + headings = [] + if '-' in level: + headings = re.findall(r'(.*?)', html_str, re.IGNORECASE) + else: + headings = re.findall(rf'(.*?)', html_str, re.IGNORECASE) + + toc_html = '
Table of Contents
    ' + for lvl, text in headings: + if "COVER SHEET" in text: + continue + toc_html += f'
  • {text}
  • ' + toc_html += '
' + + # Add page break AFTER the TOC instead of before it + toc_html += '
' + + html_str = html_str[:toc_match.start()] + toc_html + html_str[toc_match.end():] + + seen_terms = set() + def term_replace(match): + text = match.group(1) + l_text = text.lower() + if l_text not in seen_terms: + seen_terms.add(l_text) + return f'{text}' + else: + return f'{text}' + + html_str = re.sub(r'(.*?)', term_replace, html_str) + + seen_neos = set() + def neo_replace(match): + text = match.group(1) + l_text = text.lower() + if l_text not in seen_neos: + seen_neos.add(l_text) + return f'{text}' + else: + return f'{text}' + + html_str = re.sub(r'(.*?)', neo_replace, html_str) + + HTML(string=html_str).write_pdf(out_file) + +uploaded_files = glob.glob('/mnt/data/user_uploads/*abstract.html') +if not uploaded_files: + uploaded_files = glob.glob('/mnt/data/uploads/*abstract.html') +if not uploaded_files: + for root, dirs, files in os.walk('/mnt/data'): + for file in files: + if file == 'abstract.html': + uploaded_files.append(os.path.join(root, file)) + +if uploaded_files: + filepath = uploaded_files[0] + with open(filepath, 'r', encoding='utf-8') as f: + html_content = f.read() + + # One last aggressive check to ensure we absolutely strip ANY style="page-break..." strings + # in case the earlier regex missed a specific formatting + html_content = re.sub(r'style="[^"]*page-break-after:\s*always;?[^"]*"', '', html_content, flags=re.IGNORECASE) + + process_rt_html(html_content, 'abstract_no_gap.pdf') + print("PDF successfully generated.") +else: + print("Could not find abstract.html in the data directory.") -- 2.20.1