From b668eb3d77d7250e97bab8b39b4116ceb91d82a6 Mon Sep 17 00:00:00 2001 From: rattatwinko Date: Mon, 22 Sep 2025 19:44:55 +0200 Subject: [PATCH] Initial Commit --- .gitignore | 1 + PyPost.py | 284 ++++++++++++++++++++++++++++++++++++++++ PyPost.pyproj | 51 ++++++++ css/favicon/favicon.ico | Bin 0 -> 15086 bytes css/main.css | 87 ++++++++++++ hashes/__init__.py | 0 hashes/hashes.py | 18 +++ html/base/index.html | 49 +++++++ js/main.js | 1 + js/normal.js | 38 ++++++ js/post/main.js | 1 + js/post/normal.js | 31 +++++ log/Logger.py | 9 ++ log/__init__.py | 0 webserver.py | 110 ++++++++++++++++ 15 files changed, 680 insertions(+) create mode 100644 .gitignore create mode 100644 PyPost.py create mode 100644 PyPost.pyproj create mode 100644 css/favicon/favicon.ico create mode 100644 css/main.css create mode 100644 hashes/__init__.py create mode 100644 hashes/hashes.py create mode 100644 html/base/index.html create mode 100644 js/main.js create mode 100644 js/normal.js create mode 100644 js/post/main.js create mode 100644 js/post/normal.js create mode 100644 log/Logger.py create mode 100644 log/__init__.py create mode 100644 webserver.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/PyPost.py b/PyPost.py new file mode 100644 index 0000000..30974a9 --- /dev/null +++ b/PyPost.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 +import os +import sys +import time +from pathlib import Path + +import marko +from marko.ext.gfm import GFM +from watchdog.observers import Observer +from watchdog.events import FileSystemEventHandler + +# Use absolute paths +ROOT = Path(os.path.abspath(".")) +MARKDOWN_DIR = ROOT / "markdown" +HTML_DIR = ROOT / "html" + +# Create markdown parser with table support +markdown_parser = marko.Markdown(extensions=[GFM]) + +# Long useless Lorem Ipsum comments +LOREM_IPSUM_COMMENTS = [ + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.", + "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.", + "Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet.", + "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa.", + "gay furry pride >:3 OwO get rekt Charlie Kirk", + "Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.", + "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias.", + "Nulla facilisi. Cras vehicula aliquet libero, sit amet lacinia nunc commodo eu. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae.", + "Proin euismod, nisl sit amet ultricies lacinia, nisl nisl aliquam nisl, eget aliquam nisl nisl sit amet nisl. Sed euismod, nisl sit amet ultricies lacinia, nisl nisl aliquam nisl, eget aliquam nisl nisl sit amet nisl.", + "Vivamus euismod, nisl sit amet ultricies lacinia, nisl nisl aliquam nisl, eget aliquam nisl nisl sit amet nisl. Sed euismod, nisl sit amet ultricies lacinia, nisl nisl aliquam nisl, eget aliquam nisl nisl sit amet nisl." +] + +def render_markdown(md_path: Path): + """Render a single markdown file to an obfuscated HTML file.""" + try: + text = md_path.read_text(encoding="utf-8") + except Exception as e: + print(f"Could not read {md_path}: {e}") + return + + html_body = markdown_parser.convert(text) + + # Extract title from filename or first H1 + title = md_path.stem + for line in text.splitlines(): + if line.startswith("# "): + title = line[2:].strip() + break + + import base64 + import random + from hashes.hashes import hash_list + # Create clean HTML structure + clean_html = f""" + + + + {title} + + + + + +
+

← {title}

