letxinet-lat / fix_cite_card.py
C2MV's picture
Initial upload for Build Small Hackathon
68fb5e2 verified
Raw
History Blame Contribute Delete
6.05 kB
import re
with open("modules/research_tab.py", "r", encoding="utf-8") as f:
content = f.read()
# 1. Define the new JS snippet
FLOATING_CARD_JS = """
FLOATING_CARD_JS = '''
<script>
if (typeof window.showCiteCard !== 'function') {
window.showCiteCard = function(el, cid) {
var data = JSON.parse(el.getAttribute('data-cite').replace(/&quot;/g,'"').replace(/&#39;/g,"'"));
var card = document.getElementById('cite-card-global');
var overlay = document.getElementById('cite-card-overlay-global');
if (!card) {
overlay = document.createElement('div');
overlay.id = 'cite-card-overlay-global';
overlay.style.cssText = "display:none; position:fixed; top:0; left:0; width:100%; height:100%; z-index:999998; background:transparent;";
overlay.onclick = window.closeCiteCard;
document.body.appendChild(overlay);
card = document.createElement('div');
card.id = 'cite-card-global';
card.style.cssText = "display:none; position:fixed; z-index:999999; width:380px; max-width:90vw; padding:18px 20px; background:rgba(17,24,39,0.95); backdrop-filter:blur(20px); border:1px solid rgba(139,92,246,0.3); border-radius:16px; box-shadow:0 20px 60px rgba(0,0,0,0.5), 0 0 30px rgba(139,92,246,0.1); font-family:'Inter',sans-serif; transition:opacity 0.2s ease, transform 0.2s ease; opacity:0; transform:translateY(8px);";
card.innerHTML = '<div id="cite-card-content-global"></div>';
document.body.appendChild(card);
}
var content = document.getElementById('cite-card-content-global');
var doiHtml = data.doi ? '<a href="'+(data.doi.startsWith("http")? data.doi : "https://doi.org/"+data.doi)+'" target="_blank" style="color:#3b82f6;font-size:11px;text-decoration:none;display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:6px;background:rgba(59,130,246,0.08);border:1px solid rgba(59,130,246,0.2);">πŸ”— DOI</a>' : '';
var pdfHtml = data.pdf_url ? '<a href="'+data.pdf_url+'" target="_blank" style="color:#ef4444;font-size:11px;text-decoration:none;display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:6px;background:rgba(239,68,68,0.08);border:1px solid rgba(239,68,68,0.2);">πŸ“„ PDF</a>' : '';
var gradeHtml = data.grade ? '<span style="font-size:10px;font-weight:700;padding:2px 8px;border-radius:6px;background:rgba(16,185,129,0.1);border:1px solid rgba(16,185,129,0.3);color:#10b981;">'+data.grade+'</span>' : '';
var srcColor = {'semantic_scholar':'#f59e0b','openalex':'#3b82f6','pubmed':'#ef4444','arxiv':'#10b981','scopus':'#f97316'}[data.source?.toLowerCase()] || '#8b5cf6';
content.innerHTML = '<div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px;">' +
'<span style="font-size:10px;font-weight:600;padding:2px 8px;border-radius:10px;background:'+srcColor+'18;border:1px solid '+srcColor+'40;color:'+srcColor+';">'+(data.source||'Desconocido')+'</span>' +
'<button onclick="window.closeCiteCard()" style="background:none;border:none;color:#6b7280;cursor:pointer;font-size:16px;line-height:1;">βœ•</button>' +
'</div>' +
'<div style="font-size:13px;font-weight:600;color:#f3f4f6;line-height:1.45;margin-bottom:8px;">'+data.title+'</div>' +
'<div style="font-size:11px;color:#9ca3af;margin-bottom:6px;">'+data.authors+'</div>' +
'<div style="font-size:11px;color:#d1d5db;margin-bottom:10px;">πŸ“… '+data.year+'</div>' +
'<div style="display:flex;gap:6px;flex-wrap:wrap;align-items:center;">'+doiHtml+pdfHtml+gradeHtml+'</div>';
var rect = el.getBoundingClientRect();
var cardW = 380;
var left = rect.left + rect.width/2 - cardW/2;
if(left < 10) left = 10;
if(left + cardW > window.innerWidth - 10) left = window.innerWidth - cardW - 10;
var top = rect.bottom + 10;
if(top + 250 > window.innerHeight) top = rect.top - 260;
if(top < 10) top = 10;
card.style.left = left + 'px';
card.style.top = top + 'px';
overlay.style.display = 'block';
card.style.display = 'block';
setTimeout(function(){card.style.opacity='1';card.style.transform='translateY(0)';},10);
};
window.closeCiteCard = function() {
var card = document.getElementById('cite-card-global');
var overlay = document.getElementById('cite-card-overlay-global');
if (card) {
card.style.opacity = '0';
card.style.transform = 'translateY(8px)';
setTimeout(function(){card.style.display='none'; if(overlay) overlay.style.display='none';},200);
}
};
}
</script>
<!-- MathJax for rendering LaTeX math expressions -->
<script>
window.MathJax = {
tex: { inlineMath: [['$','$'], ['\\\\(','\\\\)']], displayMath: [['$$','$$'], ['\\\\[','\\\\]']] },
options: { skipHtmlTags: ['script','noscript','style','textarea','pre','code'] }
};
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
'''
"""
# Insert the global constant near the top after imports
if "FLOATING_CARD_JS =" not in content:
content = re.sub(r'import re\n', r'import re\n\n' + FLOATING_CARD_JS + '\n', content, count=1)
# Modify _make_citations_interactive
pattern_make_citations = re.compile(
r'floating_card_js = \'\'\'\n\s*<div id="cite-card-overlay".*?<script id="MathJax-script"[^\n]+\n\s*\'\'\'',
re.DOTALL
)
if pattern_make_citations.search(content):
content = pattern_make_citations.sub("floating_card_js = FLOATING_CARD_JS", content)
# Modify _build_references_html
if "html += FLOATING_CARD_JS" not in content:
content = content.replace("html += '</div>'\n return html", "html += '</div>'\n html += FLOATING_CARD_JS\n return html")
with open("modules/research_tab.py", "w", encoding="utf-8") as f:
f.write(content)
print("Script executed successfully.")