From 6817395bcb8acc8f36bba3a2642f394f548cf521 Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Wed, 5 Nov 2025 11:52:55 +0100 Subject: [PATCH 1/9] Created a new save_folder_index that uses a html template --- src/cocopp/html/generator.py | 92 ++++++++++++++++++++++ src/cocopp/html/index.py | 143 +++++++++++++++++++++++++++++++++++ src/cocopp/html/writer.py | 48 ++++++++++++ src/cocopp/ppfig.py | 4 +- 4 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 src/cocopp/html/generator.py create mode 100644 src/cocopp/html/index.py create mode 100644 src/cocopp/html/writer.py diff --git a/src/cocopp/html/generator.py b/src/cocopp/html/generator.py new file mode 100644 index 0000000..56ac094 --- /dev/null +++ b/src/cocopp/html/generator.py @@ -0,0 +1,92 @@ +"""HTML content generator for COCO post-processing.""" + +from dataclasses import dataclass +from typing import List, Optional +import os +from .. import genericsettings, testbedsettings + +@dataclass +class HtmlContent: + """Container for HTML content sections.""" + title: str + header: str + body: str + links: List[str] + images: List[str] + footer: str + +class HtmlGenerator: + """Generates HTML content without file I/O concerns.""" + + def __init__(self): + self.templates = { + 'header': """ + + + + + {title} + + + +

{header}

+{links} +""", + 'footer': "\n\n" + } + + def add_image(self, image_name: str, add_link: bool = True, height: int = 160) -> str: + """Generate HTML for an image.""" + if add_link: + return f'' + return f'' + + def add_link(self, path: str, label: str, indent: str = '') -> str: + """Generate HTML for a link.""" + if os.path.isfile(path): + return f'{indent}{label}
\n' + return '' + + def generate_folder_content(self, current_dir: str, image_extension: str) -> HtmlContent: + """Generate content for a folder index.""" + links = [] + images = [] + + # Add navigation links + links.extend([ + self.add_link('../index.html', 'Home'), + self.add_link('pprldflex.html', 'Runtime profiles (with arrow keys navigation)'), + self.add_link('pptable.html', 'Tables for selected targets'), + self.add_link('pprldistr.html', 'Runtime profiles for selected targets') + ]) + + # Add summary image if exists + image_path = f'pprldmany-single-functions/pprldmany.{image_extension}' + if os.path.isfile(os.path.join(current_dir, image_path)): + images.append(self.add_image(image_path, True, 380)) + + return HtmlContent( + title="COCO Post-Processing Results", + header="Results Overview", + body="", + links=links, + images=images, + footer=self.templates['footer'] + ) + + def render(self, content: HtmlContent) -> str: + """Render HTML content to string.""" + html = self.templates['header'].format( + title=content.title, + header=content.header, + links='\n'.join(content.links) + ) + + if content.body: + html += content.body + + if content.images: + html += '\n'.join(content.images) + + html += content.footer + return html \ No newline at end of file diff --git a/src/cocopp/html/index.py b/src/cocopp/html/index.py new file mode 100644 index 0000000..667464e --- /dev/null +++ b/src/cocopp/html/index.py @@ -0,0 +1,143 @@ +"""Main interface for generating folder index pages.""" + +from pathlib import Path +from typing import List, Dict +import logging +from .generator import HtmlGenerator, HtmlContent +from .writer import HtmlWriter +from .. import genericsettings + +# Configure logging +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +def collect_algorithm_data(directory: Path) -> Dict[str, List[str]]: + """Collect algorithm data from directory structure. + + Args: + directory: Path to scan for algorithm data + + Returns: + Dictionary with 'single' and 'comparison' algorithm lists + """ + try: + data = { + 'single': [], + 'comparison': [] + } + + for item in directory.iterdir(): + if not item.is_dir(): + continue + + # Check for single algorithm results + single_file = item / f"{genericsettings.single_algorithm_file_name}.html" + if single_file.exists(): + data['single'].append(item.name) + + # Check for comparison results + many_file = item / f"{genericsettings.many_algorithm_file_name}.html" + if many_file.exists(): + data['comparison'].append(item.name) + + return data + except Exception as e: + logger.error(f"Error collecting algorithm data: {str(e)}") + return {'single': [], 'comparison': []} + +def update_parent_index(parent_index: Path) -> None: + """Update the parent index.html file with links to algorithm results. + + This function scans the parent directory for algorithm results and + generates a new index page with organized links to single algorithm + and comparison results. + + Args: + parent_index: Path to the parent index.html file + + Raises: + IOError: If there are issues reading/writing the index file + """ + try: + generator = HtmlGenerator() + parent_dir = parent_index.parent + + # Collect data about available algorithms + algo_data = collect_algorithm_data(parent_dir) + + # Generate links sections + links = [] + + # Add comparison section if we have any + if algo_data['comparison']: + links.append('

Comparison Data

') + for algo in sorted(algo_data['comparison']): + link = generator.add_link( + path=str(Path(algo) / f"{genericsettings.many_algorithm_file_name}.html"), + label=algo, + indent='  ' + ) + links.append(link) + + # Add single algorithm section + if algo_data['single']: + links.append('

Single Algorithm Data

