"""Common SI constants, portable data access and bounded display tables."""
from pathlib import Path
import json,html
ROOT=Path(__file__).resolve().parents[1]
H=6.62607015e-34
C=299792458.0
PHOTON_ENERGY_337=H*C/(337.1e-9)
PHOTON_ENERGY_777=H*C/(777.4e-9)
R_PHOTONS_PER_R_M2_SR_S=1e10/(4*3.141592653589793)
def load_data(name):
    return json.loads((ROOT/'data'/name).read_text(encoding='utf-8-sig'))
def table(rows,columns=None,max_rows=12):
    from IPython.display import HTML,display
    rows=list(rows);cols=columns or (list(rows[0]) if rows else [])
    def fmt(v):
        if isinstance(v,float):return f'{v:.8g}'
        if isinstance(v,(dict,list,tuple)):return json.dumps(v,ensure_ascii=False)
        return str(v)
    head='<tr>'+''.join('<th>'+html.escape(k)+'</th>' for k in cols)+'</tr>'
    body=''.join('<tr>'+''.join('<td>'+html.escape(fmt(row.get(k,'')))+'</td>' for k in cols)+'</tr>' for row in rows[:max_rows])
    display(HTML('<div style="overflow:auto"><table>'+head+body+'</table></div><p>'+str(len(rows))+' rows total; '+str(min(len(rows),max_rows))+' shown.</p>'))
