{% extends "base.html" %} {% block style %} <script src="{{ url_for("static", filename="leader-line.min.js") }}"></script> <style> .right-images { position: absolute; right: -280px; top: 0; width: 120px; } .left-images { position: absolute; right: -140px; top: 0; width: 120px; } .image { max-width: 100%; } .container { position: relative; } .person { display: flex; align-items: top; margin-bottom: 10px; } .info { flex: 1; /* Allow text to take remaining space */ padding-right: 10px; /* Add spacing between text and image */ } img.photo { max-width: 120px; /* Set max width for images */ height: auto; /* Maintain image aspect ratio */ } </style> </style> {% endblock %} {% set show_images = False %} {% block title %}Conference archive{% endblock %} {% block content %} <div class="container"> {% if show_images %} <div class="left-images"> {% for person, photo in left_photos %} <div class="image-container" id="image-{{person.id}}"> <a href="{{ url_for("person", person_id=person.id) }}"> <img class="image" src="{{ url_for("static", filename=photo) }}" alt="{{ person.name}}" title="{{ person.name}}"> </a> </div> {% endfor %} </div> <div class="right-images"> {% for person, photo in right_photos %} <div class="image-container"> <a href="{{ url_for("person", person_id=person.id) }}"> <img id="image-{{person.id}}" class="image" src="{{ url_for("static", filename=photo) }}" alt="{{ person.name}}" title="{{ person.name}}"> </a> </div> {% endfor %} </div> {% endif %} <h1>Conference archive</h1> <form action="{{ url_for("search_people") }}"> <div class="mb-3"> <label for="q" class="form-label">speaker name</label> <input type="text" class="form-control" name="q" id="q"> </div> <button type="submit" class="btn btn-primary">Search</button> </form> <h3>Speaker/conference frequency distribution</h3> <p>Distribution of speakers by conference count.</p> {% for conf_count, speaker_count in speaker_counts %} <div> {{ plural(conf_count, "conference") }}: {{ plural(speaker_count, "speaker") }} </div> {% endfor %} <h3>Top speakers</h3> <ul> {% for person, count in top_speakers %} {% if loop.first or loop.previtem[1] != count %} <h4>{{ count }} conferences</h4> {% endif %} <div class="person"> {% set photo = person.photo_filename() %} <span class="info" id="person-{{ person.id }}"> 👤 <a href="{{ url_for("person", person_id=person.id) }}">{{ person.name }}</a><br> ({{ count }} conferences, {{ person.event_count }} talks) {% if person.photo_filename() %}📷{% endif %} {% if person.wikidata_qid %} <a href="https://www.wikidata.org/wiki/{{ person.wikidata_qid }}">Wikidata</a> {% endif %} </span> {% if photo %} <img class="photo" src="{{ url_for("static", filename=photo) }}" alt="{{ person.name }}"> {% endif %} </div> {% endfor %} </div> {% endblock %} {% block script %} {% if show_images %} <script> {# var person_ids = {{ photo_person_ids | tojson }}; #} var left = {{ left | tojson }}; var right = {{ right | tojson }}; var lines = {}; window.addEventListener('load', function() { for(var i =0; i < left.length; i++) { var id = left[i]; var person = document.getElementById('person-' + id); var image = document.getElementById('image-' + id); var line = new LeaderLine(LeaderLine.mouseHoverAnchor(person, 'draw'), image); line.setOptions({startSocket: 'right', endSocket: 'left', path: 'fluid'}); var line2 = new LeaderLine(LeaderLine.mouseHoverAnchor(image, 'draw'), person); line2.setOptions({startSocket: 'left', endSocket: 'right', path: 'fluid'}); // lines[id] = line; } for(var i =0; i < right.length; i++) { var id = right[i]; var person = document.getElementById('person-' + id); var image = document.getElementById('image-' + id); var line = new LeaderLine(LeaderLine.mouseHoverAnchor(person, 'draw'), image); line.setOptions({startSocket: 'right', endSocket: 'left', path: 'fluid'}); var line2 = new LeaderLine(LeaderLine.mouseHoverAnchor(image, 'draw'), person); line2.setOptions({startSocket: 'left', endSocket: 'right', path: 'fluid'}); // lines[id] = line; } }); </script> {% endif %} {% endblock %}