') + for algo in sorted(algo_data['single']): + link = generator.add_link( + path=str(Path(algo) / f"{genericsettings.single_algorithm_file_name}.html"), + label=algo, + indent='  ' + ) + links.append(link) + + # Create content object + content = HtmlContent( + title="COCO Post-Processing Results", + header="COCO Post-Processing Results", + body="", + links=links, + images=[], + footer="" + ) + + # Render HTML + html = generator.render(content) + + # Safely write the file + writer = HtmlWriter() + writer.backup_if_exists(parent_index) + writer.write_safely(parent_index, html) + + logger.info(f"Successfully updated parent index at {parent_index}") + + except Exception as e: + logger.error(f"Failed to update parent index: {str(e)}") + raise IOError(f"Failed to update parent index: {str(e)}") + +def save_folder_index(filepath: str, image_extension: str) -> None: + """Generate and save a folder index file. + + Args: + filepath: Path where the index file should be saved + image_extension: Extension for image files (e.g. 'svg', 'png') + """ + if not filepath: + return + + # Generate content + generator = HtmlGenerator() + current_dir = str(Path(filepath).parent) + content = generator.generate_folder_content(current_dir, image_extension) + + # Render to HTML + html = generator.render(content) + + # Safely write to file with backup + writer = HtmlWriter() + writer.backup_if_exists(filepath) + writer.write_safely(filepath, html) + + # Update parent index if needed + parent_index = Path(filepath).parent.parent / 'index.html' + if parent_index.exists(): + update_parent_index(parent_index) \ No newline at end of file diff --git a/src/cocopp/html/writer.py b/src/cocopp/html/writer.py new file mode 100644 index 0000000..0b138ad --- /dev/null +++ b/src/cocopp/html/writer.py @@ -0,0 +1,48 @@ +"""Safe file writing utilities for HTML output.""" + +import os +import shutil +from pathlib import Path +from typing import Union, Optional +import tempfile + +class HtmlWriter: + """Handles safe writing of HTML files with atomic operations.""" + + @staticmethod + def write_safely(filepath: Union[str, Path], content: str) -> None: + """Write content to file atomically using a temporary file.""" + filepath = Path(filepath) + + # Create parent directories if they don't exist + filepath.parent.mkdir(parents=True, exist_ok=True) + + # Write to temporary file first + tmp = tempfile.NamedTemporaryFile(mode='w', delete=False, dir=str(filepath.parent)) + try: + tmp.write(content) + tmp.close() + + # Atomic replace + shutil.move(tmp.name, str(filepath)) + except Exception as e: + # Clean up temp file if anything goes wrong + os.unlink(tmp.name) + raise IOError(f"Failed to write {filepath}: {str(e)}") + + @staticmethod + def backup_if_exists(filepath: Union[str, Path], max_backups: int = 5) -> None: + """Create numbered backup of existing file.""" + filepath = Path(filepath) + if not filepath.exists(): + return + + for i in range(max_backups - 1, 0, -1): + backup = filepath.with_suffix(f'.html.{i}') + prev_backup = filepath.with_suffix(f'.html.{i-1}') + + if prev_backup.exists(): + shutil.move(str(prev_backup), str(backup)) + + backup = filepath.with_suffix('.html.1') + shutil.copy2(str(filepath), str(backup)) \ No newline at end of file diff --git a/src/cocopp/ppfig.py b/src/cocopp/ppfig.py index 5747684..fe76574 100644 --- a/src/cocopp/ppfig.py +++ b/src/cocopp/ppfig.py @@ -14,6 +14,8 @@ from matplotlib import pyplot as plt import shutil from six import advance_iterator +from cocopp.html.index import save_folder_index + # from pdb import set_trace # absolute_import => . refers to where ppfig resides in the package: @@ -496,7 +498,7 @@ def save_single_functions_html(filename, toolsdivers.replace_in_file(filename + add_to_names + '.html', '??COCOVERSION??', '
Data produced with COCO %s' % (toolsdivers.get_version_label(None))) if parentFileName: - save_folder_index_file(os.path.join(current_dir, parentFileName + '.html'), extension) + save_folder_index(os.path.join(current_dir, parentFileName + '.html'), extension) def write_dimension_links(dimension, dimensions, index): From 6799f0ce976026fc6c54dac5f8883b343979ecb1 Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Sun, 16 Nov 2025 17:44:01 +0100 Subject: [PATCH 2/9] Updated venv in gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 57491c1..067d3e5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ src/cocopp/**/*.dat src/cocopp/**/*.tdat src/cocopp/**/*.info dist/ -ppdata/ \ No newline at end of file +ppdata/ +venv/ \ No newline at end of file From 9fc979a12c44f9d2c3f7fcf51b302d03395c72b9 Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Sun, 16 Nov 2025 18:12:15 +0100 Subject: [PATCH 3/9] For Mac path changes --- src/cocopp/html/index.py | 93 ++++++++++++++++----------------------- src/cocopp/html/writer.py | 65 ++++++++++++++++++--------- 2 files changed, 81 insertions(+), 77 deletions(-) diff --git a/src/cocopp/html/index.py b/src/cocopp/html/index.py index 667464e..345e92f 100644 --- a/src/cocopp/html/index.py +++ b/src/cocopp/html/index.py @@ -1,8 +1,8 @@ """Main interface for generating folder index pages.""" -from pathlib import Path -from typing import List, Dict +from typing import Dict import logging +import os from .generator import HtmlGenerator, HtmlContent from .writer import HtmlWriter from .. import genericsettings @@ -11,41 +11,29 @@ logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) -def collect_algorithm_data(directory: Path) -> Dict[str, List[str]]: - """Collect algorithm data from directory structure. +def collect_algorithm_data(directory): + """Collect algorithm data from directory structure.""" + data = {'single': [], 'comparison': []} - Args: - directory: Path to scan for algorithm data + if not os.path.isdir(directory): + return data + + for item in os.listdir(directory): + item_path = os.path.join(directory, item) + if not os.path.isdir(item_path): + continue - Returns: - Dictionary with 'single' and 'comparison' algorithm lists - """ - try: - data = { - 'single': [], - 'comparison': [] - } + single_file = os.path.join(item_path, '%s.html' % genericsettings.single_algorithm_file_name) + if os.path.isfile(single_file): + data['single'].append(item) - for item in directory.iterdir(): - if not item.is_dir(): - continue - - # Check for single algorithm results - single_file = item / f"{genericsettings.single_algorithm_file_name}.html" - if single_file.exists(): - data['single'].append(item.name) - - # Check for comparison results - many_file = item / f"{genericsettings.many_algorithm_file_name}.html" - if many_file.exists(): - data['comparison'].append(item.name) - - return data - except Exception as e: - logger.error(f"Error collecting algorithm data: {str(e)}") - return {'single': [], 'comparison': []} + many_file = os.path.join(item_path, '%s.html' % genericsettings.many_algorithm_file_name) + if os.path.isfile(many_file): + data['comparison'].append(item) + + return data -def update_parent_index(parent_index: Path) -> None: +def update_parent_index(parent_index_path): """Update the parent index.html file with links to algorithm results. This function scans the parent directory for algorithm results and @@ -53,14 +41,14 @@ def update_parent_index(parent_index: Path) -> None: and comparison results. Args: - parent_index: Path to the parent index.html file + parent_index_path: Path to the parent index.html file Raises: IOError: If there are issues reading/writing the index file """ try: generator = HtmlGenerator() - parent_dir = parent_index.parent + parent_dir = os.path.dirname(os.path.realpath(parent_index_path)) # Collect data about available algorithms algo_data = collect_algorithm_data(parent_dir) @@ -72,22 +60,16 @@ def update_parent_index(parent_index: Path) -> None: if algo_data['comparison']: links.append('

