PageSourceSearch

https://www.takeuchi-japan.com/stock-ticker/_sw_base.js

js takeuchi-japan.com collected 2026-10-09 21:53:16 UTC 31,035 bytes, 715 lines download raw bytes

1// 言語, 免責
2let lang, disclaimer, globalDrawFinish;
3
4const today = new Date();
5
6// プロダクトキー取得
7const product = document.querySelector('#sw-stock-board');
8
9// データ取得URL
10const data_url = new URL(product.dataset.swDeliverableOrigin + '/board/json?product=' + product.dataset.swProductKey + '&panel=' + product.dataset.swDownloadPanelKey);
11
12async function fetchData(url) {
13    try {
14        const data = await fetch(url).then(response => response.json());
15        if (data && Object.keys(data).length > 0) {
16            return data;
17        } else {
18            console.error("取得したデータが無効です");
19        }
20    } catch (error) {
21        console.error("データの取得に失敗しました:", error);
22    }
23}
24
25// コーポレートカラー背景色透過(hex → rgba に変換)
26function hexToRGBA(hex, alpha) {
27    const r = parseInt(hex.slice(1, 3), 16);
28    const g = parseInt(hex.slice(3, 5), 16);
29    const b = parseInt(hex.slice(5, 7), 16);
30    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
31}
32
33// 免責事項生成
34function generateDisclaimer(disclaimerData) {
35    const fragment = document.createDocumentFragment();
36    
37    // 言語ごとにデータを処理
38    Object.keys(disclaimerData).forEach(lang => {
39        const textArray = disclaimerData[lang];
40        
41        // データがある場合のみ処理
42        if (textArray && textArray.length) {
43            textArray.forEach(text => {
44                // 改行コードを<br>タグに置き換え
45                const formattedText = text.replace(/\r\n/g, '<br>');
46
47                // pタグを生成して内容を挿入
48                const p = document.createElement('p');
49                p.setAttribute('data-sw-lang-txt', lang);
50                p.setAttribute('data-sw-txt-hide', '');
51                p.innerHTML = formattedText;
52                
53                fragment.appendChild(p);
54            });
55        }
56    });
57
58    return fragment;
59}
60
61// 生成したHTMLを挿入
62function insertGeneratedHTML(disclaimerData) {
63    // ---免責事項pタグ
64    const generatedDisclaimerHTML = generateDisclaimer(disclaimerData);
65    const disclaimerContainer = document.querySelector('.sw-disclaimer');
66    if (generatedDisclaimerHTML && disclaimerContainer) {// 生成されている場合&sw-disclaimerがある場合のみ挿入
67        disclaimerContainer.appendChild(generatedDisclaimerHTML);
68    }
69}
70
71// 選択言語に応じて data-sw-txt-hide="on" 追加
72function setLangOption() {
73    const dataNameTxt = document.querySelectorAll('[data-sw-lang-txt]');
74    for (let i = 0; i < dataNameTxt.length; i++) {
75        let dataNameTxtLng = dataNameTxt[i].dataset.swLangTxt;
76        if (lang === 'ja') {
77            dataNameTxt[i].dataset.swTxtHide = (dataNameTxtLng === "ja" ? '' : 'on');
78        } else {
79            dataNameTxt[i].dataset.swTxtHide = (dataNameTxtLng === "en" ? '' : 'on');
80        }
81    }
82}
83
84// 株価情報表示
85function StockPrice(data) {
86    const formatNumber = (value, minDigits, maxDigits) => 
87        value !== null ? Number(value).toLocaleString(undefined, { minimumFractionDigits: minDigits, maximumFractionDigits: maxDigits }) : null;
88    
89    const formatDate = (date) => 
90        // date !== null ? new Date(date) : null;
91        date !== null ? new Date(date).toLocaleString() : null;
92    
93    const stockData = {
94        code: data.Code,
95        exchange: data.Exchange,
96        market: data.Market,
97        stockPrice: data.StockPrice,
98        tradeDate: formatDate(data.TradeDate),
99        price: formatNumber(data.Price,1,1),
100        change: formatNumber(data.Change,1,1),
101        changeRatio: formatNumber(data.ChangeRatio,2,2),
102        open: formatNumber(data.Open,1,1),
103        openTime: formatDate(data.OpenTime),
104        high: formatNumber(data.High,1,1),
105        highTime: formatDate(data.HighTime),
106        low: formatNumber(data.Low,1,1),
107        lowTime: formatDate(data.LowTime),
108        volume: formatNumber(data.Volume,0,0),
109        volumeTime: formatDate(data.VolumeTime),
110        closing: formatNumber(data.Closing,1,1),
111        closingDate: formatDate(data.ClosingDate),
112        salesProceeds: formatNumber(data.SalesProceeds,1,1),
113        numberOfContracts: formatNumber(data.NumberOfContracts,0,0),
114        yearToDateHigh: formatNumber(data.YearToDateHigh,1,1),
115        yearToDateHighDate: formatDate(data.YearToDateHighDate),
116        yearToDateLow: formatNumber(data.YearToDateLow,1,1),
117        yearToDateLowDate: formatDate(data.YearToDateLowDate),
118        basePrice: formatNumber(data.BasePrice,1,1),
119        basePriceDate: formatDate(data.BasePriceDate),
120        dividend: formatNumber(data.Dividend,1,1),
121        dividendDate: formatDate(data.DividendDate),
122        dividendRatio: formatNumber(data.DividendRatio,1,1),
123        dividendRatioDate: formatDate(data.DividendRatioDate),
124        dividendYield: formatNumber(data.DividendYield,1,1),
125        dividendYieldDate: formatDate(data.DividendYieldDate),
126        expectedDividend: formatNumber(data.ExpectedDividend,1,1),
127        expectedDividendDate: formatDate(data.ExpectedDividendDate),
128        expectedDividendRatio: formatNumber(data.ExpectedDividendRatio,1,1),
129        expectedDividendRatioDate: formatDate(data.ExpectedDividendRatioDate),
130        expectedDividendYield: formatNumber(data.ExpectedDividendYield,1,1),
131        expectedDividendYieldDate: formatDate(data.ExpectedDividendYieldDate),
132        epsActual: formatNumber(data.EpsActual,1,1),
133        epsActualDate: formatDate(data.EpsActualDate),
134        epsForecast: formatNumber(data.EpsForecast,1,1),
135        epsForecastDate: formatDate(data.EpsForecastDate),
136        bpsActual: formatNumber(data.BpsActual,1,1),
137        bpsActualDate: formatDate(data.BpsActualDate),
138        perForecast: formatNumber(data.PerForecast,1,1),
139        perForecastDate: formatDate(data.PerForecastDate),
140        perActual: formatNumber(data.PerActual,1,1),
141        perActualDate: formatDate(data.PerActualDate),
142        pbrActual: formatNumber(data.PbrActual,1,1),
143        pbrActualDate: formatDate(data.PbrActualDate),
144        psrForecast: formatNumber(data.PsrForecast,1,1),
145        psrForecastDate: formatDate(data.PsrForecastDate),
146        psrActual: formatNumber(data.PsrActual,1,1),
147        psrActualDate: formatDate(data.PsrActualDate),
148        roaActual: formatNumber(data.RoaActual,1,1),
149        roaActualDate: formatDate(data.RoaActualDate),
150        roeActual: formatNumber(data.RoeActual,1,1),
151        roeActualDate: formatDate(data.RoeActualDate),
152        roicActual: formatNumber(data.RoicActual,1,1),
153        roicActualDate: formatDate(data.RoicActualDate),
154        roaForecast: formatNumber(data.RoaForecast,1,1),
155        roaForecastDate: formatDate(data.RoaForecastDate),
156        roeForecast: formatNumber(data.RoeForecast,1,1),
157        roeForecastDate: formatDate(data.RoeForecastDate),
158        roicForecast: formatNumber(data.RoicForecast,1,1),
159        roicForecastDate: formatDate(data.RoicForecastDate),
160        ebitda: formatNumber(data.Ebitda,1,1),
161        ebitdaDate: formatDate(data.EbitdaDate),
162        doe: formatNumber(data.Doe,1,1),
163        doeDate: formatDate(data.DoeDate),
164        equityRatio: formatNumber(data.EquityRatio,1,1),
165        equityRatioDate: formatDate(data.EquityRatioDate),
166        totalAssets: formatNumber(data.TotalAssets,0,0),
167        totalAssetsDate: formatDate(data.TotalAssetsDate),
168        netWorthActual: formatNumber(data.NetWorthActual,0,0),
169        netWorthActualDate: formatDate(data.NetWorthActualDate),
170        marketCap: formatNumber(data.MarketCap,2,2),
171        marketCapDate: formatDate(data.MarketCapDate),
172        sharesOutstanding: formatNumber(data.SharesOutstanding,0,0),
173        sharesOutstandingDate: formatDate(data.SharesOutstandingDate),
174        treasuryStock: formatNumber(data.TreasuryStock,0,0),
175        treasuryStockDate: formatDate(data.TreasuryStockDate),
176        sales: formatNumber(data.Sales,0,0),
177        salesDate: formatDate(data.SalesDate),
178        operatingProfit: formatNumber(data.OperatingProfit,0,0),
179        operatingProfitDate: formatDate(data.OperatingProfitDate),
180        ordinaryProfit: formatNumber(data.OrdinaryProfit,0,0),
181        ordinaryProfitDate: formatDate(data.OrdinaryProfitDate),
182        netProfit: formatNumber(data.NetProfit,0,0),
183        netProfitDate: formatDate(data.NetProfitDate),
184        netProfitParent: formatNumber(data.NetProfitParent,0,0),
185        netProfitParentDate: formatDate(data.NetProfitParentDate),
186        operatingProfitRatio: formatNumber(data.OperatingProfitRatio,1,1),
187        operatingProfitRatioDate: formatDate(data.OperatingProfitRatioDate),
188        ordinaryProfitRatio: formatNumber(data.OrdinaryProfitRatio,1,1),
189        ordinaryProfitRatioDate: formatDate(data.OrdinaryProfitRatioDate),
190        netProfitRatio: formatNumber(data.NetProfitRatio,1,1),
191        netProfitRatioDate: formatDate(data.NetProfitRatioDate),
192        netProfitParentRatio: formatNumber(data.NetProfitParentRatio,1,1),
193        netProfitParentRatioDate: formatDate(data.NetProfitParentRatioDate),
194        salesForecast: formatNumber(data.SalesForecast,0,0),
195        salesForecastDate: formatDate(data.SalesForecastDate),
196        operatingProfitForecast: formatNumber(data.OperatingProfitForecast,0,0),
197        operatingProfitForecastDate: formatDate(data.OperatingProfitForecastDate),
198        ordinaryProfitForecast: formatNumber(data.OrdinaryProfitForecast,0,0),
199        ordinaryProfitForecastDate: formatDate(data.OrdinaryProfitForecastDate),
200        netProfitForecast: formatNumber(data.NetProfitForecast,0,0),
201        netProfitForecastDate: formatDate(data.NetProfitForecastDate),
202        netProfitParentForecast: formatNumber(data.NetProfitParentForecast,0,0),
203        netProfitParentForecastDate: formatDate(data.NetProfitParentForecastDate),
204        operatingProfitRatioForecast: formatNumber(data.OperatingProfitRatioForecast,1,1),
205        operatingProfitRatioForecastDate: formatDate(data.OperatingProfitRatioForecastDate),
206        ordinaryProfitRatioForecast: formatNumber(data.OrdinaryProfitRatioForecast,1,1),
207        ordinaryProfitRatioForecastDate: formatDate(data.OrdinaryProfitRatioForecastDate),
208        netProfitRatioForecast: formatNumber(data.NetProfitRatioForecast,1,1),
209        netProfitRatioForecastDate: formatDate(data.NetProfitRatioForecastDate),
210        netProfitParentRatioForecast: formatNumber(data.NetProfitParentRatioForecast,1,1),
211        netProfitParentRatioForecastDate: formatDate(data.NetProfitParentRatioForecastDate),
212        sharesUnitNumber: formatNumber(data.SharesUnitNumber,0,0),
213        minimumPurchasePrice: formatNumber(data.MinimumPurchasePrice,1,1),
214        sellingPrice: formatNumber(data.SellingPrice,1,1),
215        sellingPriceTime: formatDate(data.SellingPriceTime),
216        buyingSpree: formatNumber(data.BuyingSpree,1,1),
217        buyingSpreeTime: formatDate(data.BuyingSpreeTime),
218        nikkei225: data.Nikkei225,
219        fiscalYearEnd: data.FiscalYearEnd,
220        quarterType: data.QuarterType
221    };
222
223    const { tradeDate } = stockData; // 取引日時
224    const { closingDate } = stockData; // 終値日時
225    const { stockPrice } = stockData; // データ更新タイミング
226
227    // 予想用決算期整形
228    function formatCustomFiscalYearEnd(fiscalYearEnd, quarterType) {
229        if (!fiscalYearEnd || isNaN(fiscalYearEnd)) {
230            return null; // 無効な場合は null
231        }
232        if (quarterType === 'FY') {
233            fiscalYearEnd = parseInt(fiscalYearEnd, 10) + 100;
234        }
235        fiscalYearEnd = today.getFullYear().toString().slice(0, 2) + fiscalYearEnd;
236        return fiscalYearEnd;
237    }
238    const { fiscalYearEnd, quarterType } = stockData;
239    const customFiscalYearEnd = formatCustomFiscalYearEnd(fiscalYearEnd, quarterType);
240    
241    // 前日比率に()をつける場合:spanタグ生成
242    const spanTag = document.createElement('span');
243
244    // 前日比・前日比率整形
245    function formatDataIncreaseDecrease(value) {
246        let formattedValue;
247
248        // +ー の場合
249        formattedValue = Math.sign(value) > 0 ? `+${value}` : value;
250        
251        // ↑↓ の場合
252        // if (value === 0) {
253        //     formattedValue = value; // 値が 0 の場合、そのまま出力
254        // } else if (value > 0) {
255        //     formattedValue = `<span class="sw-arrow-up"></span>${value}`; // 正の値の場合
256        // } else {
257        //     formattedValue = `<span class="sw-arrow-down"></span>${Math.abs(value)}`; // 負の値の場合
258        // }
259
260        return formattedValue;
261    }
262
263    // 英語判定
264    //const isEnglish = lang === 'en';
265    /**** SR added! Custom language detection. Needed for tradeDate ****/
266    const tradeDateLanguage = document.querySelector('[data-sw-id-name="tradeDate"]').getAttribute('data-sr-lang-txt');
267    const isEnglish = tradeDateLanguage === 'en';
268
269    // 日付整形
270    function formatCustomDate(dateInput, dataNameId, fiscalYearEnd) {
271        if (!dateInput || dateInput === '-') return '-';
272        const date = new Date(dateInput);
273
274        // 日付パーツ取得
275        const year = date.getFullYear();
276        const month = String(date.getMonth() + 1).padStart(2,'0');
277        const day = String(date.getDate()).padStart(2,'0');
278        const hours = String(date.getHours()).padStart(2,'0');
279        const minutes = String(date.getMinutes()).padStart(2,'0');
280
281        const monthEn = date.toLocaleString('en-US',{month:'short'});
282        const weekdayEn = date.toLocaleString('en-US',{weekday:'short'});
283
284        const dayNamesJa = ['日','月','火','水','木','金','土'];
285        const weekdayJa = dayNamesJa[date.getDay()];
286
287        // 秒整形
288        const stripSeconds = d => {
289            const t = new Date(d);
290            t.setSeconds(0,0);
291            return +t;
292        };
293        const tradeTrim = stripSeconds(tradeDate);
294        const closeTrim = stripSeconds(closingDate);
295        const dateTrim = stripSeconds(date);
296
297        // 予想・実績のデータ更新日付処理
298        const targetDate = [
299            'expectedDividendDate','dividendDate',
300            'expectedDividendYieldDate','dividendYieldDate',
301            'epsForecastDate','epsActualDate','bpsActualDate',
302            'perForecastDate','perActualDate','pbrActualDate',
303            'roeForecastDate','roeActualDate',
304            'roaForecastDate','roaActualDate',
305            'roicForecastDate','roicActualDate',
306            'marketCapDate','sharesOutstandingDate','treasuryStockDate'
307        ];
308
309        if (targetDate.includes(dataNameId)) {
310
311            if (dateTrim === tradeTrim || dateTrim === closeTrim) {
312                return null;
313            }
314
315            if (/[eE]xpected|[fF]orecast/.test(dataNameId)) {
316
317                const FYyear = fiscalYearEnd.slice(0,4);
318                const FYmonth = fiscalYearEnd.slice(-2);
319
320                return isEnglish
321                    ? `${FYyear}.${FYmonth}(${year}.${month}.${day} JTS)`
322                    : `${FYyear}/${FYmonth}(${year}/${month}/${day}時点)`;
323            }
324        }
325
326        // 表示タイプ分類
327        const dateTypeMap = {
328            tradeDate: 'fullDateWithTime',
329            closingDate: 'fullDateWithTime',
330            yearToDateHighDate: 'fullDate',
331            yearToDateLowDate: 'fullDate',
332            basePriceDate: 'fullDate',
333            dividendDate: 'monthYearWithText',// **実績
334            dividendRatioDate: 'monthYear',
335            dividendYieldDate: 'monthYearWithText',// **実績
336            expectedDividendDate: 'monthYear',// **予想
337            expectedDividendRatioDate: 'monthYear',
338            expectedDividendYieldDate: 'monthYear',// **予想
339            epsActualDate: 'monthYearWithText',// **実績
340            epsForecastDate: 'monthYear',// **予想
341            bpsActualDate: 'monthYearWithText',// **実績
342            perForecastDate: 'monthYear',// **予想
343            perActualDate: 'monthYearWithText',// **実績
344            pbrActualDate: 'monthYearWithText',// **実績
345            psrForecastDate: 'monthYear',
346            psrActualDate: 'monthYear',
347            roaActualDate: 'monthYearWithText',// **実績
348            roeActualDate: 'monthYearWithText',// **実績
349            roicActualDate: 'monthYearWithText',// **実績
350            roaForecastDate: 'monthYear',// **予想
351            roeForecastDate: 'monthYear',// **予想
352            roicForecastDate: 'monthYear',// **予想
353            ebitdaDate: 'monthYear',
354            doeDate: 'monthYear',
355            equityRatioDate: 'monthYear',
356            totalAssetsDate: 'monthYear',
357            netWorthActualDate: 'monthYear',
358            marketCapDate: 'monthYearWithText',// *実績と同様
359            sharesOutstandingDate: 'monthYearWithText',// *実績と同様
360            treasuryStockDate: 'monthYearWithText',// *実績と同様
361            salesDate: 'monthYear',
362            operatingProfitDate: 'monthYear',
363            ordinaryProfitDate: 'monthYear',
364            netProfitDate: 'monthYear',
365            netProfitParentDate: 'monthYear',
366            operatingProfitRatioDate: 'monthYear',
367            ordinaryProfitRatioDate: 'monthYear',
368            netProfitRatioDate: 'monthYear',
369            netProfitParentRatioDate: 'monthYear',
370            salesForecastDate: 'monthYear',
371            operatingProfitForecastDate: 'monthYear',
372            ordinaryProfitForecastDate: 'monthYear',
373            netProfitForecastDate: 'monthYear',
374            netProfitParentForecastDate: 'monthYear',
375            operatingProfitRatioForecastDate: 'monthYear',
376            ordinaryProfitRatioForecastDate: 'monthYear',
377            netProfitRatioForecastDate: 'monthYear',
378            netProfitParentRatioForecastDate: 'monthYear',
379            volumeTime: 'time',
380            openTime: 'time',
381            highTime: 'time',
382            lowTime: 'time',
383            sellingPriceTime: 'time',
384            buyingSpreeTime: 'time',
385        };
386
387        const type = dateTypeMap[dataNameId];
388
389        // 出力
390        switch(type){
391
392            case 'fullDateWithDay':
393                return isEnglish
394                    ? `${weekdayEn}, ${monthEn}. ${day}, ${year} ${hours}:${minutes} JST`
395                    : `${year}/${month}/${day}(${weekdayJa}) ${hours}:${minutes}`;
396
397            case 'fullDateWithTime':
398                return isEnglish
399                    ? `${monthEn}. ${day}, ${year} ${hours}:${minutes} JST`
400                    : `${year}/${month}/${day} ${hours}:${minutes}`;
401
402            case 'fullDate':
403                return isEnglish
404                    ? `${month}.${day}.${year}`
405                    : `${year}/${month}/${day}`;
406
407            case 'fullDateWithText':
408                return isEnglish
409                    ? `${month}.${day}.${year}`
410                    : `${year}/${month}/${day}時点`;
411
412            case 'monthYear':
413                return isEnglish
414                    ? `${month}.${year}`
415                    : `${year}/${month}`;
416
417            case 'monthYearWithText':
418                return isEnglish
419                    ? `${month}.${year}`
420                    : `${year}/${month}時点`;
421
422            case 'time':
423                return `${hours}:${minutes}`;
424
425            default:
426                return '-';
427        }
428    }
429
430    // HTML要素にデータをセット
431    function setDataToElement(dataNameId, value, isChangeRatio = false, stockPriceObj = {}) {
432        const dataNameUnit = document.querySelector(`[data-sw-id-name="${dataNameId}"]`);
433        if (dataNameUnit) {
434            dataNameUnit.innerHTML = value;
435
436            // 前日比率に()をつける場合:spanタグ追加
437            if (isChangeRatio) {
438                dataNameUnit.appendChild(spanTag);
439            }
440
441            // "price" かつ stockPrice が "終値" の場合に dt を書き換え
442            if (dataNameId === "price" && stockPriceObj?.stockPrice === "終値") {
443                const dtElement = dataNameUnit.closest("dl")?.querySelector("dt");
444                if (dtElement) {
445                    const jaSpan = dtElement.querySelector('[data-sw-lang-txt="ja"]');
446                    const enSpan = dtElement.querySelector('[data-sw-lang-txt="en"]');
447                    if (jaSpan) jaSpan.textContent = "終値";
448                    if (enSpan) enSpan.textContent = "Close";
449                }
450            }
451        }
452    }
453
454    // ループでデータを適用
455    const dataName = document.querySelectorAll('[data-sw-id-name]');
456
457    // --日付処理群
458    const dateFields = new Set([
459        'tradeDate', 'closingDate', 'yearToDateHighDate', 'yearToDateLowDate', 'basePriceDate',
460        'dividendDate', 'dividendRatioDate', 'dividendYieldDate', 
461        'expectedDividendDate', 'expectedDividendRatioDate', 'expectedDividendYieldDate', 
462        'epsActualDate', 'epsForecastDate', 'bpsActualDate', 
463        'perForecastDate', 'perActualDate', 'pbrActualDate', 'psrForecastDate', 'psrActualDate', 
464        'roaActualDate', 'roeActualDate', 'roicActualDate', 
465        'roaForecastDate', 'roeForecastDate', 'roicForecastDate', 
466        'ebitdaDate', 'doeDate', 
467        'equityRatioDate', 'totalAssetsDate', 'netWorthActualDate', 
468        'marketCapDate', 'sharesOutstandingDate', 'treasuryStockDate', 
469        'salesDate', 'operatingProfitDate', 'ordinaryProfitDate', 'netProfitDate', 'netProfitParentDate', 
470        'operatingProfitRatioDate', 'ordinaryProfitRatioDate', 'netProfitRatioDate', 'netProfitParentRatioDate', 
471        'salesForecastDate', 'operatingProfitForecastDate', 'ordinaryProfitForecastDate', 'netProfitForecastDate', 'netProfitParentForecastDate', 
472        'operatingProfitRatioForecastDate', 'ordinaryProfitRatioForecastDate', 'netProfitRatioForecastDate', 'netProfitParentRatioForecastDate'
473    ]);
474
475    // --時間処理群
476    const timeFields = new Set([
477        'openTime', 'highTime', 'lowTime', 'volumeTime',
478        'sellingPriceTime', 'buyingSpreeTime'
479    ]);
480
481    // --個別処理群
482    const fieldHandlers = {
483        price: (id, val) => {// 現値(または)終値
484            const formatted = val.replace(/(\.\S)/g, "<span>$&</span>");
485            setDataToElement(id, formatted, false, { stockPrice });
486        },
487        change: (id, val) => {
488            setDataToElement(id, formatDataIncreaseDecrease(val));
489        },
490        changeRatio: (id, val) => {
491            setDataToElement(id, formatDataIncreaseDecrease(val), true);
492        },
493        code: (id, val) => {
494            val = isEnglish ? val + ' JPY' : val;
495            setDataToElement(id, val);
496        },
497        market: (id, val) => {// 市場
498            if (isEnglish) {
499                if (val === '東証プライム') {
500                    val = 'TSE Prime';
501                } else if (val === '東証スタンダード') {
502                    val = 'TSE Standard';
503                } else if (val === '東証グロース') {
504                    val = 'TSE Growth';
505                } else if (val === '札証') {
506                    val = 'Sapporo';
507                } else if (val === '福証') {
508                    val = 'Fukuoka';
509                }
510            }
511            setDataToElement(id, val);
512        },
513        stockPrice: (id, val) => {// 株価表示
514            if (isEnglish) {
515                if (val === 'リアルタイム') {
516                    val = 'Real-Time';
517                } else if (val === '終値') {
518                    val = 'Closing Price';
519                }
520            }
521            setDataToElement(id, val);
522        },
523        marketCap: (id, val) => {// 時価総額 億円>billion変換
524            if (isEnglish) {
525                if (typeof val === "string") {
526                    val = val.replace(/,/g, "");
527                }                
528                val = Number(val / 10).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
529            }
530            setDataToElement(id, val);
531        },
532        nikkei225: (id, val) => {// 日経平均採用銘柄
533            if (val === 1) {
534                val = isEnglish ? 'NIKKEI 225 Stock value' : '日経平均採用銘柄';
535            } else {
536                val = '-';
537            }
538            setDataToElement(id, val);
539        }
540    };
541
542    // --基本分岐
543    function handleDataField(dataNameId, value, customFiscalYearEnd) {
544        if (fieldHandlers[dataNameId]) {
545            // 個別定義されたフィールド処理
546            fieldHandlers[dataNameId](dataNameId, value);
547        } else if (dateFields.has(dataNameId)) {
548            // 日付フィールド
549            setDataToElement(dataNameId, formatCustomDate(value, dataNameId, customFiscalYearEnd));
550        } else if (timeFields.has(dataNameId)) {
551            // 時間フィールド
552            setDataToElement(dataNameId, formatCustomDate(value, dataNameId, customFiscalYearEnd));
553        } else {
554            // デフォルト処理
555            setDataToElement(dataNameId, value);
556        }
557    }
558
559    dataName.forEach(item => {
560        const dataNameId = item.dataset.swIdName;
561        let value = (stockData[dataNameId] !== null && stockData[dataNameId] !== '') ? stockData[dataNameId] : '-';
562        handleDataField(dataNameId, value, customFiscalYearEnd);
563    });
564
565    // データ属性の値に応じて単位を付与する(日本語/英語)    
566    for (let i = 0; i < dataName.length; i++) {
567        const idName = dataName[i].dataset.swIdName;
568        switch (idName) {
569            case 'price':
570            case 'change':
571            case 'open':
572            case 'high':
573            case 'low':
574            case 'closing':
575            case 'yearToDateHigh':
576            case 'yearToDateLow':
577            case 'basePrice':
578            case 'epsActual':
579            case 'epsForecast':
580            case 'bpsActual':
581            case 'ebitda':
582            case 'minimumPurchasePrice':
583            case 'sellingPrice':
584            case 'buyingSpree':
585                dataName[i].dataset.swUnitType = isEnglish ? 'yen' : '円';
586                break;
587            case 'changeRatio':
588            case 'dividendRatio':
589            case 'dividendYield':
590            case 'expectedDividendRatio':
591            case 'expectedDividendYield':
592            case 'roaActual':
593            case 'roeActual':
594            case 'roicActual':
595            case 'roaForecast':
596            case 'roeForecast':
597            case 'roicForecast':
598            case 'doe':
599            case 'equityRatio':
600            case 'operatingProfitRatio':
601            case 'ordinaryProfitRatio':
602            case 'netProfitRatio':
603            case 'netProfitParentRatio':
604            case 'operatingProfitRatioForecast':
605            case 'ordinaryProfitRatioForecast':
606            case 'netProfitRatioForecast':
607            case 'netProfitParentRatioForecast':
608                dataName[i].dataset.swUnitType = isEnglish ? '%' : '%';
609                break;
610            case 'perForecast':
611            case 'perActual':
612            case 'pbrActual':
613            case 'psrForecast':
614            case 'psrActual':
615                dataName[i].dataset.swUnitType = isEnglish ? '' : '倍';
616                break;
617            case 'dividend':
618            case 'expectedDividend':
619                dataName[i].dataset.swUnitType = isEnglish ? '' : '円/株';
620                break;
621            case 'volume':
622            case 'sharesOutstanding':
623            case 'treasuryStock':
624            case 'sharesUnitNumber':
625                dataName[i].dataset.swUnitType = isEnglish ? '' : 'æ ª';
626                break;
627            case 'salesProceeds':
628            case 'totalAssets':
629            case 'netWorthActual':
630            case 'sales':
631            case 'operatingProfit':
632            case 'ordinaryProfit':
633            case 'netProfit':
634            case 'netProfitParent':
635            case 'salesForecast':
636            case 'operatingProfitForecast':
637            case 'ordinaryProfitForecast':
638            case 'netProfitForecast':
639            case 'netProfitParentForecast':
640                dataName[i].dataset.swUnitType = isEnglish ? 'million yen' : '百万円';
641                break;
642            case 'marketCap':
643                dataName[i].dataset.swUnitType = isEnglish ? 'billion yen' : '億円';
644                break;
645            case 'numberOfContracts':
646                dataName[i].dataset.swUnitType = isEnglish ? 'times' : '回';
647                break;
648        }
649    }
650    // 前日比率に()をつける場合:span
651    spanTag.dataset.swUnitType = isEnglish ? '%' : '%';
652}
653
654// 即時実行
655(async () => {
656    try {
657        const data = await fetchData(data_url);  // データ取得
658
659        // 変数代入
660        // コーポレートカラー
661        const CORP_COLOR = data.CorpColor || '#000000';
662        
663        // 各設定値
664        lang = data.Lang;
665        //lang = 'ja';
666        disclaimer = data.Disclaimer;
667
668        // コーポレートカラー設定
669        document.documentElement.style.setProperty('--sw-corporate-color', CORP_COLOR);
670
671        // 生成したHTML挿入(表示期間、免責)
672        insertGeneratedHTML(disclaimer);
673        // 言語設定
674        setLangOption();
675
676        // 株価情報
677        StockPrice(data);
678
679        // 描写終了設定
680        globalDrawFinish = true;
681
682        // 描画後にsection可視化
683        document.querySelector('.sw-container').style.visibility = 'visible';
684
685    } catch (error) {
686        console.error("データ処理中にエラーが発生しました:", error);
687    }
688})();
689
690async function upDateData() {
691    try {
692        const data = await fetchData(data_url);  // データ再取得
693
694        // 株価情報
695        StockPrice(data);
696
697        // 描写終了設定
698        globalDrawFinish = true;
699
700    } catch (error) {
701        console.error("データ処理中にエラーが発生しました:", error);
702    }
703}
704setInterval(upDateData, 300000); // 以降5分ごとに実行
705
706// iframe 高さ調整
707const observer = new ResizeObserver(() => {
708    if (window.parent !== window) {
709      window.parent.postMessage(
710        { type: 'iframeHeight', height: document.documentElement.offsetHeight },
711        '*'
712      );
713    }
714  });
715observer.observe(document.documentElement);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.