UNPKG

swisseph-wasm

Version:

High-precision Swiss Ephemeris WebAssembly library for astronomical calculations in JavaScript

830 lines (805 loc) 44.1 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Swiss Ephemeris API Explorer</title> <script src="https://cdn.tailwindcss.com"></script> </head> <body class="bg-gray-50 min-h-screen"> <!-- Header --> <header class="bg-white border-b border-gray-200"> <div class="container mx-auto px-4 py-6"> <div class="flex items-center justify-between"> <div> <h1 class="text-2xl font-bold text-gray-900"> Swiss Ephemeris API Explorer </h1> </div> <div class="text-right"> <div id="status" class="text-sm text-gray-500">Loading...</div> <div id="version" class="text-xs text-gray-400 mt-1"></div> </div> </div> </div> </header> <div class="container mx-auto px-4 py-6"> <div class="grid grid-cols-1 lg:grid-cols-4 gap-4"> <!-- Sidebar - Method Categories --> <div class="lg:col-span-1"> <div class="bg-white rounded border border-gray-200 p-4 sticky top-4"> <h2 class="text-sm font-semibold text-gray-900 mb-3"> Method Categories </h2> <div class="space-y-1" id="categories"> <!-- Categories will be populated by JavaScript --> </div> </div> </div> <!-- Main Content - Method Details --> <div class="lg:col-span-3"> <!-- Welcome Message --> <div id="welcome" class="bg-white rounded border border-gray-200 p-6 mb-4"> <h2 class="text-lg font-semibold text-gray-900 mb-2">API Explorer</h2> <p class="text-sm text-gray-600 mb-4"> Test all Swiss Ephemeris methods. Select a category to begin. </p> <div class="grid grid-cols-2 gap-3"> <div class="bg-gray-50 rounded p-3 border border-gray-200 text-center"> <div class="text-2xl font-bold text-gray-900">63</div> <div class="text-xs text-gray-600">Methods</div> </div> <div class="bg-gray-50 rounded p-3 border border-gray-200 text-center"> <div class="text-2xl font-bold text-gray-900">9</div> <div class="text-xs text-gray-600">Categories</div> </div> </div> </div> <!-- Method Details Container --> <div id="methodDetails" class="space-y-4"> <!-- Will be populated by JavaScript --> </div> </div> </div> </div> <script type="module"> import SwissEph from '../src/swisseph.js'; let swisseph; const statusEl = document.getElementById('status'); const versionEl = document.getElementById('version'); const categoriesEl = document.getElementById('categories'); const methodDetailsEl = document.getElementById('methodDetails'); // Method categories with examples - ALL 68 METHODS const methodCategories = { 'Date & Time (17 methods)': { methods: [ { name: 'julday', description: 'Convert calendar date to Julian Day', params: [ { name: 'year', type: 'number', default: 2000 }, { name: 'month', type: 'number', default: 1 }, { name: 'day', type: 'number', default: 1 }, { name: 'hour', type: 'number', default: 12.0 } ], example: 'swisseph.julday(2000, 1, 1, 12.0)', expectedResult: '2451545.0' }, { name: 'revjul', description: 'Convert Julian Day to calendar date', params: [ { name: 'jd', type: 'number', default: 2451545.0 }, { name: 'gregflag', type: 'number', default: 1 } ], example: 'swisseph.revjul(2451545.0, 1)', expectedResult: '{ year: 2000, month: 1, day: 1, hour: 12.0 }' }, { name: 'date_conversion', description: 'Convert date to Julian Day', params: [ { name: 'year', type: 'number', default: 2000 }, { name: 'month', type: 'number', default: 1 }, { name: 'day', type: 'number', default: 1 }, { name: 'hour', type: 'number', default: 12.0 }, { name: 'cal', type: 'text', default: 'g' } ], example: 'swisseph.date_conversion(2000, 1, 1, 12.0, "g")', expectedResult: '2451545.0' }, { name: 'utc_to_jd', description: 'Convert UTC to Julian Day', params: [ { name: 'year', type: 'number', default: 2000 }, { name: 'month', type: 'number', default: 1 }, { name: 'day', type: 'number', default: 1 }, { name: 'hour', type: 'number', default: 12 }, { name: 'min', type: 'number', default: 0 }, { name: 'sec', type: 'number', default: 0 }, { name: 'gregflag', type: 'number', default: 1 } ], example: 'swisseph.utc_to_jd(2000, 1, 1, 12, 0, 0, 1)', expectedResult: '{ julianDayET, julianDayUT }' }, { name: 'jdet_to_utc', description: 'Convert JD ET to UTC', params: [ { name: 'jd_et', type: 'number', default: 2451545.0 }, { name: 'gregflag', type: 'number', default: 1 } ], example: 'swisseph.jdet_to_utc(2451545.0, 1)', expectedResult: '{ year, month, day, hour, min, sec }' }, { name: 'jdut1_to_utc', description: 'Convert JD UT1 to UTC', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'gregflag', type: 'number', default: 1 } ], example: 'swisseph.jdut1_to_utc(2451545.0, 1)', expectedResult: '{ year, month, day, hour, min, sec }' }, { name: 'utc_time_zone', description: 'Convert UTC with timezone', params: [ { name: 'year', type: 'number', default: 2000 }, { name: 'month', type: 'number', default: 1 }, { name: 'day', type: 'number', default: 1 }, { name: 'hour', type: 'number', default: 12 }, { name: 'min', type: 'number', default: 0 }, { name: 'sec', type: 'number', default: 0 }, { name: 'timezone', type: 'number', default: 1.0 } ], example: 'swisseph.utc_time_zone(2000, 1, 1, 12, 0, 0, 1.0)', expectedResult: '{ year, month, day, hour, min, sec }' }, { name: 'deltat', description: 'Calculate Delta T (TT - UT)', params: [{ name: 'jd', type: 'number', default: 2451545.0 }], example: 'swisseph.deltat(2451545.0)', expectedResult: '~0.000739 days' }, { name: 'time_equ', description: 'Equation of time', params: [{ name: 'jd', type: 'number', default: 2451545.0 }], example: 'swisseph.time_equ(2451545.0)', expectedResult: '~-0.00228 days' }, { name: 'sidtime', description: 'Sidereal time', params: [{ name: 'jd_ut', type: 'number', default: 2451545.0 }], example: 'swisseph.sidtime(2451545.0)', expectedResult: '~18.697 hours' }, { name: 'sidtime0', description: 'Sidereal time with obliquity', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'eps', type: 'number', default: 23.44 }, { name: 'nut', type: 'number', default: 0 } ], example: 'swisseph.sidtime0(2451545.0, 23.44, 0)', expectedResult: '~18.697 hours' }, { name: 'day_of_week', description: 'Get day of week (0=Mon, 6=Sun)', params: [{ name: 'jd', type: 'number', default: 2451545.0 }], example: 'swisseph.day_of_week(2451545.0)', expectedResult: '5 (Saturday)' } ] }, 'Planetary Positions (5 methods)': { methods: [ { name: 'calc', description: 'Calculate planetary positions', params: [ { name: 'jd', type: 'number', default: 2451545.0 }, { name: 'planet', type: 'select', default: 'SE_SUN', options: ['SE_SUN', 'SE_MOON', 'SE_MERCURY', 'SE_VENUS', 'SE_MARS', 'SE_JUPITER', 'SE_SATURN'] }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH', 'SEFLG_SPEED'] } ], example: 'swisseph.calc(2451545.0, swisseph.SE_SUN, swisseph.SEFLG_SWIEPH)', expectedResult: '{ longitude: 280.37°, latitude: 0.0°, ... }' }, { name: 'calc_ut', description: 'Calculate positions (UT)', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_SUN', 'SE_MOON', 'SE_MERCURY', 'SE_VENUS', 'SE_MARS'] }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH', 'SEFLG_SPEED'] } ], example: 'swisseph.calc_ut(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH)', expectedResult: '[lon, lat, dist, ...]' }, { name: 'get_planet_name', description: 'Get planet name', params: [ { name: 'planet', type: 'select', default: 'SE_SUN', options: ['SE_SUN', 'SE_MOON', 'SE_MERCURY', 'SE_VENUS', 'SE_MARS', 'SE_JUPITER'] } ], example: 'swisseph.get_planet_name(swisseph.SE_SUN)', expectedResult: '"Sun"' }, { name: 'pheno', description: 'Planetary phenomena', params: [ { name: 'jd', type: 'number', default: 2451545.0 }, { name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_VENUS', 'SE_MARS'] }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.pheno(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH)', expectedResult: '[phase_angle, phase, elongation, ...]' }, { name: 'pheno_ut', description: 'Planetary phenomena (UT)', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_VENUS', 'SE_MARS'] }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.pheno_ut(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH)', expectedResult: '[phase_angle, phase, elongation, ...]' } ] }, 'Houses (6 methods)': { methods: [ { name: 'houses', description: 'Calculate house cusps', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'lat', type: 'number', default: 47.0 }, { name: 'lon', type: 'number', default: 8.0 }, { name: 'hsys', type: 'text', default: 'P' } ], example: 'swisseph.houses(2451545.0, 47.0, 8.0, "P")', expectedResult: '{ cusps: [...], ascmc: [...] }' }, { name: 'houses_ex', description: 'Calculate houses with flags', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }, { name: 'lat', type: 'number', default: 47.0 }, { name: 'lon', type: 'number', default: 8.0 }, { name: 'hsys', type: 'text', default: 'P' } ], example: 'swisseph.houses_ex(2451545.0, swisseph.SEFLG_SWIEPH, 47.0, 8.0, "P")', expectedResult: '{ cusps: [...], ascmc: [...] }' }, { name: 'houses_ex2', description: 'Calculate houses ex2', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }, { name: 'lat', type: 'number', default: 47.0 }, { name: 'lon', type: 'number', default: 8.0 }, { name: 'hsys', type: 'text', default: 'P' } ], example: 'swisseph.houses_ex2(2451545.0, swisseph.SEFLG_SWIEPH, 47.0, 8.0, "P")', expectedResult: '{ cusps: [...], ascmc: [...] }' }, { name: 'houses_armc', description: 'Calculate houses with ARMC', params: [ { name: 'armc', type: 'number', default: 12.0 }, { name: 'lat', type: 'number', default: 47.0 }, { name: 'eps', type: 'number', default: 23.44 }, { name: 'hsys', type: 'text', default: 'P' } ], example: 'swisseph.houses_armc(12.0, 47.0, 23.44, "P")', expectedResult: '{ cusps: [...], ascmc: [...] }' }, { name: 'houses_armc_ex2', description: 'Calculate houses ARMC ex2', params: [ { name: 'armc', type: 'number', default: 12.0 }, { name: 'lat', type: 'number', default: 47.0 }, { name: 'eps', type: 'number', default: 23.44 }, { name: 'hsys', type: 'text', default: 'P' } ], example: 'swisseph.houses_armc_ex2(12.0, 47.0, 23.44, "P")', expectedResult: '{ cusps: [...], ascmc: [...] }' }, { name: 'house_pos', description: 'Calculate house position', params: [ { name: 'armc', type: 'number', default: 12.0 }, { name: 'lat', type: 'number', default: 47.0 }, { name: 'eps', type: 'number', default: 23.44 }, { name: 'hsys', type: 'text', default: 'P' }, { name: 'lon', type: 'number', default: 100.0 }, { name: 'lat2', type: 'number', default: 0.0 } ], example: 'swisseph.house_pos(12.0, 47.0, 23.44, "P", 100.0, 0.0)', expectedResult: '~12.28' } ] }, 'Math Functions (12 methods)': { methods: [ { name: 'degnorm', description: 'Normalize degrees to 0-360', params: [{ name: 'deg', type: 'number', default: 370.0 }], example: 'swisseph.degnorm(370.0)', expectedResult: '10.0' }, { name: 'radnorm', description: 'Normalize radians to 0-2π', params: [{ name: 'rad', type: 'number', default: 6.38 }], example: 'swisseph.radnorm(6.38)', expectedResult: '~0.097' }, { name: 'rad_midp', description: 'Radian midpoint', params: [ { name: 'rad1', type: 'number', default: 0.1 }, { name: 'rad2', type: 'number', default: 6.2 } ], example: 'swisseph.rad_midp(0.1, 6.2)', expectedResult: '~0.0084' }, { name: 'deg_midp', description: 'Degree midpoint', params: [ { name: 'deg1', type: 'number', default: 10.0 }, { name: 'deg2', type: 'number', default: 350.0 } ], example: 'swisseph.deg_midp(10.0, 350.0)', expectedResult: '0.0 or 180.0' }, { name: 'split_deg', description: 'Split degrees into deg/min/sec', params: [ { name: 'deg', type: 'number', default: 123.456 }, { name: 'roundflag', type: 'select', default: 'SE_SPLIT_DEG_ROUND_SEC', options: ['SE_SPLIT_DEG_ROUND_SEC', 'SE_SPLIT_DEG_ROUND_MIN'] } ], example: 'swisseph.split_deg(123.456, swisseph.SE_SPLIT_DEG_ROUND_SEC)', expectedResult: '{ degree: 123, min: 27, second: 22 }' }, { name: 'csnorm', description: 'Normalize centiseconds', params: [{ name: 'cs', type: 'number', default: 370.0 }], example: 'swisseph.csnorm(370.0)', expectedResult: '370' }, { name: 'difcsn', description: 'Centisecond difference', params: [ { name: 'cs1', type: 'number', default: 10.0 }, { name: 'cs2', type: 'number', default: 350.0 } ], example: 'swisseph.difcsn(10.0, 350.0)', expectedResult: '129599660' }, { name: 'difdegn', description: 'Degree difference normalized', params: [ { name: 'deg1', type: 'number', default: 10.0 }, { name: 'deg2', type: 'number', default: 350.0 } ], example: 'swisseph.difdegn(10.0, 350.0)', expectedResult: '20.0' }, { name: 'difcs2n', description: 'Centisecond difference 2', params: [ { name: 'cs1', type: 'number', default: 10.0 }, { name: 'cs2', type: 'number', default: 350.0 } ], example: 'swisseph.difcs2n(10.0, 350.0)', expectedResult: '-340' }, { name: 'difdeg2n', description: 'Degree difference 2', params: [ { name: 'deg1', type: 'number', default: 10.0 }, { name: 'deg2', type: 'number', default: 350.0 } ], example: 'swisseph.difdeg2n(10.0, 350.0)', expectedResult: '20.0' }, { name: 'difrad2n', description: 'Radian difference 2', params: [ { name: 'rad1', type: 'number', default: 0.1 }, { name: 'rad2', type: 'number', default: 6.2 } ], example: 'swisseph.difrad2n(0.1, 6.2)', expectedResult: '~0.183' }, { name: 'd2l', description: 'Degrees to long', params: [{ name: 'deg', type: 'number', default: 123.456 }], example: 'swisseph.d2l(123.456)', expectedResult: '123' } ] }, 'Fixed Stars (6 methods)': { methods: [ { name: 'fixstar', description: 'Calculate fixed star position', params: [ { name: 'star', type: 'text', default: 'Sirius' }, { name: 'jd', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.fixstar("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)', expectedResult: '{ longitude, latitude, ... }' }, { name: 'fixstar_ut', description: 'Fixed star position (UT)', params: [ { name: 'star', type: 'text', default: 'Sirius' }, { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.fixstar_ut("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)', expectedResult: '{ longitude, latitude, ... }' }, { name: 'fixstar_mag', description: 'Fixed star magnitude', params: [{ name: 'star', type: 'text', default: 'Sirius' }], example: 'swisseph.fixstar_mag("Sirius")', expectedResult: '-1.46' }, { name: 'fixstar2', description: 'Fixed star position v2', params: [ { name: 'star', type: 'text', default: 'Sirius' }, { name: 'jd', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.fixstar2("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)', expectedResult: '{ longitude, latitude, ... }' }, { name: 'fixstar2_ut', description: 'Fixed star position v2 (UT)', params: [ { name: 'star', type: 'text', default: 'Sirius' }, { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.fixstar2_ut("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)', expectedResult: '{ longitude, latitude, ... }' }, { name: 'fixstar2_mag', description: 'Fixed star magnitude v2', params: [{ name: 'star', type: 'text', default: 'Sirius' }], example: 'swisseph.fixstar2_mag("Sirius")', expectedResult: '-1.46' } ] }, 'Ayanamsa (5 methods)': { methods: [ { name: 'get_ayanamsa', description: 'Get ayanamsa value', params: [{ name: 'jd_et', type: 'number', default: 2451545.0 }], example: 'swisseph.set_sid_mode(swisseph.SE_SIDM_LAHIRI, 0, 0); swisseph.get_ayanamsa(2451545.0)', expectedResult: '~23.857°' }, { name: 'get_ayanamsa_ut', description: 'Get ayanamsa (UT)', params: [{ name: 'jd_ut', type: 'number', default: 2451545.0 }], example: 'swisseph.get_ayanamsa_ut(2451545.0)', expectedResult: '~23.857°' }, { name: 'get_ayanamsa_ex', description: 'Get ayanamsa extended', params: [ { name: 'jd_et', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.get_ayanamsa_ex(2451545.0, swisseph.SEFLG_SWIEPH)', expectedResult: '~23.857°' }, { name: 'get_ayanamsa_ex_ut', description: 'Get ayanamsa extended (UT)', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] } ], example: 'swisseph.get_ayanamsa_ex_ut(2451545.0, swisseph.SEFLG_SWIEPH)', expectedResult: '~23.857°' }, { name: 'get_ayanamsa_name', description: 'Get ayanamsa name', params: [ { name: 'sid_mode', type: 'select', default: 'SE_SIDM_LAHIRI', options: ['SE_SIDM_LAHIRI', 'SE_SIDM_FAGAN_BRADLEY'] } ], example: 'swisseph.get_ayanamsa_name(swisseph.SE_SIDM_LAHIRI)', expectedResult: '"Lahiri"' } ] }, 'Utilities (10 methods)': { methods: [ { name: 'version', description: 'Get Swiss Ephemeris version', params: [], example: 'swisseph.version()', expectedResult: '"2.10.03"' }, { name: 'cs2timestr', description: 'Centiseconds to time string', params: [ { name: 'cs', type: 'number', default: 4500000 }, { name: 'sep', type: 'text', default: ' ' }, { name: 'suppressZero', type: 'select', default: 'true', options: ['true', 'false'] } ], example: 'swisseph.cs2timestr(4500000, " ", true)', expectedResult: '"12 30"' }, { name: 'cs2lonlatstr', description: 'Centiseconds to lon/lat string', params: [ { name: 'cs', type: 'number', default: 44444160 }, { name: 'pchar', type: 'text', default: 'E' }, { name: 'mchar', type: 'text', default: 'W' } ], example: 'swisseph.cs2lonlatstr(44444160, "E", "W")', expectedResult: '"123E27\'22"' }, { name: 'cs2degstr', description: 'Centiseconds to degree string (mod 30)', params: [{ name: 'cs', type: 'number', default: 44444160 }], example: 'swisseph.cs2degstr(44444160)', expectedResult: '" 3°27\'21"' }, { name: 'azalt', description: 'Calculate azimuth/altitude', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'calc_flag', type: 'select', default: 'SE_EQU2HOR', options: ['SE_EQU2HOR'] }, { name: 'geopos', type: 'text', default: '8,47,400' }, { name: 'atpress', type: 'number', default: 1013.25 }, { name: 'attemp', type: 'number', default: 15.0 }, { name: 'xin', type: 'text', default: '100,10,1' } ], example: 'swisseph.azalt(2451545.0, swisseph.SE_EQU2HOR, [8,47,400], 1013.25, 15.0, [100,10,1])', expectedResult: '{ azimuth, altitude, ... }' }, { name: 'azalt_rev', description: 'Reverse azimuth/altitude', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'calc_flag', type: 'select', default: 'SE_HOR2EQU', options: ['SE_HOR2EQU'] }, { name: 'geopos', type: 'text', default: '8,47,400' }, { name: 'xin', type: 'text', default: '180,45,1' } ], example: 'swisseph.azalt_rev(2451545.0, swisseph.SE_HOR2EQU, [8,47,400], [180,45,1])', expectedResult: '{ ra, dec, ... }' }, { name: 'cotrans', description: 'Coordinate transformation', params: [ { name: 'xpo', type: 'text', default: '100,10,1' }, { name: 'eps', type: 'number', default: 23.44 } ], example: 'swisseph.cotrans([100,10,1], 23.44)', expectedResult: '[x, y, z]' }, { name: 'cotrans_sp', description: 'Coordinate transformation with speed', params: [ { name: 'xpo', type: 'text', default: '100,10,1,0,0,0' }, { name: 'eps', type: 'number', default: 23.44 } ], example: 'swisseph.cotrans_sp([100,10,1,0,0,0], 23.44)', expectedResult: '[x, y, z, dx, dy, dz]' }, { name: 'get_tid_acc', description: 'Get tidal acceleration', params: [], example: 'swisseph.get_tid_acc()', expectedResult: '-25.8' }, { name: 'set_tid_acc', description: 'Set tidal acceleration', params: [{ name: 'acc', type: 'number', default: 0.0 }], example: 'swisseph.set_tid_acc(0.0)', expectedResult: 'void' } ] }, 'Nodes & Apsides (2 methods)': { methods: [ { name: 'nod_aps', description: 'Calculate nodes and apsides', params: [ { name: 'jd_et', type: 'number', default: 2451545.0 }, { name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_MERCURY', 'SE_VENUS'] }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }, { name: 'method', type: 'number', default: 0 } ], example: 'swisseph.nod_aps(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH, 0)', expectedResult: '{ asc_node, desc_node, perihelion, aphelion }' }, { name: 'nod_aps_ut', description: 'Nodes and apsides (UT)', params: [ { name: 'jd_ut', type: 'number', default: 2451545.0 }, { name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_MERCURY', 'SE_VENUS'] }, { name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }, { name: 'method', type: 'number', default: 0 } ], example: 'swisseph.nod_aps_ut(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH, 0)', expectedResult: '{ asc_node, desc_node, perihelion, aphelion }' } ] } }; // Initialize async function init() { try { statusEl.textContent = 'Initializing...'; swisseph = new SwissEph(); await swisseph.initSwissEph(); const version = swisseph.version(); versionEl.textContent = `Swiss Ephemeris v${version}`; statusEl.textContent = 'Ready'; statusEl.classList.add('text-green-600', 'font-medium'); renderCategories(); } catch (error) { statusEl.textContent = 'Error: ' + error.message; statusEl.classList.add('text-red-600'); } } function renderCategories() { categoriesEl.innerHTML = Object.entries(methodCategories).map(([category, data]) => ` <button onclick="showCategory('${category}')" class="w-full text-left px-3 py-2 rounded bg-white hover:bg-blue-50 transition-all border border-gray-200 hover:border-blue-400 group text-sm"> <div class="flex items-center justify-between"> <div> <div class="font-medium text-gray-900">${category}</div> <div class="text-xs text-gray-500">${data.methods.length} methods</div> </div> <svg class="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path> </svg> </div> </button> `).join(''); } window.showCategory = function(category) { const data = methodCategories[category]; document.getElementById('welcome').style.display = 'none'; methodDetailsEl.innerHTML = ` <div class="bg-white rounded border border-gray-200 p-4 mb-4"> <h2 class="text-lg font-semibold text-gray-900">${category}</h2> <p class="text-sm text-gray-600">${data.methods.length} methods</p> </div> ${data.methods.map((method, idx) => ` <div class="bg-white rounded border border-gray-200 p-4 mb-4"> <div class="flex items-start justify-between mb-3"> <div class="flex-1"> <h3 class="text-base font-semibold text-blue-600">${method.name}()</h3> <p class="text-sm text-gray-600 mt-1">${method.description}</p> </div> <button onclick="runMethod('${category}', ${idx})" class="ml-3 px-3 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 transition-all text-sm font-medium"> Run </button> </div> ${method.params.length > 0 ? ` <div class="space-y-2 mb-3"> ${method.params.map((param, pidx) => ` <div class="grid grid-cols-4 gap-2 items-center text-sm"> <label class="text-gray-700 font-medium">${param.name}:</label> ${param.type === 'select' ? ` <select id="${method.name}_${pidx}" class="col-span-3 bg-white border border-gray-300 rounded px-2 py-1 text-gray-900 text-sm"> ${param.options.map(opt => `<option value="${opt}" ${opt === param.default ? 'selected' : ''}>${opt}</option>`).join('')} </select> ` : ` <input type="${param.type}" id="${method.name}_${pidx}" value="${param.default}" class="col-span-3 bg-white border border-gray-300 rounded px-2 py-1 text-gray-900 text-sm"> `} </div> `).join('')} </div> ` : ''} <details class="mb-2"> <summary class="cursor-pointer text-xs text-gray-600 hover:text-gray-900 font-medium">Show Example</summary> <div class="bg-gray-50 rounded p-2 mt-2 border border-gray-200"> <code class="text-xs text-gray-900 block">${method.example}</code> <div class="text-xs text-gray-500 mt-1">Expected: <code>${method.expectedResult}</code></div> </div> </details> <div id="result_${method.name}" class="hidden bg-green-50 rounded p-3 border border-green-200 mt-2"> <div class="text-xs text-gray-600 font-medium mb-1">Result:</div> <pre class="text-xs text-gray-900 overflow-x-auto"></pre> </div> </div> `).join('')} `; }; window.runMethod = function(category, methodIdx) { const method = methodCategories[category].methods[methodIdx]; const resultEl = document.getElementById(`result_${method.name}`); try { // Get parameter values const params = method.params.map((param, idx) => { const input = document.getElementById(`${method.name}_${idx}`); let value = input.value; if (param.type === 'number') { value = parseFloat(value); } else if (param.type === 'select' && value.startsWith('SE')) { value = swisseph[value]; } else if (param.type === 'text' && value.includes(',')) { // Parse "1,2,3" into [1, 2, 3] value = value.split(',').map(v => parseFloat(v.trim())); } return value; }); // Call the method const result = swisseph[method.name](...params); // Display result resultEl.classList.remove('hidden'); resultEl.querySelector('pre').textContent = JSON.stringify(result, null, 2); } catch (error) { resultEl.classList.remove('hidden'); resultEl.classList.add('from-red-500/20', 'to-orange-500/20', 'border-red-500/30'); resultEl.querySelector('pre').textContent = 'Error: ' + error.message; } }; init(); </script> </body> </html>