Comparison Data

') for algo in sorted(algo_data['comparison']): - link = generator.add_link( - path=str(Path(algo) / f"{genericsettings.many_algorithm_file_name}.html"), - label=algo, - indent='  ' - ) + path = os.path.join(algo, '%s.html' % genericsettings.many_algorithm_file_name) + link = generator.add_link(path, algo, '  ') links.append(link) # Add single algorithm section if algo_data['single']: links.append('

Single Algorithm Data

') for algo in sorted(algo_data['single']): - link = generator.add_link( - path=str(Path(algo) / f"{genericsettings.single_algorithm_file_name}.html"), - label=algo, - indent='  ' - ) + path = os.path.join(algo, '%s.html' % genericsettings.single_algorithm_file_name) + link = generator.add_link(path, algo, '  ') links.append(link) # Create content object @@ -105,16 +87,16 @@ def update_parent_index(parent_index: Path) -> None: # Safely write the file writer = HtmlWriter() - writer.backup_if_exists(parent_index) - writer.write_safely(parent_index, html) + writer.backup_if_exists(parent_index_path) + writer.write_safely(parent_index_path, html) - logger.info(f"Successfully updated parent index at {parent_index}") + logger.info("Successfully updated parent index at %s" % parent_index_path) except Exception as e: - logger.error(f"Failed to update parent index: {str(e)}") - raise IOError(f"Failed to update parent index: {str(e)}") + logger.error("Failed to update parent index: %s" % str(e)) + raise IOError("Failed to update parent index: %s" % str(e)) -def save_folder_index(filepath: str, image_extension: str) -> None: +def save_folder_index(filepath, image_extension): """Generate and save a folder index file. Args: @@ -126,7 +108,7 @@ def save_folder_index(filepath: str, image_extension: str) -> None: # Generate content generator = HtmlGenerator() - current_dir = str(Path(filepath).parent) + current_dir = os.path.dirname(os.path.realpath(filepath)) content = generator.generate_folder_content(current_dir, image_extension) # Render to HTML @@ -138,6 +120,7 @@ def save_folder_index(filepath: str, image_extension: str) -> None: writer.write_safely(filepath, html) # Update parent index if needed - parent_index = Path(filepath).parent.parent / 'index.html' - if parent_index.exists(): - update_parent_index(parent_index) \ No newline at end of file + parent_dir = os.path.dirname(current_dir) + parent_index_path = os.path.join(parent_dir, 'index.html') + if os.path.isfile(parent_index_path): + update_parent_index(parent_index_path) \ No newline at end of file diff --git a/src/cocopp/html/writer.py b/src/cocopp/html/writer.py index 0b138ad..36895a9 100644 --- a/src/cocopp/html/writer.py +++ b/src/cocopp/html/writer.py @@ -2,47 +2,68 @@ import os import shutil -from pathlib import Path -from typing import Union, Optional import tempfile class HtmlWriter: """Handles safe writing of HTML files with atomic operations.""" @staticmethod - def write_safely(filepath: Union[str, Path], content: str) -> None: - """Write content to file atomically using a temporary file.""" - filepath = Path(filepath) + def write_safely(filepath, content): + """Write content to file atomically using a temporary file. + + Args: + filepath: Path to the output file + content: HTML content to write + """ + filepath = str(filepath) # Create parent directories if they don't exist - filepath.parent.mkdir(parents=True, exist_ok=True) + parent_dir = os.path.dirname(filepath) + if parent_dir and not os.path.exists(parent_dir): + os.makedirs(parent_dir) # Write to temporary file first - tmp = tempfile.NamedTemporaryFile(mode='w', delete=False, dir=str(filepath.parent)) + fd, tmp_path = tempfile.mkstemp(dir=parent_dir, text=True) try: - tmp.write(content) - tmp.close() + with os.fdopen(fd, 'w', encoding='utf-8') as tmp: + tmp.write(content) # Atomic replace - shutil.move(tmp.name, str(filepath)) + if os.path.exists(filepath): + os.remove(filepath) + shutil.move(tmp_path, filepath) except Exception as e: # Clean up temp file if anything goes wrong - os.unlink(tmp.name) + try: + os.unlink(tmp_path) + except OSError: + pass raise IOError(f"Failed to write {filepath}: {str(e)}") @staticmethod - def backup_if_exists(filepath: Union[str, Path], max_backups: int = 5) -> None: - """Create numbered backup of existing file.""" - filepath = Path(filepath) - if not filepath.exists(): + def backup_if_exists(filepath, max_backups=5): + """Create numbered backup of existing file. + + Args: + filepath: Path to the file to backup + max_backups: Maximum number of backups to keep + """ + filepath = str(filepath) + if not os.path.exists(filepath): return + # Rotate existing backups for i in range(max_backups - 1, 0, -1): - backup = filepath.with_suffix(f'.html.{i}') - prev_backup = filepath.with_suffix(f'.html.{i-1}') + backup = filepath + '.%d' % i + prev_backup = filepath + '.%d' % (i - 1) - if prev_backup.exists(): - shutil.move(str(prev_backup), str(backup)) - - backup = filepath.with_suffix('.html.1') - shutil.copy2(str(filepath), str(backup)) \ No newline at end of file + if os.path.exists(prev_backup): + if os.path.exists(backup): + os.remove(backup) + shutil.move(prev_backup, backup) + + # Create new backup + backup = filepath + '.1' + if os.path.exists(backup): + os.remove(backup) + shutil.copy2(filepath, backup) \ No newline at end of file From b45df208972793137abf17f3377ef52444769390 Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Sun, 16 Nov 2025 18:34:42 +0100 Subject: [PATCH 4/9] Another attempt --- src/cocopp/html/index.py | 87 +++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/src/cocopp/html/index.py b/src/cocopp/html/index.py index 345e92f..22864f9 100644 --- a/src/cocopp/html/index.py +++ b/src/cocopp/html/index.py @@ -1,6 +1,5 @@ """Main interface for generating folder index pages.""" -from typing import Dict import logging import os from .generator import HtmlGenerator, HtmlContent @@ -18,18 +17,21 @@ def collect_algorithm_data(directory): if not os.path.isdir(directory): return data - for item in os.listdir(directory): - item_path = os.path.join(directory, item) - if not os.path.isdir(item_path): - continue - - single_file = os.path.join(item_path, '%s.html' % genericsettings.single_algorithm_file_name) - if os.path.isfile(single_file): - data['single'].append(item) - - many_file = os.path.join(item_path, '%s.html' % genericsettings.many_algorithm_file_name) - if os.path.isfile(many_file): - data['comparison'].append(item) + try: + for item in os.listdir(directory): + item_path = os.path.join(directory, item) + if not os.path.isdir(item_path): + continue + + single_file = os.path.join(item_path, '%s.html' % genericsettings.single_algorithm_file_name) + if os.path.isfile(single_file): + data['single'].append(item) + + many_file = os.path.join(item_path, '%s.html' % genericsettings.many_algorithm_file_name) + if os.path.isfile(many_file): + data['comparison'].append(item) + except OSError as e: + logger.warning("Error reading directory %s: %s" % (directory, str(e))) return data @@ -60,17 +62,23 @@ def update_parent_index(parent_index_path): if algo_data['comparison']: links.append('

