From 52bbf288a99616ffe8da4156b6cd213080c2177b Mon Sep 17 00:00:00 2001 From: Mike Phares Date: Wed, 7 May 2025 20:55:20 -0700 Subject: [PATCH] 05-07-a --- .gitignore | 2 + bun.lock | 3 + descriptor.js | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++ epoch.js | 106 ++++++++++++++++++++++++++++ index.js | 119 ++++---------------------------- package.json | 3 +- 6 files changed, 314 insertions(+), 105 deletions(-) create mode 100644 descriptor.js create mode 100644 epoch.js diff --git a/.gitignore b/.gitignore index d13d98d..831c2c6 100644 --- a/.gitignore +++ b/.gitignore @@ -336,3 +336,5 @@ ASALocalRun/ .extensions-vscode-oss .extensions-vscode-insiders .vscode/.UserSecrets/secrets.json +hn.png +index.exe diff --git a/bun.lock b/bun.lock index bcda190..2d01c75 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "name": "bun-001", "dependencies": { "puppeteer": "^24.8.1", + "typescript": "^5.8.3", }, }, }, @@ -185,6 +186,8 @@ "typed-query-selector": ["typed-query-selector@2.12.0", "", {}, "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], diff --git a/descriptor.js b/descriptor.js new file mode 100644 index 0000000..57c8515 --- /dev/null +++ b/descriptor.js @@ -0,0 +1,186 @@ +"use strict"; + +const twoAlphaPattern = /^[a-zA-z]{2,3}/; +const processOnlyB = /^[a-zA-z][0-9]{2,4}$/; +// const reactorNumberPattern = /^[0-9]{2}--/; +// const id = /[-]?([QP][0-9]{4,}|[0-9]{5,})[-]?/; +const normal = /^[0-9]{2}[.][0-9]{1}[.]?[0-9]{0,1}/; +const fileSystemSafe = /[\\,\/,\:,\*,\?,\"",\<,\>,\|]/; + +const values = [ + { text: '', rds: '', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: '12-123456-1234', rds: '123456', psn: '1234', reactor: '12', layer: '', zone: '', employee: '', lot: '' }, + { text: '12-1234567-1234', rds: '1234567', psn: '1234', reactor: '12', layer: '', zone: '', employee: '', lot: '' }, + { text: '12-12345678-1234', rds: '12345678', psn: '1234', reactor: '12', layer: '', zone: '', employee: '', lot: '' }, + { text: '123456', rds: '123456', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: '1T123456', rds: '123456', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: 'MP', rds: '', psn: '', reactor: '', layer: '', zone: '', employee: 'MP', lot: '' }, + { text: '12-123456-1234.2-1', rds: '123456', psn: '1234', reactor: '12', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '12-1234567-1234.2-1', rds: '1234567', psn: '1234', reactor: '12', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '12-12345678-1234.2-1', rds: '12345678', psn: '1234', reactor: '12', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '12-123456-1234.02-1', rds: '123456', psn: '1234', reactor: '12', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '12-1234567-1234.02-1', rds: '1234567', psn: '1234', reactor: '12', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '12-12345678-1234.02-1', rds: '12345678', psn: '1234', reactor: '12', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '20', rds: '', psn: '', reactor: '20', layer: '', zone: '', employee: '', lot: '' }, + { text: '20.2', rds: '', psn: '', reactor: '20', layer: '2', zone: '', employee: '', lot: '' }, + { text: '20.2.1', rds: '', psn: '', reactor: '20', layer: '2', zone: '1', employee: '', lot: '' }, + { text: '20.1.1', rds: '', psn: '', reactor: '20', layer: '1', zone: '1', employee: '', lot: '' }, + { text: 'P2-LOW-RR', rds: '', psn: 'RR', reactor: 'P2', layer: '', zone: '', employee: '', lot: '' }, + { text: 'i171308.1.51', rds: 'i171308.1.51', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: 'o171308.1.51', rds: 'o171308.1.51', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: 'O171308.1.51', rds: 'O171308.1.51', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: '171308.1.51', rds: '171308.1.51', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: '' }, + { text: '75-QP1414-SPLIT4', rds: '', psn: 'SPLIT4', reactor: '75', layer: '', zone: '', employee: '', lot: '' }, + { text: 'B48', rds: '', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: 'B48' }, + { text: 'B48', rds: '', psn: '', reactor: '', layer: '', zone: '', employee: '', lot: 'B48' }, +]; + +function tryParseInt(str, defaultValue) { + const parsedValue = parseInt(str); + return isNaN(parsedValue) ? defaultValue : parsedValue; +} + +function getReactorAndRDS(defaultReactor, defaultRDS, text, formattedText, segments) { + let result = {}; + let rds; + let reactor; + let rdsValue; + if (text == null || text.length === 0 || segments.length === 0 || formattedText == null || formattedText.length === 0) + reactor = defaultReactor; + else + reactor = segments[0]; + if (segments.length <= 1 || !tryParseInt(segments[1], false) || rdsValue < 99) + rds = defaultRDS; + else + rds = segments[1]; + if (reactor.length > 3) { + rds = reactor; + reactor = defaultReactor; + } + result = { reactor: reactor, rds: rds }; + return result; +} + +function getLayerAndPSN(defaultLayer, defaultPSN, segments) { + let result = {}; + let psn; + let layer; + if (segments.length <= 2) { + psn = defaultPSN; + layer = defaultLayer; + } + else { + let segmentsB = segments[2].split('.'); + psn = segmentsB[0]; + if (segmentsB.length <= 1) + layer = defaultLayer; + else { + layer = segmentsB[1]; + if (layer.length > 1 && layer[0] === '0') + layer = layer.substring(1); + } + } + result = { layer: layer, psn: psn }; + return result; +} + +function getZone(segments) { + let result = ''; + if (segments.length <= 3) + result = ''; + else { + result = segments[3]; + if (result.length > 1 && result[0] === '0') + result = result.substring(1); + } + return result; +} + +function getValue(text) { + let result = {}; + let lot = ''; + let psn = ''; + let rds = ''; + let zone = ''; + let layer = ''; + let reactor = ''; + let employee = ''; + let defaultPSN = ''; + let defaultRDS = ''; + let defaultZone = ''; + let defaultLayer = ''; + let defaultReactor = ''; + let defaultEmployee = ''; + if (text.match(processOnlyB)) { + lot = text.toUpperCase(); + psn = defaultPSN; + rds = defaultRDS; + zone = defaultZone; + layer = defaultLayer; + reactor = defaultReactor; + employee = defaultEmployee; + } + else if (text == null || text.length === 0 || (text.length == 2 && text.match(twoAlphaPattern))) { + lot = text; + employee = lot; + psn = defaultPSN; + rds = defaultRDS; + zone = defaultZone; + layer = defaultLayer; + reactor = defaultReactor; + } + else if (text.match(normal)) { + let segments = text.split('.'); + lot = text; + psn = defaultPSN; + rds = defaultRDS; + layer = segments[1]; + reactor = segments[0]; + employee = defaultEmployee; + if (segments.length <= 2) + zone = defaultZone; + else + zone = segments[2]; + } + else { + // Remove illegal characters \/:*?"<>| found in the Lot. + lot = text.replace(fileSystemSafe, "_").split('\r')[0].split('\n')[0]; + if (lot.length > 2 && lot[0] == '1' && (lot[1] == 'T' || lot[1] == 't')) + lot = lot.substring(2); + let segments = lot.split('-'); + // let hasRDS = lot.match(id); + let reactorAndRDS = getReactorAndRDS(defaultReactor, defaultRDS, text, lot, segments); + reactor = reactorAndRDS.reactor; + rds = reactorAndRDS.rds; + let layerAndPSN = getLayerAndPSN(defaultLayer, defaultPSN, segments); + layer = layerAndPSN.layer; + psn = layerAndPSN.psn; + zone = getZone(segments); + if (segments.length <= 4) + employee = defaultEmployee; + else + employee = segments[4]; + } + result = { rds: rds, psn: psn, reactor: reactor, layer: layer, zone: zone, employee: employee, lot: lot }; + return result; +}; + +values.forEach(element => { + let value = getValue(element.text); + if (value.rds !== element.rds) + console.error("RDS doesn't match!"); + else if (value.psn !== element.psn) + console.error("PSN doesn't match!"); + else if (value.reactor !== element.reactor) + console.error("Reactor doesn't match!"); + else if (value.layer !== element.layer) + console.error("Layer doesn't match!"); + else if (value.zone !== element.zone) + console.error("Zone doesn't match!"); + else if (value.employee !== element.employee) + console.error("Employee doesn't match!"); + else if (value.lot !== element.lot) + console.error("Lot doesn't match!"); + else + console.info('Match'); +}); \ No newline at end of file diff --git a/epoch.js b/epoch.js new file mode 100644 index 0000000..d3dce78 --- /dev/null +++ b/epoch.js @@ -0,0 +1,106 @@ +"use strict"; + +// DateTime normal = DateTime.Now.ToUniversalTime(); +// logger.LogInformation("Now - ToUniversalTime: {ticks}", normal.Ticks); +// DateTime utc1970DateTime = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); +// logger.LogInformation("utc1970DateTime: {ticks}", utc1970DateTime.Ticks); +// logger.LogInformation("Subtract: {ticks}", DateTime.Now.Subtract(utc1970DateTime).Ticks); +// var epoch = new Date('1970-01-01T00:00:01'); +// console.log("epoch: " + epoch.valueOf()); +// var date = new Date(); +// var timezoneOffset = date.getTimezoneOffset(); +// console.log("timezoneOffset: " + timezoneOffset); +// var secondsAfter = (date.getTime().valueOf() + timezoneOffset) * 10000; +// var ticks = secondsAfter + 621355968000000000; +// console.log("ticks: " + ticks); +// var dateText = ticks + " - " + date.toString(); +// console.log("dateText: " + dateText); +// DateTime utcMeDateTime = new(1980, 1, 17, 0, 0, 0, DateTimeKind.Utc); +// long meTotalSeconds = (long)Math.Floor(fileInfo.LastWriteTime.ToUniversalTime().Subtract(utcMeDateTime).TotalSeconds); + +// epoch: 25201000 +// ticks: 638665132483790000 +// dateText: 638665132483790000 - Wed Nov 06 2024 10:55:58 GMT-0700 (Mountain Standard Time) +// Now - To: 638665132334594771 +// 638665135325760000 +// 638665136814890000 +// utc1970DateTime: 621355968000000000 + +function getDateText() { + let result; + const now = new Date(); + const time = now.getTime(); + const year = now.getFullYear(); + const start = new Date(year, 0, 0); + const oneDay = 1000 * 60 * 60 * 24; + const timezoneOffset = now.getTimezoneOffset(); + const diff = (now - start) + ((start.getTimezoneOffset() - timezoneOffset) * 60 * 1000); + const day = Math.floor(diff / oneDay); + console.log('Day of year: ' + day); + var season = year + "-"; + if (day < 78) + season = season + "0.Winter"; + else if (day < 124) + season = season + "1.Spring"; + else if (day < 171) + season = season + "2.Spring"; + else if (day < 217) + season = season + "3.Summer"; + else if (day < 264) + season = season + "4.Summer"; + else if (day < 309) + season = season + "5.Fall"; + else if (day < 354) + season = season + "6.Fall"; + else + season = season + "7.Winter"; + const seconds = time.valueOf() + timezoneOffset; + const epoch = seconds * 10000; + const ticks = epoch + 621355968000000000; + result = seconds + " - " + ticks + " - " + now.toString(); + return result; +} + +const dateText = getDateText(); +console.log("dateText: " + dateText); + +function getPath() { + let result; + const original = "d:\\5-Other-Small\\Kanban\\Year-Season\\2025\\2025-0.Winter\\1737913505637"; + const segments = original.split('\\'); + result = segments.slice(0, -3).join('\\') + '\\2021\\2021-0.Summer\\123'; + return result; +} + +const path = getPath(); +console.log("path: " + path); + +// https://tickstodatetime.wassupy.com/?ticks=638784250251441727 + +function getInfinityQS(value, sequence) { + let result; + if (sequence.length < 18) + result = [value]; + else { + const now = new Date(); + const epochHour = 36000000000; + const epochTicks = 621355968000000000; + const timezoneHourOffset = now.getTimezoneOffset() / 60; + const timezoneOffset = timezoneHourOffset * epochHour; + const milliseconds = (sequence - epochTicks + timezoneOffset) / 10000; + const flooredMilliseconds = Math.floor(milliseconds / (60 * 1000)) * (60 * 1000); + const ceiledMilliseconds = Math.ceil(milliseconds / (60 * 1000)) * (60 * 1000); + result = [(flooredMilliseconds / 1000), (ceiledMilliseconds / 1000)]; + } + return result; +} + +const date = '3/26/2025'; +const infinityQS = 1742853453; +const sequence = '638784250251441727'; +const values = getInfinityQS(date, sequence); +console.info("InfinityQS: " + values); +if (values[0] < infinityQS && values[1] > infinityQS) + console.info("InfinityQS: Pass"); +else + console.warn("InfinityQS: Fail"); \ No newline at end of file diff --git a/index.js b/index.js index d3dce78..829b09f 100644 --- a/index.js +++ b/index.js @@ -1,106 +1,17 @@ -"use strict"; +import puppeteer from 'puppeteer'; -// DateTime normal = DateTime.Now.ToUniversalTime(); -// logger.LogInformation("Now - ToUniversalTime: {ticks}", normal.Ticks); -// DateTime utc1970DateTime = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); -// logger.LogInformation("utc1970DateTime: {ticks}", utc1970DateTime.Ticks); -// logger.LogInformation("Subtract: {ticks}", DateTime.Now.Subtract(utc1970DateTime).Ticks); -// var epoch = new Date('1970-01-01T00:00:01'); -// console.log("epoch: " + epoch.valueOf()); -// var date = new Date(); -// var timezoneOffset = date.getTimezoneOffset(); -// console.log("timezoneOffset: " + timezoneOffset); -// var secondsAfter = (date.getTime().valueOf() + timezoneOffset) * 10000; -// var ticks = secondsAfter + 621355968000000000; -// console.log("ticks: " + ticks); -// var dateText = ticks + " - " + date.toString(); -// console.log("dateText: " + dateText); -// DateTime utcMeDateTime = new(1980, 1, 17, 0, 0, 0, DateTimeKind.Utc); -// long meTotalSeconds = (long)Math.Floor(fileInfo.LastWriteTime.ToUniversalTime().Subtract(utcMeDateTime).TotalSeconds); - -// epoch: 25201000 -// ticks: 638665132483790000 -// dateText: 638665132483790000 - Wed Nov 06 2024 10:55:58 GMT-0700 (Mountain Standard Time) -// Now - To: 638665132334594771 -// 638665135325760000 -// 638665136814890000 -// utc1970DateTime: 621355968000000000 - -function getDateText() { - let result; - const now = new Date(); - const time = now.getTime(); - const year = now.getFullYear(); - const start = new Date(year, 0, 0); - const oneDay = 1000 * 60 * 60 * 24; - const timezoneOffset = now.getTimezoneOffset(); - const diff = (now - start) + ((start.getTimezoneOffset() - timezoneOffset) * 60 * 1000); - const day = Math.floor(diff / oneDay); - console.log('Day of year: ' + day); - var season = year + "-"; - if (day < 78) - season = season + "0.Winter"; - else if (day < 124) - season = season + "1.Spring"; - else if (day < 171) - season = season + "2.Spring"; - else if (day < 217) - season = season + "3.Summer"; - else if (day < 264) - season = season + "4.Summer"; - else if (day < 309) - season = season + "5.Fall"; - else if (day < 354) - season = season + "6.Fall"; - else - season = season + "7.Winter"; - const seconds = time.valueOf() + timezoneOffset; - const epoch = seconds * 10000; - const ticks = epoch + 621355968000000000; - result = seconds + " - " + ticks + " - " + now.toString(); - return result; +const browser = await puppeteer.launch(); +try { + const page = await browser.newPage(); + await page.goto('https://news.ycombinator.com', { + waitUntil: 'networkidle2', + }); + await page.screenshot({ + path: 'hn.png', + }); +} catch (error) { + console.log(error); } - -const dateText = getDateText(); -console.log("dateText: " + dateText); - -function getPath() { - let result; - const original = "d:\\5-Other-Small\\Kanban\\Year-Season\\2025\\2025-0.Winter\\1737913505637"; - const segments = original.split('\\'); - result = segments.slice(0, -3).join('\\') + '\\2021\\2021-0.Summer\\123'; - return result; -} - -const path = getPath(); -console.log("path: " + path); - -// https://tickstodatetime.wassupy.com/?ticks=638784250251441727 - -function getInfinityQS(value, sequence) { - let result; - if (sequence.length < 18) - result = [value]; - else { - const now = new Date(); - const epochHour = 36000000000; - const epochTicks = 621355968000000000; - const timezoneHourOffset = now.getTimezoneOffset() / 60; - const timezoneOffset = timezoneHourOffset * epochHour; - const milliseconds = (sequence - epochTicks + timezoneOffset) / 10000; - const flooredMilliseconds = Math.floor(milliseconds / (60 * 1000)) * (60 * 1000); - const ceiledMilliseconds = Math.ceil(milliseconds / (60 * 1000)) * (60 * 1000); - result = [(flooredMilliseconds / 1000), (ceiledMilliseconds / 1000)]; - } - return result; -} - -const date = '3/26/2025'; -const infinityQS = 1742853453; -const sequence = '638784250251441727'; -const values = getInfinityQS(date, sequence); -console.info("InfinityQS: " + values); -if (values[0] < infinityQS && values[1] > infinityQS) - console.info("InfinityQS: Pass"); -else - console.warn("InfinityQS: Fail"); \ No newline at end of file +finally { + await browser.close(); +} \ No newline at end of file diff --git a/package.json b/package.json index a8fe5dd..62e8448 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "license": "ISC", "type": "commonjs", "dependencies": { - "puppeteer": "^24.8.1" + "puppeteer": "^24.8.1", + "typescript": "^5.8.3" } } \ No newline at end of file