+
Written@{time.asctime(time.localtime())}
+
+ {html_body} + +
+
+ {time.strftime("%Y-%m-%d %H:%M:%S")}
+ Hash 1 (UTF-8):{base64.b64encode(random.choice(hash_list).encode("utf-8")).decode("utf-8")}
+ Hash 2 (ASCII):{base64.b64encode(random.choice(hash_list).encode("ascii")).decode("ascii")}
+ Decode Hashes to identify pages +
+
+ +""" + + # Obfuscate the HTML for browser output + obfuscated_html = obfuscate_html(clean_html) + + # Ensure html directory exists + HTML_DIR.mkdir(exist_ok=True) + + # Maintain relative directory structure in html/ + relative_path = md_path.relative_to(MARKDOWN_DIR) + out_path = HTML_DIR / relative_path.with_suffix(".html") + + # Create parent directories if needed + out_path.parent.mkdir(parents=True, exist_ok=True) + + out_path.write_text(obfuscated_html, encoding="utf-8") + print(f"Rendered: {md_path} -> {out_path}") + + +def obfuscate_html(html_content): + """Working obfuscation that maintains functionality""" + import re + import random + + # Generate random strings + def generate_random_string(length=8): + chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + return ''.join(random.choice(chars) for _ in range(length)) + + # Protect original content + protected_blocks = [] + + def protect_scripts(match): + protected_blocks.append(match.group(0)) + return f'' + + def protect_styles(match): + protected_blocks.append(match.group(0)) + return f'' + + # First pass: protect critical content + temp_html = re.sub(r']*>.*?', protect_scripts, html_content, flags=re.DOTALL) + temp_html = re.sub(r']*>.*?', protect_styles, temp_html, flags=re.DOTALL) + + # Protect tables + def protect_tables(match): + protected_blocks.append(match.group(0)) + return f'' + + temp_html = re.sub(r']*>.*?', protect_tables, temp_html, flags=re.DOTALL) + + # Clean up HTML - remove extra whitespace + lines = [] + for line in temp_html.split('\n'): + cleaned_line = ' '.join(line.split()) + if cleaned_line: + lines.append(cleaned_line) + + # Add comments between lines (but not too many) + obfuscated_lines = [] + + for i, line in enumerate(lines): + # Add comment before some lines + if line and not line.startswith('') + + obfuscated_lines.append(line) + + # Add comment after some lines + if line and not line.startswith('') + + obfuscated = '\n'.join(obfuscated_lines) + + # Inject random comments between SOME elements (not all) + def inject_some_comments(html): + # Only inject between certain safe elements + safe_patterns = [ + (r'()', r'\1'), + (r'(

)', r'\1'), + (r'()', r'\1'), + (r'()', r'\1'), + (r'()', r'\1'), + (r'()', r'\1'), + ] + + for pattern, replacement in safe_patterns: + if random.random() > 0.5: # 50% chance to apply each pattern + html = re.sub(pattern, replacement, html) + + return html + + obfuscated = inject_some_comments(obfuscated) + + # Add header comments (fewer to avoid breaking the document) + header_comments = [ + 'auto-obfuscated-' + generate_random_string(10), + 'generated-' + generate_random_string(8), + ] + + header_block = '\n'.join([f'' for comment in header_comments]) + obfuscated = header_block + '\n' + obfuscated + + # Add footer comments + footer_comments = [ + 'end-' + generate_random_string(10), + 'completed-' + generate_random_string(8), + ] + + footer_block = '\n'.join([f'' for comment in footer_comments]) + obfuscated = obfuscated + '\n' + footer_block + + # Minimal invisible characters - only in text content, not in tags + invisible_chars = ['\u200B', '\u200C'] + + def add_minimal_invisible(match): + text = match.group(1) + # NEVER obfuscate script-like content + if any(keyword in text for keyword in ['function', 'const ', 'var ', 'let ', 'document.', 'window.', 'getElement', 'querySelector', 'addEventListener']): + return '>' + text + '<' + + # Only add to plain text content + if len(text) > 10: # Only on longer text blocks + result = [] + for i, char in enumerate(text): + result.append(char) + # Very rarely add invisible chars + if i % 8 == 0 and i > 0 and random.random() > 0.8: + result.append(random.choice(invisible_chars)) + return '>' + ''.join(result) + '<' + + return '>' + text + '<' + + obfuscated = re.sub(r'>([^<]+)<', add_minimal_invisible, obfuscated) + + # Restore protected content exactly as-is + for i, protected_content in enumerate(protected_blocks): + obfuscated = obfuscated.replace(f'', protected_content) + obfuscated = obfuscated.replace(f'', protected_content) + obfuscated = obfuscated.replace(f'', protected_content) + + # Final cleanup - ensure no double newlines and remove extra spaces + obfuscated = re.sub(r'\n\n+', '\n', obfuscated) + obfuscated = re.sub(r'[ \t]+', ' ', obfuscated) # Remove extra spaces and tabs + + return obfuscated + + +def remove_html(md_path: Path): + relative_path = md_path.relative_to(MARKDOWN_DIR) + out_path = HTML_DIR / relative_path.with_suffix(".html") + if out_path.exists(): + out_path.unlink() + print(f"Removed: {out_path}") + + +def initial_scan(markdown_dir: Path): + print(f"Initial scan for markdown in {markdown_dir}...") + for md in markdown_dir.rglob("*.md"): + render_markdown(md) + + +class Handler(FileSystemEventHandler): + def on_created(self, event): + if not event.is_directory and event.src_path.endswith(".md"): + render_markdown(Path(event.src_path)) + + def on_modified(self, event): + if not event.is_directory and event.src_path.endswith(".md"): + render_markdown(Path(event.src_path)) + + def on_deleted(self, event): + if not event.is_directory and event.src_path.endswith(".md"): + remove_html(Path(event.src_path)) + + def on_moved(self, event): + src = Path(event.src_path) + dest = Path(event.dest_path) + if src.suffix.lower() == ".md": + remove_html(src) + if dest.suffix.lower() == ".md": + render_markdown(dest) + + +if __name__ == "__main__": + if not MARKDOWN_DIR.exists(): + print(f"Error: Markdown directory not found: {MARKDOWN_DIR}") + print("Please create a 'markdown' directory in the current working directory.") + sys.exit(1) + + initial_scan(MARKDOWN_DIR) + event_handler = Handler() + observer = Observer() + observer.schedule(event_handler, str(MARKDOWN_DIR), recursive=True) + observer.start() + print(f"Watching {MARKDOWN_DIR} for changes. Ctrl+C to stop.") + try: + while True: + time.sleep(1) + except KeyboardInterrupt: + observer.stop() + observer.join() \ No newline at end of file diff --git a/PyPost.pyproj b/PyPost.pyproj new file mode 100644 index 0000000..c32f5b2 --- /dev/null +++ b/PyPost.pyproj @@ -0,0 +1,51 @@ + + + Debug + 2.0 + 10222d8e-7c54-4460-8d3b-80f10266f307 + . + PyPost.py + + + . + . + PyPost + PyPost + MSBuild|env|$(MSBuildProjectFullPath) + + + true + false + + + true + false + + + + + + + + env + 3.13 + env (Python 3.13) + Scripts\python.exe + Scripts\pythonw.exe + PYTHONPATH + X64 + + + + + + + + + + + + + \ No newline at end of file diff --git a/css/favicon/favicon.ico b/css/favicon/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..69490ce1f4a4af8972ab80212d0855397780240e GIT binary patch literal 15086 zcmeI2%WGXl9LFanHm$Ejv7$}&#Dzo@w5Vu=U|h8uH?G_@t-5ffJ1tth*$8gLw;)Q0 zT2XQ3U(kTsS}W8?eRN||lu|(wne)8oq?P{Q+uxku{2t#kGiT1Z z(-<>g2F>WGksdb>4HA*&xPsl~iyc}jd zNq&{>F@d!}o}^&AT)+q4q>vMzEL<#~-xI+Hb$w+bHsR8f7hhsrAt$-B>fh@IseMwo z%oCSz`%hkCh;@bBS@rk00cyVxh)KA4^AhU{xr^3+J`m&PrR~dGraoijO4H-N-s_KX zoOK5vZu3m#dHx=iAHGQ;r*DpYHuj2-lL_MMGW!p?itImdTF?F0j){H$@GdDT#5^IC zeg9YvXx^o~e|fhy`Tlh|*!Gw>H2wWyYr9%Bdc^H(qTN$m7fsZ(HJ(Zq*LABQ4!+u! zP7@q#t&p~3RF@9bwf4H|)|FSMVA^Ue+EJ&oGQ9?Dvjd$~V_GZ5Ot+1R+C$^f^47_b z<*BKW<-K>UfwpY);e#(R#CG%AeB`!u&=SrmbVO=)3IDTmin`{jrC}?Ax_Fe$EBb|` zY@NE|3Xzv{T|CO>P5v%QyPv~nApc05^4tSH6K5cQ=IvJDh!B$R)Nz|oc8;5f;~qjX zsg5Q%RIL%>Uo~%2@#pwAzs~smvr~93H2AW=82d!hO|6Ac9nLdu6gWFz&q@3JsO}!Y z_o%?R(M`f7La0u^?fh=uF3brhgsQ?h(p$m~q3Bse(R;g4HC`9^|K)##ehKqI&Ut}( zEy^p)pZ}-5S@4}N%iLG_O4+D&o{+^WZ~qO-^{LR$F;_aTFc;LiMaau9&F@m>$vWSW zOZVRJOP;OLXXRNn@L92jfaV^K37l1@am(r(R{WbnNSKcw1)gQT4eXq&=@shX!#Boj z0j|dkCzI-x!#pk<8o(~G-ObY7=4jTnuY?_U=$8(ev=KE!Vy)+b`jIq}tf7S>& zee-Zo_Awz88?tXvjBo952G3d##bFOgS`0aV@&v+RLP(4C^KVt8`NC=Im z*O3Q)obQBWQ5|RMJ@C%_EJWO~A6A?5 z!8*pTN>1Nz9fx*LlY6LAtB%+nf;leg;7}!J4$3_)Rch4{+Y-AXsDs1Vm{Y@M#Cu^d zpI#bX^WzVVh-*iF9p~eZmhf9PW(2)t%rJUZf0yKH{hgB0^{Ux8YFg;Yt>_igj?A?5 yKs%a654NL)G;RIjIGe}j?ZkCX*I$TvEXBMmPs{uCxP + + + Auto Index + + + + + + +

Available pages:

+ + + + + +
+

+ +

+
+ + + diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..d6e74ce --- /dev/null +++ b/js/main.js @@ -0,0 +1 @@ +(function(_0x50114d,_0x20f128){function _0x2db471(_0x4afe4e,_0x2e79a4,_0x219634,_0x102bfb){return _0x7075(_0x4afe4e-0x1d9,_0x219634);}const _0xf1702a=_0x50114d();function _0x21e8ce(_0x210cdb,_0x2c2a42,_0x3780f7,_0x1f98ac){return _0x7075(_0x2c2a42- -0x29e,_0x1f98ac);}while(!![]){try{const _0x5bc24f=-parseInt(_0x2db471(0x2e5,0x2ff,0x2f8,0x2f5))/(0xb62+0x5*-0x6fd+-0xd*-0x1d0)*(parseInt(_0x21e8ce(-0x17c,-0x190,-0x1a9,-0x181))/(-0x1149+-0x3f*0x1+0x8c5*0x2))+parseInt(_0x21e8ce(-0x16e,-0x16f,-0x190,-0x190))/(-0x21f0*-0x1+0x61d*0x1+-0x280a)+parseInt(_0x21e8ce(-0x195,-0x177,-0x163,-0x187))/(-0x143e+0x717+0x1*0xd2b)+-parseInt(_0x2db471(0x2dc,0x2ea,0x2c3,0x2f6))/(0x3*0x7fa+-0xa8b+-0xd5e)*(-parseInt(_0x21e8ce(-0x197,-0x185,-0x19f,-0x178))/(0x21c*0x6+0x1*-0xf3+-0xbaf))+-parseInt(_0x21e8ce(-0x170,-0x178,-0x190,-0x18f))/(0x1*-0x14f7+0x136d*0x1+0x1*0x191)+-parseInt(_0x21e8ce(-0x192,-0x1a7,-0x1a1,-0x1ab))/(0x596+0x1*-0x1caa+0x171c)+parseInt(_0x2db471(0x2d2,0x2b1,0x2c4,0x2f0))/(0x72a+-0x7d8*-0x1+-0xef9);if(_0x5bc24f===_0x20f128)break;else _0xf1702a['push'](_0xf1702a['shift']());}catch(_0x3fb403){_0xf1702a['push'](_0xf1702a['shift']());}}}(_0x2fd1,0x1a703+-0x409+0x1*0xc2cf));const _0xab5495=(function(){const _0x345a33={};_0x345a33[_0x3eb2de(0x426,0x435,0x43f,0x43c)]=function(_0x3f177c,_0x58423f){return _0x3f177c===_0x58423f;},_0x345a33[_0x3eb2de(0x455,0x44d,0x44b,0x438)]=_0x3eb2de(0x431,0x44a,0x44c,0x433);const _0x26f259=_0x345a33;let _0x1ef369=!![];function _0x3eb2de(_0x2124e2,_0x36fee5,_0x17875d,_0x161be2){return _0x7075(_0x17875d-0x329,_0x161be2);}function _0x1ef394(_0x2afcbe,_0x4b868a,_0x34dadc,_0x319bd6){return _0x7075(_0x319bd6-0x141,_0x34dadc);}return function(_0x1a2a14,_0x1044af){const _0x349a20=_0x1ef369?function(){function _0x3252f8(_0x487018,_0x4ed124,_0x15503f,_0x10efca){return _0x7075(_0x15503f-0x2a8,_0x10efca);}function _0x15c51c(_0x2bd472,_0x791d95,_0x4125a0,_0x4105ab){return _0x7075(_0x4105ab- -0x11e,_0x2bd472);}if(_0x1044af){if(_0x26f259[_0x3252f8(0x3cc,0x3c2,0x3be,0x3af)](_0x26f259[_0x3252f8(0x3c5,0x3e9,0x3ca,0x3e1)],_0x26f259[_0x15c51c(-0x11,-0x17,0x1c,0x4)])){const _0x1d63f8=_0x1044af['apply'](_0x1a2a14,arguments);return _0x1044af=null,_0x1d63f8;}else _0x136676[_0x3252f8(0x3ce,0x3b4,0x3c0,0x3e0)+_0x3252f8(0x3a0,0x3dc,0x3bd,0x3d4)]('a')[_0x15c51c(0x15,0x2b,0xd,0xc)](_0x110ac3);}}:function(){};return _0x1ef369=![],_0x349a20;};}()),_0x1b31e7=_0xab5495(this,function(){function _0x1caa8f(_0x594c77,_0x40f04f,_0x4a982f,_0x1155c1){return _0x7075(_0x40f04f-0x253,_0x594c77);}function _0x30a7ad(_0x1f20d3,_0x319132,_0x63f749,_0x5b7d26){return _0x7075(_0x63f749-0x156,_0x319132);}return _0x1b31e7[_0x30a7ad(0x247,0x25d,0x263,0x26f)]()[_0x1caa8f(0x372,0x358,0x36c,0x376)](_0x1caa8f(0x34a,0x351,0x338,0x337)+'+$')[_0x1caa8f(0x34f,0x360,0x37e,0x37a)]()[_0x1caa8f(0x35e,0x37b,0x392,0x385)+'r'](_0x1b31e7)[_0x30a7ad(0x274,0x23b,0x25b,0x244)](_0x1caa8f(0x36f,0x351,0x36e,0x365)+'+$');});function _0x7075(_0x2560be,_0xd16b97){const _0x390d12=_0x2fd1();return _0x7075=function(_0x15c0d3,_0x2d2944){_0x15c0d3=_0x15c0d3-(-0x3*0x6ec+0x526*0x2+0xb6f);let _0x3d8de5=_0x390d12[_0x15c0d3];if(_0x7075['UUkBEa']===undefined){var _0x15daa1=function(_0x16b17){const _0xd669f8='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x521c80='',_0x4cb95b='',_0x5dd931=_0x521c80+_0x15daa1;for(let _0x334118=-0x865*0x2+0x1*-0x1e4d+0x96b*0x5,_0x29020e,_0x2f2ae6,_0x48cdb5=-0x1494+0x959*0x1+0xb3b;_0x2f2ae6=_0x16b17['charAt'](_0x48cdb5++);~_0x2f2ae6&&(_0x29020e=_0x334118%(-0x607+-0x81*-0x22+-0xa7*0x11)?_0x29020e*(-0x1727+0x5cb*-0x1+0xca*0x25)+_0x2f2ae6:_0x2f2ae6,_0x334118++%(-0x19b5+0x1*-0x1c79+-0x1*-0x3632))?_0x521c80+=_0x5dd931['charCodeAt'](_0x48cdb5+(0x1bc9+0x123*0xc+0x32f*-0xd))-(0x2159+-0x23ae+0x25f)!==-0x45f+-0x20da+0x2539?String['fromCharCode'](0x6*-0x1f7+-0x27d+0xf46&_0x29020e>>(-(-0x1a5*0x2+-0x1efe+0x224a)*_0x334118&-0x18ca+0xbbd+0xd13)):_0x334118:0xbb8*-0x1+-0xe7d+0x1*0x1a35){_0x2f2ae6=_0xd669f8['indexOf'](_0x2f2ae6);}for(let _0x4962f6=0x2592+0x21f7+-0x4789,_0x4d6dfb=_0x521c80['length'];_0x4962f6<_0x4d6dfb;_0x4962f6++){_0x4cb95b+='%'+('00'+_0x521c80['charCodeAt'](_0x4962f6)['toString'](0x1645+-0x35b+-0x7f*0x26))['slice'](-(-0x4*-0x8e6+0x2239*-0x1+-0x15d));}return decodeURIComponent(_0x4cb95b);};_0x7075['ffTeIT']=_0x15daa1,_0x2560be=arguments,_0x7075['UUkBEa']=!![];}const _0x34d043=_0x390d12[0x1*0x19f6+0x5e*-0x27+0x5d2*-0x2],_0x1d6b6e=_0x15c0d3+_0x34d043,_0x5c93a2=_0x2560be[_0x1d6b6e];if(!_0x5c93a2){const _0x265e18=function(_0x107bfd){this['xKraau']=_0x107bfd,this['DHSEAk']=[-0x2284+-0x997+-0x2*-0x160e,0x1d41+0x1037*-0x2+0x32d,-0x2*0x1125+-0x15b0+0x37fa],this['lrzTuK']=function(){return'newState';},this['wcAjJG']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['rXSHMg']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x265e18['prototype']['tDuTpO']=function(){const _0x2d1c1d=new RegExp(this['wcAjJG']+this['rXSHMg']),_0x18896f=_0x2d1c1d['test'](this['lrzTuK']['toString']())?--this['DHSEAk'][0xf*-0x23+-0x1e2a+0x2038]:--this['DHSEAk'][0x1bcc+-0x112e+-0xa9e];return this['gEJAqa'](_0x18896f);},_0x265e18['prototype']['gEJAqa']=function(_0x151b86){if(!Boolean(~_0x151b86))return _0x151b86;return this['YvYjbl'](this['xKraau']);},_0x265e18['prototype']['YvYjbl']=function(_0xdce8a3){for(let _0x4078a1=-0x1b0f+0x13e9*0x1+0x726,_0x176918=this['DHSEAk']['length'];_0x4078a1<_0x176918;_0x4078a1++){this['DHSEAk']['push'](Math['round'](Math['random']())),_0x176918=this['DHSEAk']['length'];}return _0xdce8a3(this['DHSEAk'][-0xb0a+-0xf38+0x1a42]);},new _0x265e18(_0x7075)['tDuTpO'](),_0x3d8de5=_0x7075['ffTeIT'](_0x3d8de5),_0x2560be[_0x1d6b6e]=_0x3d8de5;}else _0x3d8de5=_0x5c93a2;return _0x3d8de5;},_0x7075(_0x2560be,_0xd16b97);}_0x1b31e7();const _0x5bfba7=(function(){const _0x2f3eee={};_0x2f3eee[_0x4cd625(0x86,0x7f,0x7f,0x65)]='QcwzR';const _0x2f5eab=_0x2f3eee;function _0x4cd625(_0x544c53,_0x432523,_0x6d41ed,_0x564505){return _0x7075(_0x544c53- -0xa5,_0x564505);}let _0x32337d=!![];return function(_0x3a5fe5,_0x1f0427){const _0x35b052=_0x32337d?function(){function _0x25438e(_0x56290f,_0x8500aa,_0x50e6a8,_0x1389d4){return _0x7075(_0x8500aa- -0x136,_0x50e6a8);}function _0x4a18e5(_0x5280b9,_0x192cb4,_0x306783,_0x524977){return _0x7075(_0x524977- -0x2a4,_0x192cb4);}if(_0x1f0427){if(_0x4a18e5(-0x19c,-0x178,-0x16c,-0x183)===_0x2f5eab[_0x4a18e5(-0x179,-0x182,-0x185,-0x179)]){const _0x21efd9=_0xaa864f[_0x25438e(0xc,-0xa,-0x1e,0x3)](_0x2a59f0,arguments);return _0x797b6f=null,_0x21efd9;}else{const _0x138c9c=_0x1f0427[_0x4a18e5(-0x17d,-0x16b,-0x17d,-0x178)](_0x3a5fe5,arguments);return _0x1f0427=null,_0x138c9c;}}}:function(){};return _0x32337d=![],_0x35b052;};}()),_0x27b6e7=_0x5bfba7(this,function(){const _0x101f49={};function _0x5582e6(_0x1b9648,_0x205c90,_0x38095e,_0x13717c){return _0x7075(_0x13717c- -0xf3,_0x1b9648);}_0x101f49[_0x1fdcb7(0x4bc,0x490,0x4a5,0x4ad)]=_0x5582e6(0x2b,0x26,0x57,0x3f),_0x101f49['yGCMO']=_0x1fdcb7(0x4ae,0x4b4,0x4c0,0x4a2),_0x101f49[_0x1fdcb7(0x4ca,0x4c7,0x4be,0x4d2)]=function(_0x77e19c,_0x159bb1){return _0x77e19c+_0x159bb1;},_0x101f49[_0x1fdcb7(0x4b6,0x4db,0x4b9,0x4c3)]=_0x1fdcb7(0x4f5,0x4cf,0x4c6,0x4db)+_0x5582e6(0x0,0x2,0x13,0x7),_0x101f49[_0x5582e6(0x1f,0x1,0x3b,0x1f)]=_0x1fdcb7(0x4f9,0x4e1,0x4d9,0x4dc),_0x101f49[_0x1fdcb7(0x4b7,0x4b4,0x4d0,0x4d5)]=_0x5582e6(0x34,0x32,0x16,0x2a),_0x101f49[_0x5582e6(0x2d,0x45,0x44,0x31)]=_0x5582e6(0x35,0xc,0x2,0x20),_0x101f49[_0x1fdcb7(0x4e9,0x4be,0x4e8,0x4dd)]=_0x5582e6(0x4e,0x34,0x4d,0x32);function _0x1fdcb7(_0xdad1e8,_0x13aa69,_0x23e15c,_0x1a6cfb){return _0x7075(_0x1a6cfb-0x3a5,_0xdad1e8);}_0x101f49[_0x1fdcb7(0x4a0,0x4cb,0x4c1,0x4c1)]=_0x5582e6(0x2d,0x8,0x18,0x1c),_0x101f49[_0x5582e6(-0x8,-0xa,0xe,0x17)]=function(_0xa6e2f1,_0x3a8442){return _0xa6e2f1<_0x3a8442;};const _0x3e3ac2=_0x101f49,_0x40979b=function(){const _0x1d3bf4={};_0x1d3bf4[_0xd25378(-0x164,-0x15a,-0x182,-0x16c)]=_0x3e3ac2[_0x4ee22b(0x2ea,0x2dc,0x2ef,0x2e6)];const _0x2033d7=_0x1d3bf4;function _0xd25378(_0xa3cc16,_0x31f936,_0x21cc78,_0x2baa54){return _0x5582e6(_0x21cc78,_0x31f936-0x1b8,_0x21cc78-0x1de,_0x2baa54- -0x184);}function _0x4ee22b(_0x205a8d,_0x54882c,_0x51d172,_0x592ac1){return _0x1fdcb7(_0x592ac1,_0x54882c-0x1ef,_0x51d172-0x116,_0x54882c- -0x1d1);}if(_0x3e3ac2[_0xd25378(-0x166,-0x173,-0x169,-0x171)]!==_0x3e3ac2[_0xd25378(-0x154,-0x175,-0x166,-0x171)]){const _0x4ccdbc=_0x371b94['dataset']['originalTe'+'xt']||_0x5689a8[_0xd25378(-0x144,-0x14a,-0x142,-0x14e)+'t'];_0x4ccdbc['endsWith'](_0x2033d7['uOtTQ'])&&(_0x1d1cb9[_0xd25378(-0x154,-0x14f,-0x144,-0x14e)+'t']=_0x4ccdbc['replace'](/\.html$/,'')),_0x223706['dataset']['originalTe'+'xt']=_0x4ccdbc;}else{let _0x184590;try{_0x184590=Function(_0x3e3ac2[_0xd25378(-0x130,-0x155,-0x137,-0x14a)](_0x3e3ac2[_0x4ee22b(0x2f5,0x301,0x2e6,0x2e9)](_0x3e3ac2['aiaTF'],_0x4ee22b(0x2d8,0x2cf,0x2e4,0x2cc)+'ctor(\x22retu'+_0x4ee22b(0x2ec,0x2e5,0x2d0,0x2e5)+'\x20)'),');'))();}catch(_0x23a41f){_0x184590=window;}return _0x184590;}},_0x3fc34b=_0x40979b(),_0x3dbf29=_0x3fc34b[_0x5582e6(0x37,0x57,0x40,0x41)]=_0x3fc34b['console']||{},_0x12e08c=[_0x3e3ac2[_0x1fdcb7(0x4ab,0x4c9,0x4cc,0x4b7)],_0x3e3ac2[_0x5582e6(0x54,0x32,0x1e,0x3d)],_0x3e3ac2[_0x1fdcb7(0x4bb,0x4c1,0x4dc,0x4c9)],_0x3e3ac2[_0x5582e6(0x63,0x5b,0x49,0x45)],_0x3e3ac2['RLudA'],_0x5582e6(0x8,0xe,-0x11,0x9),'trace'];for(let _0x341982=0x89a*0x3+0xde6+-0x27b4;_0x3e3ac2['aTGnr'](_0x341982,_0x12e08c[_0x1fdcb7(0x4d8,0x4e2,0x4ca,0x4da)]);_0x341982++){const _0xd256a6=_0x5bfba7[_0x5582e6(0x46,0x29,0x29,0x35)+'r']['prototype'][_0x1fdcb7(0x4bf,0x4ad,0x4ae,0x4a7)](_0x5bfba7),_0x2daa2b=_0x12e08c[_0x341982],_0x5e72e8=_0x3dbf29[_0x2daa2b]||_0xd256a6;_0xd256a6[_0x1fdcb7(0x4c8,0x4b2,0x4c3,0x4ac)]=_0x5bfba7[_0x1fdcb7(0x4ad,0x4c8,0x4b3,0x4a7)](_0x5bfba7),_0xd256a6[_0x1fdcb7(0x49a,0x493,0x4a9,0x4b2)]=_0x5e72e8[_0x5582e6(0x28,0x28,0x3a,0x1a)][_0x5582e6(-0xe,0x2f,-0x1,0xf)](_0x5e72e8),_0x3dbf29[_0x2daa2b]=_0xd256a6;}});_0x27b6e7();function beautifyLinkText(_0x437bfd){const _0x1d4474=_0x437bfd[_0x1f2a6c(0x317,0x308,0x2f8,0x2ec)][_0x3de430(0x30,0x42,0x36,0x17)+'xt']||_0x437bfd['textConten'+'t'];function _0x1f2a6c(_0x4126d9,_0x2b27b5,_0x29c0de,_0x5704d8){return _0x7075(_0x2b27b5-0x1ed,_0x4126d9);}_0x1d4474[_0x3de430(0x11,-0x9,0x1,0x4)]('.html')&&(_0x437bfd[_0x1f2a6c(0x31d,0x316,0x31c,0x2fc)+'t']=_0x1d4474[_0x3de430(0x20,0x3,0x14,0x24)](/\.html$/,''));function _0x3de430(_0x3a014d,_0x3bda05,_0x2a0da3,_0x2ee70c){return _0x7075(_0x3a014d- -0xf0,_0x3bda05);}_0x437bfd[_0x1f2a6c(0x316,0x308,0x327,0x30b)][_0x3de430(0x30,0x42,0x1d,0x41)+'xt']=_0x1d4474;}function _0x2fd1(){const _0x48632a=['mxzSq09ewa','Dg9tDhjPBMC','mJG3mdmWueXsyvHL','zxHJzxb0Aw9U','CMvWBgfJzq','CM4GDgHPCYiPka','DvzTD0K','Aw5MBW','DgfNtMfTzq','Dg9YqwXS','rgjiB1K','yM9KEq','CxvLCNLtzwXLyW','odi5nZG4rgnxtM1X','zhzSALy','zgf0yxnLDa','uKX1zee','D2fYBG','ywLHvey','y2HPBgrmAxn0','B3jPz2LUywXuzq','yMHfCLq','txviC1C','tgvPse4','D0XxDvK','zxjYB3i','mJe0nJi5ogHYDLzLua','nZqYnZKYEuzkDuHg','y29UC3rYDwn0BW','Dgv4DenVBNrLBG','zM9YrwfJAa','wLjVtw8','yxbWBhK','wxfQtgG','Bfnxr2u','nJi2mJmYs01utwDc','tKvsB3u','BxHiq2y','lMH0BwW','BM9Kzvr5Cgu','y29UC29Szq','BgvUz3rO','CMv0DxjUicHMDq','Bg9N','zNbqyxC','ntiWndq4wgD3B3Pm','u1vmALG','mti1nJe2nLv4s1LjCG','BMn0Aw9UkcKG','E30Uy29UC3rYDq','DgfIBgu','A0TMuNC','kcGOlISPkYKRkq','tLfHr1O','BfnTwxK','zw5KC1DPDgG','yMLUza','nxn1sfH6Aq','rhjHyxO','C2vHCMnO','EuDdtu8','x19WCM90B19F','shz4wwy','z3rXEuW','yvrhBNi','Du90vfe'];_0x2fd1=function(){return _0x48632a;};return _0x2fd1();}function _0x49d697(_0x1061f8,_0x2a88cb,_0x282334,_0x27dc90){return _0x7075(_0x282334- -0x17f,_0x1061f8);}function _0x139299(_0x4b9feb,_0xb1b86c,_0x14c10a,_0x4519e5){return _0x7075(_0x14c10a-0xea,_0x4519e5);}document[_0x139299(0x20f,0x21e,0x202,0x21b)+'torAll']('a')[_0x49d697(-0x6d,-0x62,-0x55,-0x5b)](beautifyLinkText);const observer=new MutationObserver(_0x127899=>{function _0x450031(_0x47d561,_0x1b4a0e,_0x2e7b9f,_0x3887da){return _0x49d697(_0x1b4a0e,_0x1b4a0e-0xba,_0x2e7b9f- -0x128,_0x3887da-0x163);}function _0x1b5a12(_0x1cad08,_0x20c1c4,_0x3d111f,_0x558453){return _0x139299(_0x1cad08-0x13f,_0x20c1c4-0x1a2,_0x20c1c4-0x2bf,_0x3d111f);}const _0x569d3d={'mxHCf':function(_0x39b5ac,_0x581338){return _0x39b5ac!==_0x581338;},'NQaGZ':function(_0xae29f6,_0x219188){return _0xae29f6===_0x219188;},'SULjX':_0x1b5a12(0x498,0x4b2,0x4bb,0x4c7),'lSWGe':_0x450031(-0x171,-0x1ae,-0x18d,-0x194),'lSmYy':function(_0x314c97,_0x3a271b){return _0x314c97(_0x3a271b);}};_0x127899[_0x450031(-0x161,-0x19a,-0x17d,-0x17a)](_0x38fe9c=>{function _0x4a43f1(_0x579432,_0xf10f40,_0x28da90,_0x1b34af){return _0x450031(_0x579432-0x119,_0xf10f40,_0x579432-0x654,_0x1b34af-0xd6);}const _0x3b8aac={'Draaz':function(_0x3f928d,_0x35c5fa){return _0x3f928d(_0x35c5fa);}};_0x38fe9c['addedNodes'][_0x4a43f1(0x4d7,0x4d5,0x4cd,0x4ee)](_0x3af8f8=>{if(_0x569d3d[_0x1c8b89(-0xd2,-0xde,-0xd0,-0xe1)](_0x3af8f8[_0x1c8b89(-0xd0,-0xc9,-0xe4,-0xcd)],-0x1321*0x1+0x5b*0x6d+-0x139d*0x1))return;function _0x401c79(_0x305079,_0x50e439,_0x2de7ea,_0x569ba7){return _0x4a43f1(_0x50e439- -0xbe,_0x305079,_0x2de7ea-0x12a,_0x569ba7-0xa8);}function _0x1c8b89(_0x43fb41,_0x141ab5,_0xb68d0e,_0x8d387d){return _0x4a43f1(_0x43fb41- -0x5b0,_0xb68d0e,_0xb68d0e-0x1f0,_0x8d387d-0x1dc);}_0x569d3d[_0x401c79(0x3de,0x3ee,0x3f9,0x3f6)](_0x3af8f8[_0x401c79(0x403,0x403,0x40a,0x3ec)],'A')?_0x569d3d['mxHCf'](_0x569d3d[_0x401c79(0x3d4,0x3e7,0x3f5,0x3d8)],_0x569d3d[_0x401c79(0x424,0x41d,0x41e,0x40c)])?_0x569d3d[_0x401c79(0x3df,0x3ef,0x3fc,0x400)](beautifyLinkText,_0x3af8f8):_0x3b8aac[_0x401c79(0x3fd,0x3f3,0x3e9,0x404)](_0xff1e6a,_0xaabaaa):_0x3af8f8[_0x401c79(0x40f,0x407,0x414,0x3fb)+'torAll']('a')[_0x401c79(0x40b,0x419,0x41e,0x413)](beautifyLinkText);});});}),_0x521795={};_0x521795[_0x139299(0x1f9,0x21e,0x209,0x208)]=!![],_0x521795['subtree']=!![],observer['observe'](document[_0x139299(0x1e7,0x210,0x201,0x1ee)],_0x521795); \ No newline at end of file diff --git a/js/normal.js b/js/normal.js new file mode 100644 index 0000000..ab525f7 --- /dev/null +++ b/js/normal.js @@ -0,0 +1,38 @@ +/** + * Strips ".html" from link text, preserving href. + * Idempotent and works for dynamically added links. + * + * @param {HTMLElement} link - The element to process + */ +function beautifyLinkText(link) { + const originalText = link.dataset.originalText || link.textContent; + + // Only strip if the text ends with ".html" + if (originalText.endsWith(".html")) { + link.textContent = originalText.replace(/\.html$/, ""); + } + + // Store original text to avoid double-processing + link.dataset.originalText = originalText; +} + +// Process all existing links +document.querySelectorAll("a").forEach(beautifyLinkText); + +// Observe new links added dynamically +const observer = new MutationObserver(mutations => { + mutations.forEach(mutation => { + mutation.addedNodes.forEach(node => { + if (node.nodeType !== 1) return; // Not an element + + if (node.tagName === "A") { + beautifyLinkText(node); + } else { + node.querySelectorAll("a").forEach(beautifyLinkText); + } + }); + }); +}); + +observer.observe(document.body, { childList: true, subtree: true }); + diff --git a/js/post/main.js b/js/post/main.js new file mode 100644 index 0000000..451bd29 --- /dev/null +++ b/js/post/main.js @@ -0,0 +1 @@ +(function(_0x142282,_0x4d2d3f){function _0x5b3817(_0x48dbcf,_0x456074,_0x816b2a,_0x9c30e){return _0xf9f4(_0x816b2a-0x35e,_0x9c30e);}const _0x900aad=_0x142282();function _0xebe55(_0x53e2a6,_0x438215,_0x525445,_0x168727){return _0xf9f4(_0x438215-0x296,_0x168727);}while(!![]){try{const _0x2bf520=-parseInt(_0xebe55(0x46b,0x465,0x46a,0x462))/(0x1770+0x4f*-0x3+-0x1682)+parseInt(_0xebe55(0x438,0x44f,0x42e,0x463))/(0x85c+0x7ba*0x2+0xbe7*-0x2)*(parseInt(_0xebe55(0x43a,0x433,0x425,0x42a))/(-0x1*-0x109f+-0x222b*-0x1+-0x32c7))+parseInt(_0x5b3817(0x4f9,0x4fc,0x505,0x4fe))/(-0x1*-0x1c57+-0x44f*0x7+0x1*0x1d6)*(parseInt(_0x5b3817(0x50f,0x50d,0x52b,0x534))/(-0xa7d+-0x4*0x4f+0x3ea*0x3))+-parseInt(_0xebe55(0x443,0x432,0x433,0x423))/(0x1e0c+-0x5d5+-0x1831)+-parseInt(_0xebe55(0x45f,0x460,0x460,0x442))/(0x68c+0x8ff+-0xf84)*(-parseInt(_0x5b3817(0x504,0x51a,0x522,0x519))/(-0x2e9+0x13d1+-0x10e0))+-parseInt(_0x5b3817(0x54a,0x530,0x533,0x52b))/(0xe7d+-0x1619+0x7a5)*(parseInt(_0x5b3817(0x4ff,0x4e5,0x4ff,0x51d))/(0x1fd6+0x101e*-0x2+-0x70*-0x1))+parseInt(_0x5b3817(0x512,0x520,0x515,0x530))/(0x268d+0x1*0x10c9+-0x5f*0x95);if(_0x2bf520===_0x4d2d3f)break;else _0x900aad['push'](_0x900aad['shift']());}catch(_0x357f20){_0x900aad['push'](_0x900aad['shift']());}}}(_0x5e3c,-0x73*0x5e9+0x58f30+0x27caf));function _0xf9f4(_0x1709b0,_0x4997d9){const _0x1f084e=_0x5e3c();return _0xf9f4=function(_0x5ed705,_0x4b885f){_0x5ed705=_0x5ed705-(-0xab0+0x4*0x977+-0x1997);let _0x542572=_0x1f084e[_0x5ed705];if(_0xf9f4['TZldhq']===undefined){var _0x5917b9=function(_0x16f7bc){const _0x5f2316='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4ec043='',_0x1272e='',_0x32f089=_0x4ec043+_0x5917b9;for(let _0x57aa6d=0x623*-0x1+-0xc4a+0x59*0x35,_0x5199ae,_0x1e7299,_0x49cf78=0x1c60+0xd8*-0x15+0xf8*-0xb;_0x1e7299=_0x16f7bc['charAt'](_0x49cf78++);~_0x1e7299&&(_0x5199ae=_0x57aa6d%(-0x5a1+0xe4a+-0x8a5)?_0x5199ae*(-0x1035+0x4c*-0x6a+0x2fed)+_0x1e7299:_0x1e7299,_0x57aa6d++%(-0xc1*0x2f+-0x2046+0x43b9))?_0x4ec043+=_0x32f089['charCodeAt'](_0x49cf78+(-0x2*0x8b7+0xb07+0x1*0x671))-(-0x1*0x1807+-0x2*0x527+0x225f)!==-0x3*0x6e6+0x11f0+-0x2c2*-0x1?String['fromCharCode'](0x752*0x1+0x1a2e+-0x2081&_0x5199ae>>(-(0x5b8+-0x1ef+-0x1*0x3c7)*_0x57aa6d&-0x270a+0x1e04+0x90c)):_0x57aa6d:0x1dd1+-0x2540+-0x1*-0x76f){_0x1e7299=_0x5f2316['indexOf'](_0x1e7299);}for(let _0x1370b9=0x1*-0x1f9f+0xc6b+0x1334,_0x54b908=_0x4ec043['length'];_0x1370b9<_0x54b908;_0x1370b9++){_0x1272e+='%'+('00'+_0x4ec043['charCodeAt'](_0x1370b9)['toString'](-0x23d+-0xad4+-0xd21*-0x1))['slice'](-(0x2299+-0x11a4+-0x10f3));}return decodeURIComponent(_0x1272e);};_0xf9f4['WWfCpD']=_0x5917b9,_0x1709b0=arguments,_0xf9f4['TZldhq']=!![];}const _0x1367e6=_0x1f084e[0x1989+-0xaa*0x2e+0x503],_0x30f543=_0x5ed705+_0x1367e6,_0x3cbbbf=_0x1709b0[_0x30f543];if(!_0x3cbbbf){const _0x679c=function(_0x352ed1){this['krqFkp']=_0x352ed1,this['pnbLkn']=[-0x1*0x1c55+-0x2088+0x3cde,-0x21a8+0xe*0x2a7+-0x1*0x37a,0x155*0x16+0x22cc+-0x401a],this['wdXbZT']=function(){return'newState';},this['kwZcEz']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['lqCXrU']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x679c['prototype']['PsKrGp']=function(){const _0x5e98b2=new RegExp(this['kwZcEz']+this['lqCXrU']),_0x531bdf=_0x5e98b2['test'](this['wdXbZT']['toString']())?--this['pnbLkn'][-0x2467*-0x1+0xf*-0x110+-0x1476]:--this['pnbLkn'][-0x4*0x8f+-0x159+-0x1*-0x395];return this['ozwXbi'](_0x531bdf);},_0x679c['prototype']['ozwXbi']=function(_0x2c9129){if(!Boolean(~_0x2c9129))return _0x2c9129;return this['JGCjhs'](this['krqFkp']);},_0x679c['prototype']['JGCjhs']=function(_0x403a06){for(let _0x268225=0x10e0+0x9c*-0x30+0xc60,_0x23b37f=this['pnbLkn']['length'];_0x268225<_0x23b37f;_0x268225++){this['pnbLkn']['push'](Math['round'](Math['random']())),_0x23b37f=this['pnbLkn']['length'];}return _0x403a06(this['pnbLkn'][-0x24a6+-0x7b4*-0x5+-0xef*0x2]);},new _0x679c(_0xf9f4)['PsKrGp'](),_0x542572=_0xf9f4['WWfCpD'](_0x542572),_0x1709b0[_0x30f543]=_0x542572;}else _0x542572=_0x3cbbbf;return _0x542572;},_0xf9f4(_0x1709b0,_0x4997d9);}function _0x18029d(_0x7d5c28,_0x1c5589,_0x4e667e,_0x20690f){return _0xf9f4(_0x7d5c28- -0x239,_0x4e667e);}function _0x5e3c(){const _0x15e7d8=['x19WCM90B19F','DgHLBwu','zgLZywjSzwq','C2L0Aw9UAw5N','otKWnJnnrMndzxC','BKfHq2m','tg9HzgvK','y3ncue0','y2XHC3nmAxn0','ruPjs28','zNrUCvK','zgfYAY1ZDhLSzq','Bg9N','nde0odK1mKXdB0rswG','m05NqMXLqG','re9nq29UDgvUDa','DefSs3m','qNLjza','mJyWruvUywXf','uuPOvgW','DgHLBwuTDhjHBG','BgLNAhqTC3r5Ba','yM9KEq','z2v0rwXLBwvUDa','ndG4ndrXtvzZr1O','C0TIEfO','BgvUz3rO','BgLNAhq','BMn0Aw9UkcKG','CMvTB3zL','AuTXqMC','y21SBgC','zxjYB3i','r1LbChm','seLxuwi','qLbWwMu','ywrK','Dg9tDhjPBMC','zxHJzxb0Aw9U','AMXcteS','ody2ode5ogDgAK1lBW','C3rLBMvY','ntiYmJa4u2XXzunP','yMLUza','zgfYAW','v0D6BMm','rLDjsNq','kcGOlISPkYKRkq','tvDnuNq','Evj6zNe','z2v0sxrLBq','q2Xiv0e','vujhrgm','nJK2ofb3sNL5yG','y29UC29Szq','ug50D2e','y29UC3rYDwn0BW','DhjHy2u','yxbWBhK','mZi4m1Lot0H3wG','r2Lkvva','wgXNwg4','mtmWAxvKBgXL','svnhz3G','ndq0mtaXufzJCMzh','C2v0sxrLBq'];_0x5e3c=function(){return _0x15e7d8;};return _0x5e3c();}function _0x1ba796(_0x502727,_0x1d8e61,_0xad3995,_0x58f577){return _0xf9f4(_0x1d8e61- -0x60,_0x502727);}const _0x3d48fb=(function(){let _0x4cba17=!![];return function(_0x1528a2,_0xa112a7){const _0x357a8c=_0x4cba17?function(){function _0x483ba4(_0x136c29,_0x272516,_0x2dd7ec,_0x5a5c68){return _0xf9f4(_0x5a5c68-0x24c,_0x272516);}function _0x4e7a3e(_0x390980,_0x1de8b0,_0x1445c8,_0x4afea6){return _0xf9f4(_0x390980- -0x9,_0x1de8b0);}if(_0xa112a7){if(_0x4e7a3e(0x1bd,0x1be,0x1cd,0x1a3)==='ZcSZC')_0x24e449['body'][_0x4e7a3e(0x18e,0x1a7,0x17b,0x18e)][_0x483ba4(0x3f3,0x416,0x406,0x3f8)](_0x4e7a3e(0x19a,0x194,0x18f,0x199)+_0x483ba4(0x43c,0x424,0x426,0x420));else{const _0x29dbf8=_0xa112a7['apply'](_0x1528a2,arguments);return _0xa112a7=null,_0x29dbf8;}}}:function(){};return _0x4cba17=![],_0x357a8c;};}()),_0x20b061=_0x3d48fb(this,function(){const _0x285c9e={};function _0xa26b3d(_0x46336d,_0x2ecd64,_0x4fdd2c,_0x51ee61){return _0xf9f4(_0x46336d- -0x2a4,_0x2ecd64);}function _0x326912(_0x367c02,_0x583a3a,_0x71af81,_0x387c31){return _0xf9f4(_0x367c02- -0x190,_0x387c31);}_0x285c9e[_0x326912(0x1e,0x39,0x25,0x29)]=_0x326912(0x2e,0x33,0x17,0x10)+'+$';const _0x364829=_0x285c9e;return _0x20b061['toString']()['search'](_0x364829[_0x326912(0x1e,0x29,0x3a,0x3a)])[_0xa26b3d(-0xf0,-0xd0,-0x104,-0xfd)]()[_0xa26b3d(-0xdd,-0xf2,-0xdb,-0xf4)+'r'](_0x20b061)['search'](_0x364829[_0xa26b3d(-0xf6,-0xf0,-0xff,-0x117)]);});_0x20b061();const _0x44fcd2=(function(){function _0x4e894a(_0x3707e9,_0x42828e,_0x3f1aa6,_0x215fa2){return _0xf9f4(_0x3f1aa6- -0x39,_0x3707e9);}const _0x3fcf0a={};_0x3fcf0a[_0x62090(0x218,0x226,0x231,0x220)]=_0x62090(0x238,0x244,0x232,0x24d);function _0x62090(_0x22f925,_0x2eded7,_0x4049b7,_0xc5f365){return _0xf9f4(_0x2eded7-0x76,_0xc5f365);}const _0x19c83e=_0x3fcf0a;let _0x7c0222=!![];return function(_0x552536,_0x974284){const _0x55319e={};_0x55319e[_0x20734b(-0x1e,-0x2a,-0x22,-0x31)]=_0x19c83e[_0x20734b(-0x1f,-0x26,-0x3,-0x3b)];const _0x24be7e=_0x55319e,_0x34eeda=_0x7c0222?function(){function _0x438d4e(_0x127fc3,_0x3fbf14,_0x292923,_0x5cbf8a){return _0x37eb4a(_0x127fc3-0x1d6,_0x3fbf14-0x1e3,_0x5cbf8a- -0x460,_0x127fc3);}function _0x3ecbf9(_0x470897,_0x359348,_0x57ea54,_0x1c5c7f){return _0x37eb4a(_0x470897-0x7,_0x359348-0x18,_0x1c5c7f- -0x252,_0x470897);}if(_0x974284){if('ISGgx'!==_0x24be7e[_0x438d4e(0x0,0x17,0x21,0xa)]){const _0x360a50=_0x26a399?function(){if(_0x5fdce0){const _0xbf6c89=_0x50a449['apply'](_0x22bccd,arguments);return _0x37a359=null,_0xbf6c89;}}:function(){};return _0x11e6f9=![],_0x360a50;}else{const _0x2437cf=_0x974284[_0x438d4e(0x2b,0x23,0x10,0x22)](_0x552536,arguments);return _0x974284=null,_0x2437cf;}}}:function(){};_0x7c0222=![];function _0x20734b(_0xe76267,_0x3d5de0,_0x971a99,_0x33a27a){return _0x4e894a(_0x971a99,_0x3d5de0-0xe9,_0xe76267- -0x196,_0x33a27a-0xff);}function _0x37eb4a(_0x6f3d16,_0x576d79,_0x4770f2,_0x1ceb60){return _0x4e894a(_0x1ceb60,_0x576d79-0xa3,_0x4770f2-0x2f2,_0x1ceb60-0x91);}return _0x34eeda;};}()),_0x5309df=_0x44fcd2(this,function(){const _0xf3a379={'lxjAl':function(_0x3f2d3f,_0x5b6643){return _0x3f2d3f(_0x5b6643);},'BeEFj':function(_0x260801,_0x16d8b2){return _0x260801+_0x16d8b2;},'VrUbc':'{}.constru'+'ctor(\x22retu'+'rn\x20this\x22)('+'\x20)','ftnqY':function(_0x1acd59){return _0x1acd59();},'nxsIA':_0x12df15(0x2d1,0x2b4,0x2b6,0x2a2),'jlBLK':'info','GiJUP':_0x54ec38(0x42e,0x427,0x42b,0x443),'nAaCc':'table','sKbxZ':_0x12df15(0x2fd,0x300,0x2e3,0x2e1),'BGVws':function(_0x60f3eb,_0x35381f){return _0x60f3eb<_0x35381f;}};let _0x5a0e82;function _0x12df15(_0x1e4c49,_0x39233a,_0x25b583,_0x511fe0){return _0xf9f4(_0x25b583-0x11b,_0x1e4c49);}try{const _0x21b81b=_0xf3a379['lxjAl'](Function,_0xf3a379['BeEFj']('return\x20(fu'+_0x12df15(0x2ae,0x2c8,0x2c6,0x2d8),_0xf3a379['VrUbc'])+');');_0x5a0e82=_0xf3a379[_0x54ec38(0x418,0x3fe,0x41b,0x400)](_0x21b81b);}catch(_0x234cb7){_0x5a0e82=window;}function _0x54ec38(_0x254a06,_0x2f7eda,_0x3c6e23,_0x37f5f2){return _0xf9f4(_0x254a06-0x27f,_0x37f5f2);}const _0x3c27d3=_0x5a0e82[_0x54ec38(0x444,0x42a,0x453,0x455)]=_0x5a0e82[_0x12df15(0x300,0x2d0,0x2e0,0x2d6)]||{},_0x310076=[_0xf3a379['nxsIA'],'warn',_0xf3a379[_0x12df15(0x2c1,0x2e9,0x2d1,0x2d2)],_0xf3a379[_0x12df15(0x2fb,0x300,0x2e6,0x303)],_0x12df15(0x2c1,0x2cb,0x2d0,0x2b3),_0xf3a379[_0x54ec38(0x455,0x459,0x44d,0x450)],_0xf3a379[_0x54ec38(0x427,0x42f,0x412,0x434)]];for(let _0x4546f0=0x652+-0x80f+0x1bd;_0xf3a379['BGVws'](_0x4546f0,_0x310076[_0x12df15(0x2ca,0x2c9,0x2c4,0x2ce)]);_0x4546f0++){const _0x26c674=_0x44fcd2['constructo'+'r']['prototype']['bind'](_0x44fcd2),_0x49262c=_0x310076[_0x4546f0],_0x46e4da=_0x3c27d3[_0x49262c]||_0x26c674;_0x26c674[_0x54ec38(0x450,0x44b,0x45e,0x446)]=_0x44fcd2[_0x12df15(0x2da,0x2df,0x2d5,0x2d9)](_0x44fcd2),_0x26c674[_0x54ec38(0x433,0x43c,0x43e,0x42b)]=_0x46e4da[_0x54ec38(0x433,0x423,0x417,0x441)][_0x12df15(0x2b8,0x2be,0x2d5,0x2d7)](_0x46e4da),_0x3c27d3[_0x49262c]=_0x26c674;}});_0x5309df();function toggleTheme(){function _0x1502c8(_0x174536,_0x3e88d9,_0x83b546,_0xa557d0){return _0xf9f4(_0xa557d0-0x9a,_0x83b546);}const _0x463541={'XlgXn':_0x435c5a(0xfb,0xe9,0x100,0x10e)+_0x1502c8(0x279,0x279,0x256,0x26e),'csBPM':_0x1502c8(0x222,0x233,0x237,0x234)+'s','RHfcR':'light-styl'+'es','iKqBg':_0x1502c8(0x266,0x26c,0x285,0x26c),'MWMRt':_0x1502c8(0x271,0x253,0x272,0x255),'FWIJt':_0x1502c8(0x247,0x252,0x229,0x244),'fHAxM':function(_0x1c1b88,_0x1758c2,_0x257acf){return _0x1c1b88(_0x1758c2,_0x257acf);},'ClHWA':function(_0x563135,_0x2560c6){return _0x563135!==_0x2560c6;},'UBGDc':_0x1502c8(0x266,0x261,0x25b,0x256),'EJIKo':function(_0x4dc23b,_0x5bbf19,_0x1e5e58){return _0x4dc23b(_0x5bbf19,_0x1e5e58);}},_0x37cb43=document[_0x435c5a(0xfe,0xf1,0xf2,0xf6)+_0x435c5a(0xf8,0xf0,0xf5,0xdc)](_0x463541[_0x1502c8(0x23c,0x241,0x239,0x230)]),_0x766c72=document[_0x1502c8(0x259,0x257,0x240,0x240)+_0x435c5a(0xf8,0x103,0xf2,0xe4)](_0x463541['RHfcR']),_0x155a50=!_0x766c72[_0x1502c8(0x25b,0x272,0x286,0x26d)];document['body'][_0x435c5a(0xef,0x104,0xe5,0xfb)][_0x1502c8(0x23a,0x265,0x24f,0x24d)](_0x435c5a(0xfb,0xdc,0x104,0x10a)+_0x1502c8(0x27f,0x259,0x27b,0x26e));function _0x435c5a(_0x3a3f6d,_0x29f8ef,_0x20c7aa,_0x4dd0da){return _0xf9f4(_0x3a3f6d- -0xa8,_0x4dd0da);}if(_0x155a50){if(_0x463541[_0x1502c8(0x259,0x256,0x27d,0x25c)](_0x463541[_0x1502c8(0x26d,0x278,0x261,0x25d)],_0x463541[_0x435c5a(0x11b,0x115,0xfe,0xfb)])){const _0x54a022=_0x49cf78['getElement'+_0x435c5a(0xf8,0xef,0x107,0x111)](_0x463541[_0x435c5a(0xee,0xf6,0x105,0xee)]),_0x368a2c=_0x1370b9[_0x435c5a(0xfe,0x112,0x109,0xff)+'ById'](_0x463541['RHfcR']),_0x2fa643=!_0x368a2c[_0x435c5a(0x12b,0x121,0x122,0x133)];_0x54b908['body'][_0x435c5a(0xef,0xfa,0xd9,0xd4)][_0x1502c8(0x238,0x238,0x247,0x24d)](_0x463541[_0x1502c8(0x26e,0x26c,0x261,0x266)]),_0x2fa643?(_0x368a2c[_0x435c5a(0x12b,0x13e,0x13e,0x12f)]=!![],_0x54a022[_0x435c5a(0x12b,0x143,0x10d,0x138)]=![],_0x2c9129[_0x1502c8(0x25f,0x26a,0x275,0x26a)](_0x463541['iKqBg'],_0x463541[_0x435c5a(0x117,0xfc,0x10e,0x103)])):(_0x368a2c[_0x1502c8(0x284,0x278,0x26a,0x26d)]=![],_0x54a022['disabled']=!![],_0x403a06[_0x1502c8(0x266,0x266,0x281,0x26a)](_0x463541[_0x435c5a(0x105,0xf1,0xf0,0x10f)],_0x463541[_0x435c5a(0x115,0x122,0x10f,0x119)])),_0x463541['fHAxM'](_0x5e98b2,()=>{function _0x36aedf(_0x5b9c41,_0xd577b6,_0x1d0f20,_0x4411e8){return _0x435c5a(_0x5b9c41-0x286,_0xd577b6-0x4b,_0x1d0f20-0xac,_0x4411e8);}function _0x2b4c9d(_0x2c04cb,_0x3d78f9,_0xa6e431,_0x29ae5e){return _0x435c5a(_0x3d78f9- -0x227,_0x3d78f9-0x1ec,_0xa6e431-0x133,_0xa6e431);}_0x268225[_0x2b4c9d(-0x122,-0x12a,-0x13d,-0x114)][_0x2b4c9d(-0x12b,-0x138,-0x123,-0x14c)]['remove'](_0x463541[_0x2b4c9d(-0x10d,-0x103,-0x120,-0x10b)]);},0x1f68+-0x2267*0x1+0x48f);}else _0x766c72[_0x435c5a(0x12b,0x149,0x126,0x120)]=!![],_0x37cb43['disabled']=![],localStorage[_0x435c5a(0x128,0x120,0x137,0x145)](_0x463541[_0x435c5a(0x105,0x116,0xff,0x10e)],_0x1502c8(0x25c,0x244,0x264,0x255));}else _0x766c72[_0x1502c8(0x273,0x24d,0x278,0x26d)]=![],_0x37cb43[_0x1502c8(0x25f,0x27f,0x280,0x26d)]=!![],localStorage[_0x1502c8(0x260,0x287,0x261,0x26a)](_0x435c5a(0x12a,0x132,0x143,0x10f),_0x463541[_0x435c5a(0x115,0x135,0x105,0x117)]);_0x463541[_0x435c5a(0xf0,0xe0,0x108,0x105)](setTimeout,()=>{function _0x5b63e3(_0x3515e1,_0xe2e13,_0x52b41b,_0x22f2e8){return _0x1502c8(_0x3515e1-0x42,_0xe2e13-0x185,_0x52b41b,_0xe2e13- -0x430);}function _0x47ca89(_0x2afcc8,_0x3a6042,_0x5a2ff2,_0x423eb3){return _0x1502c8(_0x2afcc8-0xda,_0x3a6042-0xd5,_0x2afcc8,_0x423eb3-0xac);}document[_0x5b63e3(-0x1f0,-0x1f1,-0x212,-0x1e7)][_0x5b63e3(-0x202,-0x1ff,-0x21f,-0x1ff)][_0x5b63e3(-0x1d9,-0x1ea,-0x1f8,-0x20a)](_0x463541['XlgXn']);},0x1e19+0xfd*0x5+-0x217a);}document['addEventLi'+_0x18029d(-0x81,-0x7c,-0x75,-0x84)](_0x18029d(-0x9b,-0x8e,-0xab,-0xb7)+_0x1ba796(0x124,0x135,0x13e,0x122),function(){const _0x115c1f={};_0x115c1f[_0xed9088(0x404,0x40b,0x3ee,0x3f2)]='theme';function _0x16087f(_0x440c01,_0x4fc224,_0x241d74,_0x92791){return _0x18029d(_0x92791-0x1fb,_0x4fc224-0x1aa,_0x440c01,_0x92791-0x57);}_0x115c1f[_0x16087f(0x19e,0x17e,0x191,0x182)]=_0x16087f(0x177,0x165,0x15e,0x17d);function _0xed9088(_0x171297,_0x3d3a89,_0x34b4b9,_0x4bb5da){return _0x18029d(_0x4bb5da-0x479,_0x3d3a89-0x43,_0x3d3a89,_0x4bb5da-0x28);}_0x115c1f[_0x16087f(0x169,0x14d,0x16d,0x161)]='dark-style'+'s',_0x115c1f[_0xed9088(0x3e1,0x3f8,0x3f8,0x3e2)]=_0xed9088(0x3ec,0x3c3,0x3c4,0x3e3)+'sitioning';const _0x5ef815=_0x115c1f,_0x4aafed=localStorage[_0x16087f(0x178,0x197,0x188,0x183)](_0x5ef815[_0x16087f(0x18e,0x15a,0x15c,0x174)])||_0x5ef815[_0x16087f(0x182,0x16c,0x169,0x182)],_0x3229bf=document[_0xed9088(0x3c9,0x3f4,0x3d3,0x3e6)+'ById'](_0x5ef815[_0xed9088(0x3fc,0x3e4,0x3c2,0x3df)]),_0x396127=document[_0xed9088(0x404,0x3e7,0x3da,0x3e6)+_0xed9088(0x3ef,0x3d2,0x3c3,0x3e0)](_0x16087f(0x169,0x15d,0x15e,0x166)+'es');document['body'][_0xed9088(0x3da,0x3f4,0x3cc,0x3d7)]['add'](_0x5ef815[_0xed9088(0x3c2,0x3e6,0x3fd,0x3e2)]),_0x4aafed==='light'?(_0x396127[_0xed9088(0x40a,0x423,0x3fc,0x413)]=![],_0x3229bf[_0xed9088(0x42f,0x3f3,0x414,0x413)]=!![]):(_0x396127['disabled']=!![],_0x3229bf['disabled']=![]),setTimeout(()=>{function _0x1cd834(_0x5128d1,_0x344879,_0x5acb35,_0xe5324c){return _0xed9088(_0x5128d1-0xe,_0xe5324c,_0x5acb35-0x11f,_0x5128d1- -0x62);}function _0x5ed0e0(_0x364399,_0xd563a4,_0x1e548c,_0x1cc897){return _0xed9088(_0x364399-0x18b,_0x1cc897,_0x1e548c-0x16b,_0x1e548c- -0xb9);}document[_0x5ed0e0(0x348,0x32b,0x32c,0x33c)][_0x1cd834(0x375,0x366,0x374,0x381)]['remove']('theme-tran'+_0x5ed0e0(0x36f,0x33c,0x35b,0x353));},0x4be+-0xd*-0x2f+-0x591);}); \ No newline at end of file diff --git a/js/post/normal.js b/js/post/normal.js new file mode 100644 index 0000000..a77cd7c --- /dev/null +++ b/js/post/normal.js @@ -0,0 +1,31 @@ +// Theme toggling script for PyPost +function toggleTheme() { + const darkStyles = document.getElementById('dark-styles'); + const lightStyles = document.getElementById('light-styles'); + const currentlyLight = !lightStyles.disabled; + + document.body.classList.add('theme-transitioning'); + + if (currentlyLight) { + // Switch to dark + lightStyles.disabled = true; + darkStyles.disabled = false; + } else { + // Switch to light + lightStyles.disabled = false; + darkStyles.disabled = true; + } + + setTimeout(() => { + document.body.classList.remove('theme-transitioning'); + }, 400); +} + +document.addEventListener('DOMContentLoaded', function() { + const darkStyles = document.getElementById('dark-styles'); + const lightStyles = document.getElementById('light-styles'); + + // Always start in light mode + lightStyles.disabled = false; + darkStyles.disabled = true; +}); diff --git a/log/Logger.py b/log/Logger.py new file mode 100644 index 0000000..d9fb58b --- /dev/null +++ b/log/Logger.py @@ -0,0 +1,9 @@ +class Logger: + def log_error(self, message: str) -> None: + print(f"ERROR: {message}") + def log_info(self, message: str) -> None: + print(f"INFO: {message}") + def log_debug(self, message: str) -> None: + print(f"DEBUG: {message}") + def log_warning(self, message: str) -> None: + print(f"WARNING: {message}") diff --git a/log/__init__.py b/log/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/webserver.py b/webserver.py new file mode 100644 index 0000000..e68329c --- /dev/null +++ b/webserver.py @@ -0,0 +1,110 @@ +import os +import sys +import threading +import subprocess +from http.server import BaseHTTPRequestHandler, HTTPServer +import mimetypes +from jsmin import jsmin # pip install jsmin + +import PyPost + +PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) +HTML_DIR = os.path.join(PROJECT_ROOT, "html") +BASE_FILE = os.path.join(HTML_DIR, "base", "index.html") + +def get_html_files(directory=HTML_DIR): + html_files = [] + for entry in os.listdir(directory): + full_path = os.path.join(directory, entry) + if os.path.isfile(full_path) and entry.endswith(".html"): + html_files.append(entry) + return html_files + +def build_index_page(): + with open(BASE_FILE, "r", encoding="utf-8") as f: + base_html = f.read() + html_files = get_html_files(HTML_DIR) + links = "\n".join(f'
  • {fname}
  • ' for fname in html_files) + content = f"
      {links}
    " + # Insert footer after content + full_content = content + index_footer() + return base_html.replace("", full_content) + +import base64 +import random + +from hashes.hashes import hash_list + +def index_footer(): + return f""" + +""" + +class MyHandler(BaseHTTPRequestHandler): + def do_GET(self): + req_path = self.path.lstrip("/") + if req_path == "" or req_path == "index.html": + content = build_index_page() + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() + self.wfile.write(content.encode("utf-8")) + return + + file_path = os.path.normpath(os.path.join(PROJECT_ROOT, req_path)) + if not file_path.startswith(PROJECT_ROOT): + self.send_response(403) + self.end_headers() + self.wfile.write(b"403 - Forbidden") + return + + if os.path.isfile(file_path): + mime_type, _ = mimetypes.guess_type(file_path) + if mime_type is None: + mime_type = "application/octet-stream" + + with open(file_path, "rb") as f: + content = f.read() + + # Obfuscate JS on the fly + if mime_type == "application/javascript" or file_path.endswith(".js"): + try: + content = jsmin(content.decode("utf-8")).encode("utf-8") + except Exception as e: + print(f"Error minifying JS file {file_path}: {e}") + + self.send_response(200) + self.send_header("Content-type", mime_type) + self.end_headers() + self.wfile.write(content) + return + + self.send_response(404) + self.end_headers() + self.wfile.write(b"404 - Not Found") + +def run_pypost(): + """Run PyPost.py in a separate process.""" + script = os.path.join(PROJECT_ROOT, "PyPost.py") + subprocess.run([sys.executable, script]) + +if __name__ == "__main__": + threading.Thread(target=run_pypost, daemon=True).start() + print("Started PyPost.py in background watcher thread.") + + server_address = ("localhost", 8000) + httpd = HTTPServer(server_address, MyHandler) + print("Serving on http://localhost:8000") + httpd.serve_forever() +