Comparison Data

') for algo in sorted(algo_data['comparison']): - path = os.path.join(algo, '%s.html' % genericsettings.many_algorithm_file_name) - link = generator.add_link(path, algo, '  ') - links.append(link) + # Use absolute path for checking, relative for linking + abs_path = os.path.join(parent_dir, algo, '%s.html' % genericsettings.many_algorithm_file_name) + rel_path = os.path.join(algo, '%s.html' % genericsettings.many_algorithm_file_name) + if os.path.isfile(abs_path): + link = generator.add_link(rel_path, algo, '  ') + links.append(link) # Add single algorithm section if algo_data['single']: links.append('

Single Algorithm Data

') for algo in sorted(algo_data['single']): - path = os.path.join(algo, '%s.html' % genericsettings.single_algorithm_file_name) - link = generator.add_link(path, algo, '  ') - links.append(link) + # Use absolute path for checking, relative for linking + abs_path = os.path.join(parent_dir, algo, '%s.html' % genericsettings.single_algorithm_file_name) + rel_path = os.path.join(algo, '%s.html' % genericsettings.single_algorithm_file_name) + if os.path.isfile(abs_path): + link = generator.add_link(rel_path, algo, '  ') + links.append(link) # Create content object content = HtmlContent( @@ -105,22 +113,27 @@ def save_folder_index(filepath, image_extension): """ if not filepath: return - - # Generate content - generator = HtmlGenerator() - current_dir = os.path.dirname(os.path.realpath(filepath)) - content = generator.generate_folder_content(current_dir, image_extension) - # Render to HTML - html = generator.render(content) - - # Safely write to file with backup - writer = HtmlWriter() - writer.backup_if_exists(filepath) - writer.write_safely(filepath, html) - - # Update parent index if needed - parent_dir = os.path.dirname(current_dir) - parent_index_path = os.path.join(parent_dir, 'index.html') - if os.path.isfile(parent_index_path): - update_parent_index(parent_index_path) \ No newline at end of file + try: + # Generate content + generator = HtmlGenerator() + current_dir = os.path.dirname(os.path.realpath(filepath)) + content = generator.generate_folder_content(current_dir, image_extension) + + # Render to HTML + html = generator.render(content) + + # Safely write to file with backup + writer = HtmlWriter() + writer.backup_if_exists(filepath) + writer.write_safely(filepath, html) + + # Update parent index if needed + parent_dir = os.path.dirname(current_dir) + parent_index_path = os.path.join(parent_dir, 'index.html') + if os.path.isfile(parent_index_path): + update_parent_index(parent_index_path) + + except Exception as e: + logger.error("Failed to save folder index at %s: %s" % (filepath, str(e))) + raise \ No newline at end of file From 4f6774c2743775cc170768aa28a78adb3302ca0e Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Sun, 16 Nov 2025 19:20:07 +0100 Subject: [PATCH 5/9] Making it JS and not delete re-write --- src/cocopp/html/generator.py | 192 ++++++++++++++++++++++------------- src/cocopp/html/index.py | 78 +++++--------- src/cocopp/html/writer.py | 39 +------ 3 files changed, 153 insertions(+), 156 deletions(-) diff --git a/src/cocopp/html/generator.py b/src/cocopp/html/generator.py index 56ac094..eeed27b 100644 --- a/src/cocopp/html/generator.py +++ b/src/cocopp/html/generator.py @@ -1,92 +1,140 @@ """HTML content generator for COCO post-processing.""" -from dataclasses import dataclass -from typing import List, Optional +import json import os from .. import genericsettings, testbedsettings -@dataclass -class HtmlContent: - """Container for HTML content sections.""" - title: str - header: str - body: str - links: List[str] - images: List[str] - footer: str - class HtmlGenerator: - """Generates HTML content without file I/O concerns.""" + """Generates HTML content with dynamic JavaScript updates.""" - def __init__(self): - self.templates = { - 'header': """ + STATIC_TEMPLATE = """ + - - {title} + + COCO Post-Processing Results + -

{header}

-{links} -""", - 'footer': "\n\n" - } +

COCO Post-Processing Results

+ +
- def add_image(self, image_name: str, add_link: bool = True, height: int = 160) -> str: - """Generate HTML for an image.""" - if add_link: - return f'' - return f'' + - def render(self, content: HtmlContent) -> str: - """Render HTML content to string.""" - html = self.templates['header'].format( - title=content.title, - header=content.header, - links='\n'.join(content.links) - ) + +""" + + def __init__(self): + pass + + def generate_parent_index_data(self, algo_data, single_file_name, many_file_name): + """Generate data structure for parent index.""" + return { + 'title': 'COCO Post-Processing Results', + 'header': 'COCO Post-Processing Results', + 'nav_links': [], + 'single': sorted(algo_data.get('single', [])), + 'comparison': sorted(algo_data.get('comparison', [])), + 'images': [], + 'single_file_name': single_file_name, + 'many_file_name': many_file_name + } + + def generate_folder_content(self, current_dir, image_extension): + """Generate data structure for folder index.""" + nav_links = [ + 'Home', + 'Runtime profiles (with arrow keys navigation)', + 'Tables for selected targets', + 'Runtime profiles for selected targets' + ] - if content.body: - html += content.body - - if content.images: - html += '\n'.join(content.images) - - html += content.footer + images = [] + image_path = 'pprldmany-single-functions/pprldmany.%s' % image_extension + if os.path.isfile(os.path.join(current_dir, image_path)): + images.append(image_path) + + return { + 'title': 'COCO Post-Processing Results', + 'header': 'Results Overview', + 'nav_links': nav_links, + 'single': [], + 'comparison': [], + 'images': images, + 'single_file_name': '', + 'many_file_name': '' + } + + def render(self, data): + """Render HTML with injected data.""" + json_data = json.dumps(data, ensure_ascii=False) + html = self.STATIC_TEMPLATE.replace('{data}', json_data) return html \ No newline at end of file diff --git a/src/cocopp/html/index.py b/src/cocopp/html/index.py index 22864f9..0d260db 100644 --- a/src/cocopp/html/index.py +++ b/src/cocopp/html/index.py @@ -2,7 +2,7 @@ import logging import os -from .generator import HtmlGenerator, HtmlContent +from .generator import HtmlGenerator from .writer import HtmlWriter from .. import genericsettings @@ -38,9 +38,8 @@ def collect_algorithm_data(directory): def update_parent_index(parent_index_path): """Update the parent index.html file with links to algorithm results. - This function scans the parent directory for algorithm results and - generates a new index page with organized links to single algorithm - and comparison results. + This function only writes the HTML file once. Links are managed + dynamically via JavaScript based on available algorithm directories. Args: parent_index_path: Path to the parent index.html file @@ -55,50 +54,23 @@ def update_parent_index(parent_index_path): # Collect data about available algorithms algo_data = collect_algorithm_data(parent_dir) - # Generate links sections - links = [] - - # Add comparison section if we have any - if algo_data['comparison']: - links.append('

Comparison Data

') - for algo in sorted(algo_data['comparison']): - # Use absolute path for checking, relative for linking - abs_path = os.path.join(parent_dir, algo, '%s.html' % genericsettings.many_algorithm_file_name) - rel_path = os.path.join(algo, '%s.html' % genericsettings.many_algorithm_file_name) - if os.path.isfile(abs_path): - link = generator.add_link(rel_path, algo, '  ') - links.append(link) - - # Add single algorithm section - if algo_data['single']: - links.append('

Single Algorithm Data

') - for algo in sorted(algo_data['single']): - # Use absolute path for checking, relative for linking - abs_path = os.path.join(parent_dir, algo, '%s.html' % genericsettings.single_algorithm_file_name) - rel_path = os.path.join(algo, '%s.html' % genericsettings.single_algorithm_file_name) - if os.path.isfile(abs_path): - link = generator.add_link(rel_path, algo, '  ') - links.append(link) - - # Create content object - content = HtmlContent( - title="COCO Post-Processing Results", - header="COCO Post-Processing Results", - body="", - links=links, - images=[], - footer="" + # Generate data structure for dynamic rendering + data = generator.generate_parent_index_data( + algo_data, + genericsettings.single_algorithm_file_name, + genericsettings.many_algorithm_file_name ) # Render HTML - html = generator.render(content) + html = generator.render(data) - # Safely write the file + # Write only if file doesn't exist (initial creation) writer = HtmlWriter() - writer.backup_if_exists(parent_index_path) - writer.write_safely(parent_index_path, html) - - logger.info("Successfully updated parent index at %s" % parent_index_path) + if not os.path.isfile(parent_index_path): + writer.write_safely(parent_index_path, html) + logger.info("Created parent index at %s" % parent_index_path) + else: + logger.info("Parent index already exists at %s (using dynamic JS updates)" % parent_index_path) except Exception as e: logger.error("Failed to update parent index: %s" % str(e)) @@ -107,6 +79,9 @@ def update_parent_index(parent_index_path): def save_folder_index(filepath, image_extension): """Generate and save a folder index file. + The HTML file is created once with static structure. Dynamic content + is managed via JavaScript and server-side data updates. + Args: filepath: Path where the index file should be saved image_extension: Extension for image files (e.g. 'svg', 'png') @@ -115,23 +90,26 @@ def save_folder_index(filepath, image_extension): return try: - # Generate content + # Generate content data generator = HtmlGenerator() current_dir = os.path.dirname(os.path.realpath(filepath)) - content = generator.generate_folder_content(current_dir, image_extension) + data = generator.generate_folder_content(current_dir, image_extension) # Render to HTML - html = generator.render(content) + html = generator.render(data) - # Safely write to file with backup + # Write only if file doesn't exist (initial creation) writer = HtmlWriter() - writer.backup_if_exists(filepath) - writer.write_safely(filepath, html) + if not os.path.isfile(filepath): + writer.write_safely(filepath, html) + logger.info("Created folder index at %s" % filepath) + else: + logger.info("Folder index already exists at %s (using dynamic JS updates)" % filepath) # Update parent index if needed parent_dir = os.path.dirname(current_dir) parent_index_path = os.path.join(parent_dir, 'index.html') - if os.path.isfile(parent_index_path): + if not os.path.isfile(parent_index_path): update_parent_index(parent_index_path) except Exception as e: diff --git a/src/cocopp/html/writer.py b/src/cocopp/html/writer.py index 36895a9..c9bc0ee 100644 --- a/src/cocopp/html/writer.py +++ b/src/cocopp/html/writer.py @@ -23,47 +23,18 @@ def write_safely(filepath, content): os.makedirs(parent_dir) # Write to temporary file first - fd, tmp_path = tempfile.mkstemp(dir=parent_dir, text=True) + fd, tmp_path = tempfile.mkstemp(dir=parent_dir or '.', text=True) try: - with os.fdopen(fd, 'w', encoding='utf-8') as tmp: + with os.fdopen(fd, 'w', encoding='utf-8', newline='') as tmp: tmp.write(content) - # Atomic replace - if os.path.exists(filepath): - os.remove(filepath) + # Atomic move - replaces if exists shutil.move(tmp_path, filepath) + except Exception as e: # Clean up temp file if anything goes wrong try: os.unlink(tmp_path) except OSError: pass - raise IOError(f"Failed to write {filepath}: {str(e)}") - - @staticmethod - def backup_if_exists(filepath, max_backups=5): - """Create numbered backup of existing file. - - Args: - filepath: Path to the file to backup - max_backups: Maximum number of backups to keep - """ - filepath = str(filepath) - if not os.path.exists(filepath): - return - - # Rotate existing backups - for i in range(max_backups - 1, 0, -1): - backup = filepath + '.%d' % i - prev_backup = filepath + '.%d' % (i - 1) - - if os.path.exists(prev_backup): - if os.path.exists(backup): - os.remove(backup) - shutil.move(prev_backup, backup) - - # Create new backup - backup = filepath + '.1' - if os.path.exists(backup): - os.remove(backup) - shutil.copy2(filepath, backup) \ No newline at end of file + raise IOError("Failed to write %s: %s" % (filepath, str(e))) \ No newline at end of file From c659f4e6e210e10df841a51265592fe7b9456d0d Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Mon, 17 Nov 2025 11:51:21 +0100 Subject: [PATCH 6/9] Writing directly on top --- src/cocopp/html/writer.py | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/cocopp/html/writer.py b/src/cocopp/html/writer.py index c9bc0ee..6fe6c6e 100644 --- a/src/cocopp/html/writer.py +++ b/src/cocopp/html/writer.py @@ -1,8 +1,6 @@ """Safe file writing utilities for HTML output.""" import os -import shutil -import tempfile class HtmlWriter: """Handles safe writing of HTML files with atomic operations.""" @@ -22,19 +20,10 @@ def write_safely(filepath, content): if parent_dir and not os.path.exists(parent_dir): os.makedirs(parent_dir) - # Write to temporary file first - fd, tmp_path = tempfile.mkstemp(dir=parent_dir or '.', text=True) try: - with os.fdopen(fd, 'w', encoding='utf-8', newline='') as tmp: - tmp.write(content) - - # Atomic move - replaces if exists - shutil.move(tmp_path, filepath) - + with open(filepath, 'w', encoding='utf-8', newline='') as f: + f.write(content) + f.flush() + os.fsync(f.fileno()) # Force write to disk on Mac except Exception as e: - # Clean up temp file if anything goes wrong - try: - os.unlink(tmp_path) - except OSError: - pass raise IOError("Failed to write %s: %s" % (filepath, str(e))) \ No newline at end of file From 77b4d5bf5bbcdbc3843666f3a9a6e40879de1614 Mon Sep 17 00:00:00 2001 From: "Joshua, Alexander" Date: Mon, 17 Nov 2025 14:20:47 +0100 Subject: [PATCH 7/9] SEparated the JS script --- src/cocopp/html/generator.py | 57 ++---------------------------------- src/cocopp/html/renderer.js | 57 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 55 deletions(-) create mode 100644 src/cocopp/html/renderer.js diff --git a/src/cocopp/html/generator.py b/src/cocopp/html/generator.py index eeed27b..4dc9f04 100644 --- a/src/cocopp/html/generator.py +++ b/src/cocopp/html/generator.py @@ -2,7 +2,6 @@ import json import os -from .. import genericsettings, testbedsettings class HtmlGenerator: """Generates HTML content with dynamic JavaScript updates.""" @@ -33,61 +32,9 @@ class HtmlGenerator: + """ diff --git a/src/cocopp/html/renderer.js b/src/cocopp/html/renderer.js new file mode 100644 index 0000000..7576f8e --- /dev/null +++ b/src/cocopp/html/renderer.js @@ -0,0 +1,57 @@ +// Data injected by server +var contentData = window.contentData || {}; + +function renderLinks(data) { + var container = document.getElementById('linksContainer'); + var html = ''; + + // Navigation links + if (data.nav_links && data.nav_links.length > 0) { + data.nav_links.forEach(function(link) { + if (link) { + html += ''; + } + }); + } + + // Comparison section + if (data.comparison && data.comparison.length > 0) { + html += '

Comparison Data

'; + data.comparison.forEach(function(algo) { + var path = algo + '/' + data.many_file_name + '.html'; + html += ''; + }); + } + + // Single algorithm section + if (data.single && data.single.length > 0) { + html += '

Single Algorithm Data

'; + data.single.forEach(function(algo) { + var path = algo + '/' + data.single_file_name + '.html'; + html += ''; + }); + } + + container.innerHTML = html; +} + +function renderImages(data) { + var container = document.getElementById('imagesContainer'); + var html = ''; + + if (data.images && data.images.length > 0) { + data.images.forEach(function(img) { + html += '
'; + }); + } + + container.innerHTML = html; +} + +// Render on page load +document.addEventListener('DOMContentLoaded', function() { + if (contentData) { + renderLinks(contentData); + renderImages(contentData); + } +}); From d54807751e5c76922bddd02c77cc49704157b1cb Mon Sep 17 00:00:00 2001 From: Aris Fevre Date: Mon, 17 Nov 2025 15:38:24 +0100 Subject: [PATCH 8/9] Comment mods --- src/cocopp/html/index.py | 17 ++++++++--------- src/cocopp/html/renderer.js | 8 ++++---- src/cocopp/html/writer.py | 4 ++-- src/cocopp/refalgs/best2009-bbob.tar.gz.pickle | Bin 0 -> 722455 bytes 4 files changed, 14 insertions(+), 15 deletions(-) create mode 100644 src/cocopp/refalgs/best2009-bbob.tar.gz.pickle diff --git a/src/cocopp/html/index.py b/src/cocopp/html/index.py index 0d260db..df46701 100644 --- a/src/cocopp/html/index.py +++ b/src/cocopp/html/index.py @@ -6,7 +6,6 @@ from .writer import HtmlWriter from .. import genericsettings -# Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -51,20 +50,20 @@ def update_parent_index(parent_index_path): generator = HtmlGenerator() parent_dir = os.path.dirname(os.path.realpath(parent_index_path)) - # Collect data about available algorithms + # to collect data from available algorithms algo_data = collect_algorithm_data(parent_dir) - # Generate data structure for dynamic rendering + # generating data structure for dynamic rendering data = generator.generate_parent_index_data( algo_data, genericsettings.single_algorithm_file_name, genericsettings.many_algorithm_file_name ) - # Render HTML + # HTML rendering html = generator.render(data) - # Write only if file doesn't exist (initial creation) + # initial creation of the file (will be created only if it doesn't already exist) writer = HtmlWriter() if not os.path.isfile(parent_index_path): writer.write_safely(parent_index_path, html) @@ -90,15 +89,15 @@ def save_folder_index(filepath, image_extension): return try: - # Generate content data + # content data generation generator = HtmlGenerator() current_dir = os.path.dirname(os.path.realpath(filepath)) data = generator.generate_folder_content(current_dir, image_extension) - # Render to HTML + # rendering to HTML html = generator.render(data) - # Write only if file doesn't exist (initial creation) + # initial creation of the file (created only if it doesn't already exist) writer = HtmlWriter() if not os.path.isfile(filepath): writer.write_safely(filepath, html) @@ -106,7 +105,7 @@ def save_folder_index(filepath, image_extension): else: logger.info("Folder index already exists at %s (using dynamic JS updates)" % filepath) - # Update parent index if needed + # update parent index if needed parent_dir = os.path.dirname(current_dir) parent_index_path = os.path.join(parent_dir, 'index.html') if not os.path.isfile(parent_index_path): diff --git a/src/cocopp/html/renderer.js b/src/cocopp/html/renderer.js index 7576f8e..18f3830 100644 --- a/src/cocopp/html/renderer.js +++ b/src/cocopp/html/renderer.js @@ -1,4 +1,4 @@ -// Data injected by server +// data injected by server var contentData = window.contentData || {}; function renderLinks(data) { @@ -14,7 +14,7 @@ function renderLinks(data) { }); } - // Comparison section + // comparison code if (data.comparison && data.comparison.length > 0) { html += '

Comparison Data

'; data.comparison.forEach(function(algo) { @@ -23,7 +23,7 @@ function renderLinks(data) { }); } - // Single algorithm section + // single algorithm code if (data.single && data.single.length > 0) { html += '

Single Algorithm Data

'; data.single.forEach(function(algo) { @@ -48,7 +48,7 @@ function renderImages(data) { container.innerHTML = html; } -// Render on page load +// rendering code document.addEventListener('DOMContentLoaded', function() { if (contentData) { renderLinks(contentData); diff --git a/src/cocopp/html/writer.py b/src/cocopp/html/writer.py index 6fe6c6e..fb41005 100644 --- a/src/cocopp/html/writer.py +++ b/src/cocopp/html/writer.py @@ -15,7 +15,7 @@ def write_safely(filepath, content): """ filepath = str(filepath) - # Create parent directories if they don't exist + # creating parent directories (if they don't already exist) parent_dir = os.path.dirname(filepath) if parent_dir and not os.path.exists(parent_dir): os.makedirs(parent_dir) @@ -24,6 +24,6 @@ def write_safely(filepath, content): with open(filepath, 'w', encoding='utf-8', newline='') as f: f.write(content) f.flush() - os.fsync(f.fileno()) # Force write to disk on Mac + os.fsync(f.fileno()) # forcing writing to disk (for mac users) except Exception as e: raise IOError("Failed to write %s: %s" % (filepath, str(e))) \ No newline at end of file diff --git a/src/cocopp/refalgs/best2009-bbob.tar.gz.pickle b/src/cocopp/refalgs/best2009-bbob.tar.gz.pickle new file mode 100644 index 0000000000000000000000000000000000000000..33d68e16efe8677c006a165758c0f63e6d2ed0ca GIT binary patch literal 722455 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�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

sn{nL(`-b{sgc5 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 lW0-$#QCJ)>vZVt~YT Date: Thu, 22 Jan 2026 14:06:53 +0100 Subject: [PATCH 9/9] Add links to documentation and source code in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 75f1780..12c4a80 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ The package uses data generated with the [COCO framework](https://coco-platform. The main documentation pages for the `coco-postprocess` package `cocopp` can be found at + - [getting-started](https://numbbo.it/getting-started#postprocess) - [API documentation](https://numbbo.github.io/coco-doc/apidocs/cocopp) - [Issue tracker and bug reports](https://github.com/numbbo/coco-postprocess/issues)