/* ВНИМАНИЕ: файл собран автоматически из исходников numerolog_calc. Не редактируйте вручную — правьте исходные модули и запустите build-bundle.mjs */ (function () { 'use strict'; /* ===== стили (_hexagram.css) ===== */ (function () { if ( document.getElementById('numerolog-calc-styles') ) return; var css = ".num-calculator {\r\n\t display: flex;\r\n\t flex-direction: column;\r\n\t align-items: stretch;\r\n\t gap: 30px;\r\n\t width: 100%;\r\n\t margin: auto;\r\n\t padding: 2em 0;\r\n\t/* &.family {\r\n\t\t .calc-params {\r\n\t\t\t display: grid;\r\n\t\t\t grid-template-columns: repeat(4, auto);\r\n\t\t\t gap: .25em 1em;\r\n\t\t}\r\n\t}\r\n\t */\r\n}\r\n .num-calculator h2 {\r\n\t font-size: 1.75em;\r\n\t font-weight: 700;\r\n\t text-align: center;\r\n}\r\n .num-calculator .calc-params {\r\n\t display: flex;\r\n\t flex-wrap: wrap;\r\n\t justify-content: center;\r\n\t align-items: flex-end;\r\n\t gap: 10px;\r\n}\r\n .num-calculator .calc-params > div {\r\n\t display: flex;\r\n\t flex-direction: column;\r\n}\r\n .num-calculator .calc-params input {\r\n\t border: 1px solid #000;\r\n\t outline: none;\r\n\t border-radius: 5px;\r\n\t height: 34px;\r\n}\r\n .num-calculator .calc-params select {\r\n\t background-color: #fff;\r\n\t border: 1px solid #000;\r\n\t outline: none;\r\n\t border-radius: 5px;\r\n\t height: 34px;\r\n}\r\n .num-calculator .calc-error {\r\n\t color: #d00;\r\n\t text-align: center;\r\n\t font-size: 1.25em;\r\n}\r\n .num-calculator .calc-error:empty {\r\n\t display: none;\r\n}\r\n .num-calculator .calc-results {\r\n\t font-size: 18px;\r\n}\r\n .num-calculator .calc-results:empty {\r\n\t display: none;\r\n}\r\n .num-calculator .calc-results h3 {\r\n\t text-align: center;\r\n\t margin-bottom: 0.5em;\r\n\t font-size: 1.25em;\r\n}\r\n .num-calculator .calc-results .result {\r\n\t display: flex;\r\n\t flex-wrap: wrap;\r\n\t gap: 40px 15px;\r\n}\r\n .num-calculator .calc-results .info {\r\n\t font-weight: 700;\r\n\t flex: 1 0 0;\r\n\t display: flex;\r\n\t flex-direction: column;\r\n\t align-items: center;\r\n}\r\n .num-calculator .calc-results .info h4 {\r\n\t font-size: 1.5em;\r\n}\r\n .num-calculator .calc-results .info h5 {\r\n\t font-size: 2rem;\r\n\t font-weight: 500;\r\n}\r\n .num-calculator .calc-results .info .hex-name {\r\n\t font-size: 1.25em;\r\n}\r\n .num-calculator .calc-results .info span {\r\n\t font-size: 2.5rem;\r\n\t line-height: 1rem;\r\n}\r\n .num-calculator .calc-results .table {\r\n\t flex: 1 0 0;\r\n\t white-space: nowrap;\r\n\t font-size: 0.75em;\r\n\t font-weight: 500;\r\n}\r\n .num-calculator .calc-results .table td, .num-calculator .calc-results .table th {\r\n\t padding: 8px 4px;\r\n}\r\n .num-calculator .calc-results table:not(.table) {\r\n\t border-collapse: collapse;\r\n\t margin: 10px 0;\r\n\t font-size: 1.5em;\r\n\t font-weight: 500;\r\n}\r\n .num-calculator .calc-results table:not(.table) td {\r\n\t border: 1px solid #ddd;\r\n\t line-height: 2.5em;\r\n\t min-width: 2.5em;\r\n\t text-align: center;\r\n\t padding: 0 0.5em;\r\n}\r\n .num-calculator .calc-results canvas {\r\n\t width: 100%;\r\n\t min-width: 1000px;\r\n\t max-width: 100%;\r\n}\r\n .num-calculator .calc-results .hexagram {\r\n\t margin: 0.5em 2em;\r\n}\r\n .num-calculator .calc-results .hexagram * {\r\n\t width: 6em;\r\n\t height: 1em;\r\n\t display: flex;\r\n\t align-items: center;\r\n\t gap: 1em;\r\n}\r\n .num-calculator .calc-results .hexagram *::before, .num-calculator .calc-results .hexagram *::after {\r\n\t content: '';\r\n\t flex: 1 0 0;\r\n\t height: 0.25em;\r\n\t background-color: #000;\r\n}\r\n .num-calculator .calc-results .hexagram b::after {\r\n\t display: none;\r\n}\r\n .num-calculator .calc-results .matrix {\r\n\t display: grid;\r\n\t grid-template-columns: repeat(4, auto);\r\n\t gap: 0.25em 0.75em;\r\n\t font-size: 1.75em;\r\n\t margin: 0.5em;\r\n}\r\n .num-calculator i.line-color {\r\n\t display: inline-block;\r\n\t width: 2em;\r\n\t height: 0.875em;\r\n\t/* background-color: var(--color);*/\r\n\t background-color: #000;\r\n\t margin: 0 0.25em;\r\n}\r\n .num-calculator .chart-table tbody:nth-child(2n + 1) {\r\n\t background-color: #eee;\r\n}\r\n .num-calculator .legend {\r\n\t display: flex;\r\n\t justify-content: center;\r\n\t align-items: center;\r\n\t gap: 0.5em;\r\n\t font-size: 0.75em;\r\n}\r\n .num-calculator .legend .group {\r\n\t display: flex;\r\n\t gap: 0.5em;\r\n\t border: 1px solid #444;\r\n\t padding: 0.125em 0.25em;\r\n}\r\n .think-calculator .calc-results .charts {\r\n\t flex: 1 0 100%;\r\n\t min-width: 1024px;\r\n}\r\n .think-calculator .calc-results canvas {\r\n\t max-height: 200px;\r\n}\r\n .calc-results.think-export_ {\r\n\t font-size: 18px;\r\n}\r\n .calc-results.think-export_:empty {\r\n\t display: none;\r\n}\r\n .calc-results.think-export_ h1 {\r\n\t text-align: center;\r\n\t margin-bottom: 0.5em;\r\n\t font-size: 2em;\r\n}\r\n .calc-results.think-export_ .info {\r\n\t font-weight: 700;\r\n\t flex: 1 0 0;\r\n\t display: flex;\r\n\t flex-direction: column;\r\n\t align-items: center;\r\n}\r\n .calc-results.think-export_ .info h4 {\r\n\t font-size: 1.5em;\r\n}\r\n .calc-results.think-export_ .info h5 {\r\n\t font-size: 2rem;\r\n\t font-weight: 500;\r\n}\r\n .calc-results.think-export_ .info span {\r\n\t font-size: 2.5rem;\r\n\t line-height: 1rem;\r\n}\r\n .calc-results.think-export_ .table {\r\n\t flex: 1 0 0;\r\n\t white-space: nowrap;\r\n\t font-size: 0.75em;\r\n\t font-weight: 500;\r\n}\r\n .calc-results.think-export_ table:not(.table) {\r\n\t border-collapse: collapse;\r\n\t margin: 10px 0;\r\n\t font-size: 1.5em;\r\n\t font-weight: 500;\r\n}\r\n .calc-results.think-export_ table:not(.table) td {\r\n\t border: 1px solid #ddd;\r\n\t line-height: 2.5em;\r\n\t min-width: 2.5em;\r\n\t text-align: center;\r\n\t padding: 0 0.5em;\r\n}\r\n .calc-results.think-export_ .hexagram {\r\n\t margin: 0.5em 2em;\r\n}\r\n .calc-results.think-export_ .hexagram * {\r\n\t width: 6em;\r\n\t height: 1em;\r\n\t display: flex;\r\n\t align-items: center;\r\n\t gap: 1em;\r\n}\r\n .calc-results.think-export_ .hexagram *::before, .calc-results.think-export_ .hexagram *::after {\r\n\t content: '';\r\n\t flex: 1 0 0;\r\n\t height: 0.25em;\r\n\t background-color: #000;\r\n}\r\n .calc-results.think-export_ .hexagram b::after {\r\n\t display: none;\r\n}\r\n .calc-results.think-export_ .matrix {\r\n\t display: grid;\r\n\t grid-template-columns: repeat(4, auto);\r\n\t gap: 0.25em 0.75em;\r\n\t font-size: 1.5em;\r\n\t margin: 0.5em;\r\n}\r\n .calc-print {\r\n\t width: 1000px;\r\n\t position: fixed;\r\n\t left: 10000px;\r\n}\r\n .calc-print_ {\r\n\t position: fixed;\r\n\t height: 297mm;\r\n\t width: 210mm;\r\n\t top: 50%;\r\n\t left: 50%;\r\n\t z-index: 1000000;\r\n\t transform-origin: 0 0;\r\n\t transform: scale(0.75) translate(-50%, -50%);\r\n\t background-color: #fff;\r\n\t box-shadow: 0 0 10px #000 8;\r\n}\r\n @media screen and (max-width: 640px) {\r\n\t .container {\r\n\t\t padding: 0;\r\n\t}\r\n}\r\n b {\r\n\t --c1: #f00;\r\n\t --c2: #ffa500;\r\n\t --c3: #000;\r\n\t --c4: #008000;\r\n\t --c5: #0f93ff;\r\n\t --c6: #8b00ff;\r\n\t --c7: #9b2d30;\r\n\t --c8: #a4adab;\r\n}\r\n "; var st = document.createElement('style'); st.id = 'numerolog-calc-styles'; st.appendChild(document.createTextNode(css)); document.head.appendChild(st); })(); var __mods = {}; /* ===== util.js ===== */ (function (exports) { function parseDate (dateString) { if ( !dateString || typeof dateString !== 'string' ) { throw new Error('Invalid input: expected a non-empty string.') } let match = dateString.match(/^(\d{4})-(\d{2})-(\d{2})$/) if ( match ) { const [, year, month, day] = match return new Date(Number(year), Number(month) - 1, Number(day)) } match = dateString.match(/^(\d{2})\.(\d{2})\.(\d{4})$/) if ( match ) { const [, day, month, year] = match return new Date(Number(year), Number(month) - 1, Number(day)) } match = dateString.match(/^(\d{2})\/(\d{2})\/(\d{4})$/) if ( match ) { const [, month, day, year] = match return new Date(Number(year), Number(month) - 1, Number(day)) } if ( /^\d+$/.test(dateString) ) { const timestamp = Number(dateString) if ( timestamp > 0 ) return new Date(timestamp) } throw new Error('Unsupported date format: ' + dateString) } //import { parseDate } from '../../utils/gc-date.js' const LOADED = new Set() function formatDate (date, format = 'dd.mm.yyyy') { if ( !date || !format ) return if ( typeof date === 'number' ) date = new Date(date) if ( typeof date === 'string' ) date = parseDate(date) return format .replace('(yyyy)', () => { const yyyy = date.getFullYear() return new Date().getFullYear() === yyyy ? '' : yyyy }) .replace('yyyy', date.getFullYear()) .replace('mm', `0${date.getMonth() + 1}`.slice(-2)) .replace('dd', `0${date.getDate()}`.slice(-2)) .replace('HH', `0${date.getHours()}`.slice(-2)) .replace('MM', `0${date.getMinutes()}`.slice(-2)) .replace('SS', `0${date.getSeconds()}`.slice(-2)) } async function loadScript (url) { if ( LOADED.has(url) ) return LOADED.add(url) await new Promise(resolve => { const script = document.createElement('script') script.src = url script.addEventListener('load', resolve) document.head.insertAdjacentElement('beforeend', script) }) } function round (num, frac) { const pow = 10 ** frac return Math.round((num * pow)) / pow } function getFieldNum (id, len) { const val = document.getElementById(id)?.value if ( /^\d+$/.test(val) && (!len || val.length === len) ) return parseInt(val) } function getFieldValue (id) { return document.getElementById(id)?.value } function getFieldDate (id) { const date = document.getElementById(id)?.value const m = date.match(/^(\d\d\d\d)-(\d\d)-(\d\d)$/) if ( m ) return new Date(m[1], m[2] - 1, m[3]) } function sumDigits (num) { return [...`${num}`].map(s => parseInt(s)).reduce((sum, n) => sum + n) } function countDigits (num) { const arr = new Array(10).fill(0) for ( const s of `${num}` ) { arr[parseInt(s)]++ } return arr } async function saveAsPDF ($el) { // await loadScript('https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js') await loadScript('https://fs.getcourse.ru/fileservice/file/download/a/186184/sc/462/h/8c28d430eff42af13995623248015411.js') console.log($el) console.log(html2pdf) const res = html2pdf().set({ filename: "file_" + Date.now() + ".pdf", image: { type: "jpeg", quality: 0.98 }, html2canvas: { scale: 8 }, jsPDF: { unit: "in", format: "a4", orientation: "portrait" } }).from($el).save(); console.log(res) } async function saveAsPNG ($el, filename) { const $res = $el.nextElementSibling // await loadScript('https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js') await loadScript('https://fs.getcourse.ru/fileservice/file/download/a/186184/sc/191/h/9392c48c413edf0652eba4a890bed621.js') html2canvas($el).then(async canvas => { canvas.toBlob(async blob => { /* // new Blob([buffer], { type: `application/octet-stream` }) const $a = document.createElement("a"); // $a.textContent = 'Get File' $a.href = URL.createObjectURL(blob) $a.download = filename; // $a.target = '_blank'; // $el.insertAdjacentElement('beforebegin', $a) $a.click(); */ const uploadUrl = await fetch(`/fileservice/widget/create-secret-link?host=${window.fileserviceUploadHost}&uri=/fileservice/widget/secure-direct-upload?fs_ref=${window.location.href}&fs_u=${window.accountUserId}&expires=600`) .then(res => res.json()).then(data => data.link) const data = new FormData() data.append('userId', window.accountUserId) data.append('Filedata', blob, filename) const fileHash = await fetch(uploadUrl, { method: 'post', body: data }).then(res => res.text()) // console.log('FILE HASH:', fileHash) $res.insertAdjacentHTML('beforebegin', `
Файл расчета "${filename}"
`) $res.previousElementSibling.querySelector('a').click(); }, 'image/png') // }, 'application/octet-stream') }) } function renderDayMatrix () { return `
${date.getDate()}${date.getMonth() + 1}${date.getFullYear()} ${r.oneCalculate}${r.twoCalculate}${r.threeCalculate}${r.fourCalculate}
${r.matrix[1]}${r.matrix[4]}${r.matrix[7]} ${r.matrix[2]}${r.matrix[5]}${r.matrix[8]} ${r.matrix[3]}${r.matrix[6]}${r.matrix[9]}${r.matrix[0]}
` } Object.assign(exports, { formatDate, loadScript, round, getFieldNum, getFieldValue, getFieldDate, sumDigits, countDigits, saveAsPDF, saveAsPNG, renderDayMatrix }); })(__mods['util'] = {}); /* ===== _hexagram.js ===== */ (function (exports) { const { countDigits, formatDate, getFieldDate, getFieldValue, saveAsPNG } = __mods['util']; const CONVERT_TO_TOP = { '111': 1, '011': 2, '101': 3, '001': 4, '110': 5, '010': 6, '100': 7, '000': 8, } function initHexagramCalc () { const $hex = document.querySelector('.hex-calculator') if ( !$hex ) return $hex.className = 'hex-calculator num-calculator' $hex.innerHTML = `

Калькулятор гексаграмм

` $hex.querySelector('.calc-params .btn-primary').addEventListener('click', updateResult) $hex.querySelector('.calc-params .btn-warning').addEventListener('click', saveResult) async function saveResult () { const $res = $hex.querySelector('.calc-results') if ( !$res.children.length ) { $hex.querySelector('.calc-error').textContent = 'Выполните расчет' return } $res.insertAdjacentHTML('beforebegin', '
') updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $print = $hex.querySelector('.calc-results') const date = getFieldValue('calc-param-date') const variant = document.getElementById('calc-param-variant').value await saveAsPNG($print, `РАСЧЕТ_${variant === 'birthday' ? 'ДР' : variant === 'event' ? 'ДС' : 'ПСС'}-${date}.png`) // await saveAsPDF($el) $print.remove() } function updateResult () { const variant = document.getElementById('calc-param-variant').value const date = getFieldDate('calc-param-date') console.log(date) if ( !date ) { $hex.querySelector('.calc-error').textContent = 'Выберите дату' return } $hex.querySelector('.calc-error').textContent = '' const $result = $hex.querySelector('.calc-results') if ( ['birthday', 'event'].includes(variant) ) { const r = calc(date) function splitTable(rows, part) { const allRows = rows.split(''); // Разделяем строки const half = Math.ceil(allRows.length / 2); // Находим середину const start = part === 0 ? 0 : half; const end = part === 0 ? half : allRows.length; return allRows.slice(start, end).join(''); // Объединяем обратно строки } $result.innerHTML = `

${variant === 'birthday' ? 'Гексаграмма по дате рождения' : 'Гексаграмма по дате события'}

${drawDay(r, date)}
${variant === 'birthday' ? `
${splitTable(yearHex(date), 0)}
ГодВозрГексаграмма прямая / противоположная
${splitTable(yearHex(date), 1)}
ГодВозрГексаграмма прямая / противоположная
` : `
${splitTable(dateHex(date), 0)}
ДатаГексаграмма прямая / противоположная
${splitTable(dateHex(date), 1)}
ДатаГексаграмма прямая / противоположная
`}
` } else { const r = calc(date) let aDate = new Date(date) let a while ( true ) { aDate.setDate(aDate.getDate() - 1) a = calc(aDate) if ( a.topName + a.bottomName === r.bottomName + r.topName ) break } let bDate = new Date(date) let b while ( true ) { bDate.setDate(bDate.getDate() + 1) b = calc(bDate) if ( b.topName + b.bottomName === r.bottomName + r.topName ) break } $result.innerHTML = `

Причинно-следственная связь события

Причина события

${drawDay(a, aDate)}

День события

${drawDay(r, date)}

Следствие

${drawDay(b, bDate)}
` } } function drawDay (r, date) { console.log(date,"date") return `

Прямая

${r.topName}
${r.hexagram.map(h => h === 1 ? '' : '').join('')}

Противоположная

${r.bottomName}
${date.getDate()}${date.getMonth() + 1}${date.getFullYear()} ${r.oneCalculate}${r.twoCalculate}${r.threeCalculate}${r.fourCalculate}
${r.matrix[1]}${r.matrix[4]}${r.matrix[7]} ${r.matrix[2]}${r.matrix[5]}${r.matrix[8]} ${r.matrix[3]}${r.matrix[6]}${r.matrix[9]}${r.matrix[0]}
` } function yearHex (date) { date = new Date(date) const result = [] for ( let age = 0; age < 101; age++ ) { const r = calc(date) result.push(`${date.getFullYear()}${age}${r.topName} / ${r.bottomName}`) date.setFullYear(date.getFullYear() + 1) } return result.join('') } function dateHex (date) { date = new Date(date) const month = date.getMonth() const result = [] for ( let day = 1; ; day++ ) { date.setDate(day) if ( date.getMonth() !== month ) break const r = calc(date) result.push(`${formatDate(date)}${r.topName} / ${r.bottomName}`) } return result.join('') } function calc (date) { date = `${date.getDate()}${date.getMonth() + 1}${date.getFullYear()}` // Расчёт чисел let oneCalculate = 0 for ( let i = 0; i < date.length; i++ ) { oneCalculate += parseInt(date[i]) } let twoCalculate = 0 const _$oneCalculate = `${oneCalculate}` for ( let i = 0; i < _$oneCalculate.length; i++ ) { twoCalculate += parseInt(_$oneCalculate[i]) } const threeCalculate = oneCalculate - date[0] * 2 let fourCalculate = 0; const _$threeCalculate = `${threeCalculate}`.replace("-", ""); // Убираем минус, но сохраняем знак в threeCalculate for (let i = 0; i < _$threeCalculate.length; i++) { fourCalculate += parseInt(_$threeCalculate[i]); } const matrix = countDigits(`${date}${oneCalculate}${twoCalculate}${threeCalculate}${fourCalculate}`) // Расчёт гексограммы let hexagram = [] let $althexagram = [] hexagram[0] = matrix[4] % 2 && 1 hexagram[1] = matrix[7] % 2 && 1 hexagram[2] = (matrix[0] + matrix[3]) % 2 && 1 hexagram[3] = (matrix[8] + matrix[5]) % 2 && 1 hexagram[4] = (matrix[1] + matrix[2]) % 2 && 1 hexagram[5] = (matrix[6] + matrix[9]) % 2 && 1 let $top = CONVERT_TO_TOP[`${hexagram[0]}${hexagram[1]}${hexagram[2]}`] let $bottom = CONVERT_TO_TOP[`${hexagram[3]}${hexagram[4]}${hexagram[5]}`] let $hexotable = [ [1, 43, 14, 34, 9, 5, 26, 11], [10, 58, 38, 54, 61, 60, 41, 19], [13, 49, 30, 55, 37, 63, 22, 36], [25, 17, 21, 51, 42, 3, 27, 24], [44, 28, 50, 32, 57, 48, 18, 46], [6, 47, 64, 40, 59, 29, 4, 7], [33, 31, 56, 62, 53, 39, 52, 15], [12, 45, 35, 16, 20, 8, 23, 2] ] let $nametable = [ 'Творчество', 'Исполнение', 'Начальная трудность', 'Недоразвитость', 'Необходимость ждать', 'Суд', 'Войско', 'Приближение', 'Воспитание малым', 'Наступление', 'Расцвет', 'Упадок', 'Единомышленники, родня', 'Владение великим', 'Смирение', 'Вольность', 'Последование', 'Исправление порчи', 'Посещение', 'Созерцание', 'Стиснутые зубы', 'Убранство', 'Разрушение', 'Возврат', 'Беспорочность', 'Воспитание великим', 'Питание', 'Переразвитие великого', 'Повторная опасность, бездна', 'Сияние', 'Взаимодействие', 'Постоянство', 'Бегство', 'Мощь великого', 'Восход', 'Поражение света', 'Домашние', 'Разлад', 'Препятствие', 'Разрешение', 'Убыль', 'Приумножение', 'Выход', 'Перечение', 'Воссоединение', 'Подъём', 'Истощение', 'Колодец', 'Смена', 'Жертвенник', 'Возбуждение, молния', 'Сосредоточенность', 'Течение', 'Невеста', 'Изобилие', 'Странствие', 'Проникновение', 'Радость', 'Раздробленность', 'Ограничение', 'Внутренняя правда', 'Переразвитие малого', 'Уже конец', 'Ещё не конец' ] for ( let $i = 0; $i < 6; $i++ ) { if ( hexagram[$i] === 1 ) { $althexagram[$i] = 0 } else { $althexagram[$i] = 1 } } let $alttop = CONVERT_TO_TOP[`${$althexagram[0]}${$althexagram[1]}${$althexagram[2]}`] let $altbottom = CONVERT_TO_TOP[`${$althexagram[3]}${$althexagram[4]}${$althexagram[5]}`] let $hexnumber = $hexotable[$bottom - 1][$top - 1] let $hexname = $nametable[$hexnumber - 1] let $althexnumber = $hexotable[$altbottom - 1][$alttop - 1] let $althexname = $nametable[$althexnumber - 1] let topName = `${$hexnumber} ${$hexname}` let bottomName = `${$althexnumber} ${$althexname}` return { oneCalculate, twoCalculate, threeCalculate, fourCalculate, topName, bottomName, hexagram, matrix } } } Object.assign(exports, { initHexagramCalc }); })(__mods['_hexagram'] = {}); /* ===== _family.js ===== */ (function (exports) { const { formatDate, getFieldDate, getFieldNum, loadScript, round, saveAsPNG, sumDigits } = __mods['util']; async function initFamilyCalc () { const $hex = document.querySelector('.family-calculator') if ( !$hex ) return $hex.className = 'family-calculator num-calculator' $hex.innerHTML = `

Расчёт сроков стабильности семьи

Партнёр 1
Партнёр 2
Год начала отношений
` const chartScript = loadScript('https://fs.getcourse.ru/fileservice/file/download/a/186184/sc/208/h/4c35e01ef8e0b78e15c2784de4f9f247.js') $hex.querySelector('.calc-params .btn-primary').addEventListener('click', updateResult) $hex.querySelector('.calc-params .btn-warning').addEventListener('click', saveResult) async function saveResult () { const $res = $hex.querySelector('.calc-results') if ( !$res.children.length ) { $hex.querySelector('.calc-error').textContent = 'Выполните расчет' return } $res.insertAdjacentHTML('beforebegin', '
') await updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $print = $hex.querySelector('.calc-results') await saveAsPNG($print, `РАСЧЕТ_СС-${formatDate(new Date(), 'yyyy-mm-dd HH:MM:SS')}.png`) // await saveAsPDF($el) $print.remove() } async function updateResult () { const $part1 = getFieldDate('partner-1') const $part2 = getFieldDate('partner-2') const $year = getFieldNum('year', 4) if (!$part1 || !$part2 || !$year) { $hex.querySelector('.calc-error').textContent = 'Укажите параметры расчета' return } await chartScript const r = calculate($part1, $part2, $year) // Проверяем, если ДСС равно 0 const $warning = document.querySelector('.war_dss'); if ($warning) { if (r.stability === 0) { $warning.classList.remove('view-collapsed'); } else { $warning.classList.add('view-collapsed'); } } const $result = $hex.querySelector('.calc-results') $result.innerHTML = `
${drawPartner(1, r.part1, r.spir, r.stab)}
${drawPartner(2, r.part2, r.spir, r.stab)}

БСС = ${r.spirituality}

ДСС = ${r.stability}

` drawChart(r) } function drawChart (r) { const MAX_AGE = 100 const dss = r.stability const resultDss = [{ x: 0, y: 0 }] if (dss > 0) { let x = 0 for (; x < MAX_AGE; x += dss) { resultDss.push({x, y: 0}, {x: x + dss / 2, y: -1}) } if (resultDss[resultDss.length - 1].x < MAX_AGE) { resultDss.push({x, y: 0}) } } else { // Если ДСС = 0, рисуем горизонтальную линию resultDss.push({x: MAX_AGE, y: 0}) } const bss = r.spirituality const resultBss = [] if (bss !== 0) { let x = 0 for (; x < MAX_AGE; x += bss) { resultBss.push({x, y: 0}, {x: x + bss / 2, y: 1}) } resultBss.push({x, y: 0}) } else { resultBss.push({x: 0, y: 0}, {x: MAX_AGE, y: 0}) } console.log(resultDss) const year = r.year ?? 0 const data = { labels: ['', '', '', '', '', '', '', '', '', '', '', ''], datasets: [ { label: 'БСС', borderColor: 'blue', backgroundColor: 'rgba(0, 0, 255, 0.2)', data: resultBss, }, { label: 'ДСС', borderColor: dss > 0 ? 'red' : 'gray', // Если ДСС = 0, цвет серый backgroundColor: 'rgba(255, 0, 0, 0.2)', data: resultDss, } ] } const config = { type: 'line', data: data, options: { animation: { duration: 0 }, scales: { x: { type: 'linear', position: 'bottom', ticks: { maxRotation: 0, minRotation: 0, stepSize: 1, autoSkip: false, callback: function (value, index, values) { return index % 5 === 0 ? year + value : '' } }, beginAtZero: true }, y: { type: 'linear', position: 'left', ticks: { stepSize: 1, max: 20, display: false } } }, elements: { line: { tension: 0.4 } } } } const $chart = document.getElementById('waveChart') $chart.style.height = '250px' const ctx = $chart.getContext('2d') new Chart(ctx, config) } function drawPartner (n, r, spir, stab) { const m = r.matrix return `

Партнёр ${n}

${r.date.getDate()}${r.date.getMonth() + 1}${r.date.getFullYear()} ${r.num1}${r.num2}${r.num3}${r.num4}
${m[1] || '-'}${m[4] || '-'}${m[7] || '-'} ${m[2] || '-'}${m[5] || '-'}${m[8] || '-'} ${m[3] || '-'}${m[6] || '-'}${m[9] || '-'}
БС1 = ${spir[`ds${n}`]}
ДС1 = ${stab[`bs${n}`]}
` /* return `

Партнёр ${n}

${r.date.getDate()}${r.date.getMonth() + 1}${r.date.getFullYear()}
${r.num1}${r.num2}${r.num3}${r.num4}
${m[1] || '—'}${m[4] || '—'}${m[7] || '—'}
${m[2] || '—'}${m[5] || '—'}${m[8] || '—'}
${m[3] || '—'}${m[6] || '—'}${m[9] || '—'}

БС1 = ${spir[`ds${n}`]}

ДС1 = ${stab[`bs${n}`]}

` */ } function calculate ($calcPartner_1, $calcPartner_2, $year) { // Переменные для хранения вычеслений const p1 = calcPartner($calcPartner_1) const p2 = calcPartner($calcPartner_2) // Вызов функции подсчёта стабильности/духовности const $resultCalc_1 = p1.matrix const $resultCalc_2 = p2.matrix const $stab = stability($resultCalc_1, $resultCalc_2) const $spir = spirituality($resultCalc_1, $resultCalc_2) // Округление чисел return { spirituality: round($spir.spirit, 1), stability: round($stab.stability, 1), part1: p1, stab: $stab, spir: $spir, part2: p2, year: $year, } } function stability ($m1, $m2) { const $bs1 = (($m1[7].length + $m1[4].length + $m1[1].length) * ($m1[3].length + $m1[2].length + $m1[1].length) * ($m1[9].length + $m1[5].length + $m1[1].length)) const $bs2 = (($m2[7].length + $m2[4].length + $m2[1].length) * ($m2[3].length + $m2[2].length + $m2[1].length) * ($m2[9].length + $m2[5].length + $m2[1].length)) // Вычесление сходства стабильности const $resultStability = ($bs1 * $bs2) / 365 return { stability: $resultStability, bs1: $bs1, bs2: $bs2 } } function spirituality ($m1, $m2) { const $ds1 = (($m1[2].length + $m1[5].length + $m1[8].length) * ($m1[3].length + $m1[6].length + $m1[9].length) * ($m1[3].length + $m1[5].length + $m1[7].length)) const $ds2 = (($m2[2].length + $m2[5].length + $m2[8].length) * ($m2[3].length + $m2[6].length + $m2[9].length) * ($m2[3].length + $m2[5].length + $m2[7].length)) // Вычесление сходства духовности const $resultSpirituality = ($ds1 * $ds2) / 365 return { spirit: $resultSpirituality, ds1: $ds1, ds2: $ds2 } } function calcPartner (date) { const $date = `${date.getDate()}${date.getMonth() + 1}${date.getFullYear()}` // Расчёт даты рождения const $firstNumber = sumDigits($date) const $secondNumber = sumDigits($firstNumber) const $thirdNumber = $firstNumber - $date[0] * 2 const $fourthNumber = sumDigits(Math.abs($thirdNumber)) const $allNumbers = $date + $firstNumber + $secondNumber + $thirdNumber + $fourthNumber // Образование матрицы const $matrix = [] for ( let i = 1; i < 10; i++ ) { const sss = `${i}` $matrix[i] = [...`${$allNumbers}`].reduce((res, n) => res + (n === sss ? n : ''), '') } return { matrix: $matrix, num1: $firstNumber, num2: $secondNumber, num3: $thirdNumber, num4: $fourthNumber, date, } } } Object.assign(exports, { initFamilyCalc }); })(__mods['_family'] = {}); /* ===== _charts.js ===== */ (function (exports) { const { countDigits, getFieldDate, getFieldValue, loadScript, saveAsPNG, sumDigits } = __mods['util']; async function initChartsCalc () { const $hex = document.querySelector('.charts-calculator') if ( !$hex ) return $hex.className = 'charts-calculator num-calculator' $hex.innerHTML = `

Графики развития качеств

` const chartScript = loadScript('https://fs.getcourse.ru/fileservice/file/download/a/186184/sc/208/h/4c35e01ef8e0b78e15c2784de4f9f247.js') $hex.querySelector('.calc-params .btn-primary').addEventListener('click', updateResult) $hex.querySelector('.calc-params .btn-warning').addEventListener('click', saveResult) async function saveResult () { const $res = $hex.querySelector('.calc-results') if ( !$res.children.length ) { $hex.querySelector('.calc-error').textContent = 'Выполните расчет' return } $res.insertAdjacentHTML('beforebegin', '
') await updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $print = $hex.querySelector('.calc-results') const date = getFieldValue('charts-param-date') await saveAsPNG($print, `РАСЧЕТ_ГРАФИКИ-${date}.png`) // await saveAsPDF($el) $print.remove() } async function updateResult () { const date = getFieldDate('charts-param-date') const gender = getFieldValue('charts-param-gender') === 'm' ? 4 : 3.5 if ( !date || !gender ) { $hex.querySelector('.calc-error').textContent = 'Укажите параметры расчета' return } await chartScript const day = date.getDate() const month = date.getMonth() + 1 const year = date.getFullYear() const $date = `${date.getDate()}${date.getMonth() + 1}${date.getFullYear()}` const num1 = sumDigits($date) const num2 = sumDigits(num1) const num3 = num1 - $date[0] * 2 const num4 = sumDigits(Math.abs(num3)); const count_all = countDigits($date + num1 + num2 + num3 + num4) const matrix = [ [count_all[1], count_all[4], count_all[7]], [count_all[2], count_all[5], count_all[8]], [count_all[3], count_all[6], count_all[9]] ] const x_param = [0, 0.5 * (matrix[1][0] - 1), 0.5 * matrix[1][0], 0.5 * (matrix[1][0] + 1)] for ( let i = 1; i <= count_all[4]; i++ ) { x_param.push(0.5 * (matrix[1][0] + 1) + i) } if ( count_all[4] > 0 ) { x_param.push(0.5 * (matrix[1][0] + 1) + matrix[0][1] + 0.125) } else { x_param.push(0.5 * (matrix[1][0] + 1) + 0.125) } const purpose = [] for ( const element of x_param ) { purpose.push((matrix[0][0] * element ** 2 + matrix[0][1] * element + matrix[0][2]) * gender) } const family = [] for ( const element of x_param ) { family.push((matrix[1][0] * element ** 2 + matrix[1][1] * element + matrix[1][2]) * gender) } const stability = [] for ( const element of x_param ) { stability.push((matrix[2][0] * element ** 2 + matrix[2][1] * element + matrix[2][2]) * gender) } const assessment = [] for ( const element of x_param ) { assessment.push((matrix[0][0] * element ** 2 + matrix[1][0] * element + matrix[2][0]) * gender) } const mol = [] for ( const element of x_param ) { mol.push((matrix[0][1] * element ** 2 + matrix[1][1] * element + matrix[2][1]) * gender) } const talent = [] for ( const element of x_param ) { talent.push((matrix[0][2] * element ** 2 + matrix[1][2] * element + matrix[2][2]) * gender) } const carnal = [] for ( const element of x_param ) { carnal.push((matrix[2][0] * element ** 2 + matrix[1][1] * element + matrix[0][2]) * gender) } const spiritual = [] for ( const element of x_param ) { spiritual.push((matrix[0][0] * element ** 2 + matrix[1][1] * element + matrix[2][2]) * gender) } const x_param_new = [] const purpose_new = [] const family_new = [] const stability_new = [] const assessment_new = [] const mol_new = [] const talent_new = [] const carnal_new = [] const spiritual_new = [] // for ( let i = x_param[1]; i <= x_param[x_param.length - 1] + 0.2; i += 0.125 ) { for ( let i = x_param[1]; i < x_param[x_param.length - 1]; i += 0.125 ) { x_param_new.push(i) } for ( let i = x_param[x_param.length - 1]; i <= 50; i += 0.125 ) { x_param_new.push(i) } x_param_new.unshift(0) for ( const element of x_param_new ) { purpose_new.push((matrix[0][0] * element ** 2 + matrix[0][1] * element + matrix[0][2]) * gender) } for ( const element of x_param_new ) { family_new.push((matrix[1][0] * element ** 2 + matrix[1][1] * element + matrix[1][2]) * gender) } for ( const element of x_param_new ) { stability_new.push((matrix[2][0] * element ** 2 + matrix[2][1] * element + matrix[2][2]) * gender) } for ( const element of x_param_new ) { assessment_new.push((matrix[0][0] * element ** 2 + matrix[1][0] * element + matrix[2][0]) * gender) } for ( const element of x_param_new ) { mol_new.push((matrix[0][1] * element ** 2 + matrix[1][1] * element + matrix[2][1]) * gender) } for ( const element of x_param_new ) { talent_new.push((matrix[0][2] * element ** 2 + matrix[1][2] * element + matrix[2][2]) * gender) } for ( const element of x_param_new ) { carnal_new.push((matrix[2][0] * element ** 2 + matrix[1][1] * element + matrix[0][2]) * gender) } for ( const element of x_param_new ) { spiritual_new.push((matrix[0][0] * element ** 2 + matrix[1][1] * element + matrix[2][2]) * gender) } const data_purpose_new = [] const data_family_new = [] const data_stability_new = [] const data_assessment_new = [] const data_mol_new = [] const data_talent_new = [] const data_carnal_new = [] const data_spiritual_new = [] for ( let i = 0; i < x_param_new.length; ++i ) { data_purpose_new.push({ x: purpose_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_family_new.push({ x: family_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_stability_new.push({ x: stability_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_assessment_new.push({ x: assessment_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_mol_new.push({ x: mol_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_talent_new.push({ x: talent_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_carnal_new.push({ x: carnal_new[i], y: x_param_new[i] }) } for ( let i = 0; i < x_param_new.length; ++i ) { data_spiritual_new.push({ x: spiritual_new[i], y: x_param_new[i] }) } let maxValue = 0 let dataset_all = [purpose, family, stability, assessment, mol, talent, carnal, spiritual] // console.log(dataset_all) let maxX = dataset_all[0][0] // Предполагаем, что первое значение x - это максимальное for ( let i = 0; i < dataset_all.length; i++ ) { for ( let j = 0; j < dataset_all[i].length; j++ ) { if ( dataset_all[i][j] > maxX ) { // Если текущее значение x больше предполагаемого максимального значения, обновляем maxX if ( dataset_all[i][j] * 2 < 100 ) { maxX = dataset_all[i][j] * 2 } else { maxX = 100 } } } } let minNumber = Math.min(...dataset_all.flat()) maxX = 100 // Исправление масштаба графика const mY = ~~(maxX * .75) / 8 // const mY = ~~(maxX * .5) / 8 const maxY = (x_param[x_param.length - 1] > mY ? x_param[x_param.length - 1] : mY) + Math.abs(x_param[1]) // const maxY = (x_param[x_param.length - 1] > 7 ? x_param[x_param.length - 1] : 7) + Math.abs(x_param[1]) const LINES = [ { label: 'ЦЕЛЬ', color: '#FF0000', data: data_purpose_new, formula: `${matrix[0][0]}x²+${matrix[0][1]}x+${matrix[0][2]}=Y`, X0: purpose[0], Xmin: purpose[1], Xmax: purpose[2], VG: purpose[3], LEVELS: purpose.slice(4, -1), LIM: purpose.slice(-1)[0], }, { label: 'СЕМЬЯ', color: '#FFA500', data: data_family_new, formula: `${matrix[1][0]}x²+${matrix[1][1]}x+${matrix[1][2]}=Y`, X0: family[0], Xmin: family[1], Xmax: family[2], VG: family[3], LEVELS: family.slice(4, -1), LIM: family.slice(-1)[0], }, { label: 'СТАБИЛЬНОСТЬ', color: '#000000', data: data_stability_new, formula: `${matrix[2][0]}x²+${matrix[2][1]}x+${matrix[2][2]}=Y`, X0: stability[0], Xmin: stability[1], Xmax: stability[2], VG: stability[3], LEVELS: stability.slice(4, -1), LIM: stability.slice(-1)[0], }, { label: 'САМООЦЕНКА', color: '#008000', data: data_assessment_new, formula: `${matrix[0][0]}x²+${matrix[1][0]}x+${matrix[2][0]}=Y`, X0: assessment[0], Xmin: assessment[1], Xmax: assessment[2], VG: assessment[3], LEVELS: assessment.slice(4, -1), LIM: assessment.slice(-1)[0], }, { label: 'БЫТ', color: '#0f93ff', data: data_mol_new, formula: `${matrix[0][1]}x²+${matrix[1][1]}x+${matrix[2][1]}=Y`, X0: mol[0], Xmin: mol[1], Xmax: mol[2], VG: mol[3], LEVELS: mol.slice(4, -1), LIM: mol.slice(-1)[0], }, { label: 'ТАЛАНТ', color: '#8b00ff', data: data_talent_new, formula: `${matrix[0][2]}x²+${matrix[1][2]}x+${matrix[2][2]}=Y`, X0: talent[0], Xmin: talent[1], Xmax: talent[2], VG: talent[3], LEVELS: talent.slice(4, -1), LIM: talent.slice(-1)[0], }, { label: 'ПЛОТСКАЯ', color: '#9b2d30', data: data_carnal_new, formula: `${matrix[2][0]}x²+${matrix[1][1]}x+${matrix[0][2]}=Y`, X0: carnal[0], Xmin: carnal[1], Xmax: carnal[2], VG: carnal[3], LEVELS: carnal.slice(4, -1), LIM: carnal.slice(-1)[0], }, { label: 'ДУХОВНАЯ', color: '#a4adab', data: data_spiritual_new, formula: `${matrix[0][0]}x²+${matrix[1][1]}x+${matrix[2][2]}=Y`, X0: spiritual[0], Xmin: spiritual[1], Xmax: spiritual[2], VG: spiritual[3], LEVELS: spiritual.slice(4, -1), LIM: spiritual.slice(-1)[0], }, ] let GROUPS = {} for ( const i of LINES ) { const g = GROUPS[i.formula] ??= {lines: [], min: i.Xmin, max: i.Xmax} g.lines.push(i) } GROUPS = Object.values(GROUPS).sort((a, b) => b.min - a.min || b.max - a.max) // LINES.sort((a, b) => b.Xmin - a.Xmin) const LIMITS = [ { label: 'Min', y: x_param[1] }, { label: 'Max', y: x_param[2] }, { label: 'ВГ', y: x_param[3] }, { label: 'Lim', y: x_param[x_param.length - 1] }, ] for ( let i = 1; i <= count_all[4]; i += 1 ) { LIMITS.push({ label: `${i} у.п`, y: x_param[3] + i }) } const d = [ ...LINES.map(i => { return { label: i.label, data: i.data, backgroundColor: i.color, borderColor: i.color, borderWidth: 2, pointStyle: function (context) { const index = context.dataIndex const dataPoint = context.dataset.data[index] for ( let i = 1; i <= count_all[4]; i += 1 ) { if ( dataPoint.y === x_param[3] + i ) { return 'circle'; } } if ( dataPoint.y === x_param[1] || dataPoint.y === x_param[2] || dataPoint.y === x_param[3] || dataPoint.y === x_param[x_param.length - 1] ) { return 'circle' } else { return false } }, } }), ...LIMITS.map(i => { return { label: i.label, data: [{ x: -10, y: i.y }, { x: 1000, y: i.y }], backgroundColor: '#000000', borderColor: '#000000', borderWidth: 1, borderDash: [5, 5], } }), { label: 'Ось Y', data: [{ x: 0, y: -10 }, { x: 0, y: 1000 }], backgroundColor: '#000000', borderColor: '#000000', borderWidth: 2, }, { label: 'Ось X', data: [{ x: -10, y: 0 }, { x: 1000, y: 0 }], backgroundColor: '#000000', borderColor: '#000000', borderWidth: 2, } ] const $result = $hex.querySelector('.calc-results') $result.innerHTML = `
${day}${month}${year} ${num1}${num2}${num3}${num4}
${count_all[1]}${count_all[4]}${count_all[7]} ${count_all[2]}${count_all[5]}${count_all[8]} ${count_all[3]}${count_all[6]}${count_all[9]}${count_all[0]}
${GROUPS.map(g => `
${g.lines.map(i => `
${i.label}
`).join('')}
`).join('')}
${x_param.slice(4, -1).map((p, index) => ``).join('')} ${LINES.map(i => ` ${i.LEVELS.map(p => ``).join('')} `).join('')}
Линия График X=${x_param[0]} Xmin=${x_param[1]} Xmax=${x_param[2]} ВГ=${x_param[3]}${index + 1}УП=${p}Lim=${x_param.slice(-1)[0]}
${i.label} ${i.formula} ${i.X0} ${i.Xmin} ${i.Xmax} ${i.VG}УП=${p}Lim=${i.LIM}
` // maxX = 100 // Исправление масштаба графика // maxX = Math.max(maxX, 50) // Исправление масштаба графика const $chart = $hex.querySelector('.chart') const rect = $chart.getBoundingClientRect() $chart.style.height = rect.width / maxX * maxY * 8 + 'px' // $chart.style.minHeight = maxY / 0.5 * 4 * 15 + 'px' // $chart.style.maxHeight = maxY / 0.5 * 4 * 15 + 'px' const MAJOR_TICK = 2 const myChart = new Chart($chart.getContext('2d'), { type: 'line', data: { datasets: d, }, options: { scales: { x: { type: 'linear', position: 'bottom', min: 0, // max: 100, max: maxX, ticks: { maxRotation: 0, minRotation: 0, stepSize: 1, color: '#000000', autoSkip: false, callback: function (value, index, values) { if ( value % MAJOR_TICK === 0 ) return value return '' } }, grid: { color: (a) => { // console.log(a) return a.tick.value % MAJOR_TICK === 0 ? '#888' : '#ddd' } }, beginAtZero: true }, y: { type: 'linear', position: 'left', beginAtZero: true, min: x_param[0] - 0.5, // min: 0, max: maxY, ticks: { stepSize: 0.125, autoSkip: false, callback: function (value) { if ( value === x_param[1] ) return 'Min ' + value if ( value === x_param[2] ) return 'Max ' + value if ( value === x_param[3] ) return 'ВГ ' + value if ( value === x_param.slice(-1)[0] ) return 'Lim ' + value for ( let i = 1; i <= 5; i++ ) { if ( value === x_param[3] + i ) return i + ' у.п' } if ( value % 0.5 === 0 ) value return '' } }, } }, animation: { duration: 0 }, maintainAspectRatio: false, aspectRatio: 1, responsive: false, plugins: { tooltip: { callbacks: { label: function (context) { // console.log(context) return `${context.dataset.label} (возраст ${context.raw.x.toFixed(1)})` // Проверяем индекс элемента для скрытия метки /* if ( context.dataIndex === 3 ) { return '' // Пустая строка для скрытия метки } else { return context.label } */ } }, // filter: (line) => { // return line.datasetIndex < 8 // } }, legend: { display: false, labels: { filter: (line) => { return line.datasetIndex < 8 } } } } } }) } } Object.assign(exports, { initChartsCalc }); })(__mods['_charts'] = {}); /* ===== _think.js ===== */ (function (exports) { const { countDigits, getFieldDate, getFieldValue, loadScript, saveAsPNG, sumDigits } = __mods['util']; const TYPE_NAME = [ '----', 'Наводящий порядок', 'Копирующий', 'Создающий свой мир', 'Ищущий новое', 'Революционер', 'Разрушитель, бунтарь', ] async function initThinkCalc () { const $hex = document.querySelector('.think-calculator') if ( !$hex ) return $hex.className = 'think-calculator num-calculator' $hex.innerHTML = `

Калькулятор Типов Мышления

` const chartScript = loadScript('https://fs.getcourse.ru/fileservice/file/download/a/186184/sc/208/h/4c35e01ef8e0b78e15c2784de4f9f247.js') $hex.querySelector('.calc-params .btn-primary').addEventListener('click', updateResult) $hex.querySelector('.calc-params .btn-warning').addEventListener('click', saveResult) async function saveResult () { const $res = $hex.querySelector('.calc-results') if ( !$res.children.length ) { $hex.querySelector('.calc-error').textContent = 'Выполните расчет' return } $res.insertAdjacentHTML('beforebegin', '
') await updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $print = $hex.querySelector('.calc-results') const date = getFieldValue('think-param-date') await saveAsPNG($print, `РАСЧЕТ_ТМ-${date}.png`) // await saveAsPDF($el) $print.remove() } async function updateResult () { const date = getFieldDate('think-param-date') if ( !date ) { $hex.querySelector('.calc-error').textContent = 'Выберите дату' return } $hex.querySelector('.calc-error').textContent = '' await chartScript const day = date.getDate() const month = date.getMonth() + 1 let year = date.getFullYear() const $date = `${day}${month}${year}` const num1 = sumDigits($date) const num2 = sumDigits(num1) const num3 = num1 - $date[0] * 2 const num4 = sumDigits(Math.abs(num3)); const m = countDigits($date + num1 + num2 + num3 + num4) const data_1 = [] const data_2 = [] const data = [] for ( let i = 0; i < 101; i++ ) { const $date = `${day}${month}${year + i}` const num1 = sumDigits($date) const num2 = sumDigits(num1) const num3 = (num1 - $date[0] * 2) const num4 = sumDigits(Math.abs(num3)); const count_all = countDigits($date + num1 + num2 + num3 + num4) const matrix = [ [count_all[1], count_all[4], count_all[7]], [count_all[2], count_all[5], count_all[8]], [count_all[3], count_all[6], count_all[9]] ] const d = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0] const triangle = Math.abs((matrix[0][0] * matrix[1][1] * matrix[2][2] + matrix[1][0] * matrix[2][1] * matrix[0][2] + matrix[0][1] * matrix[2][0] * matrix[1][2]) - (matrix[0][2] * matrix[1][1] * matrix[2][0] + matrix[0][1] * matrix[1][0] * matrix[2][2] + matrix[0][0] * matrix[2][1] * matrix[1][2])) let type = 0 if ( d > 0 && triangle === 0 ) type += 6 if ( d < 0 && triangle === 0 ) type += 5 if ( d === 0 && triangle !== 0 ) type += 4 if ( d > 0 && triangle !== 0 ) type += 3 if ( d < 0 && triangle !== 0 ) type += 2 if ( d === 0 && triangle === 0 ) type += 1 data.push(type) if ( i < 50 ) data_1.push(type) else data_2.push(type) } const labels_1 = [] const labels_2 = [] for ( let i = 0; i < 50; i++ ) { labels_1.push(i) } for ( let i = 50; i <= 100; i++ ) { labels_2.push(i) } const $result = $hex.querySelector('.calc-results') $result.innerHTML = `

Доминирующий тип по дате рождения

№${data[0]} — ${TYPE_NAME[data[0]]}
${day}${month}${year} ${num1}${num2}${num3}${num4}
${m[1]}${m[4]}${m[7]} ${m[2]}${m[5]}${m[8]} ${m[3]}${m[6]}${m[9]}${m[0]}
${data.slice(0, 34).map((t, i) => ``).join('')}
ГодВозрТип
${year + i}${i}${t}
${data.slice(34, 67).map((t, i) => ``).join('')}
ГодВозрТип
${year + i + 34}${i + 34}${t}
${data.slice(67).map((t, i) => ``).join('')}
ГодВозрТип
${year + i + 67}${i + 67}${t}
` new Chart($hex.querySelector('.chart1'), { type: 'line', data: { labels: labels_1, datasets: [{ fill: false, pointRadius: 5, backgroundColor: 'rgba(255, 0, 0, 0.2)', borderColor: 'rgba(255,0,0,0.5)', data: data_1 }] }, options: { responsive: true, plugins: { legend: { display: false // установите значение false, чтобы скрыть легенду } }, animation: { duration: 0 }, title: { display: true, fontSize: 16 }, elements: { line: { tension: 0.1 } }, scales: { x: { ticks: { maxRotation: 0, minRotation: 0, stepSize: 1, autoSkip: false, }, }, y: { ticks: { beginAtZero: true, userCallback: function (label, index, labels) { // when the floored value is the same as the value we have a whole number if ( Math.floor(label) === label ) { return label } }, stepSize: 1, callback: function (value, index, values) { return value // Добавляем знак % к значениям меток } }, min: 0, }, }, } }) new Chart($hex.querySelector('.chart2'), { type: 'line', data: { labels: labels_2, datasets: [{ fill: false, pointRadius: 5, backgroundColor: 'rgba(255, 0, 0, 0.2)', borderColor: 'rgba(255,0,0,0.5)', data: data_2, }] }, options: { responsive: true, plugins: { legend: { display: false // установите значение false, чтобы скрыть легенду } }, animation: { duration: 0 }, title: { display: true, fontSize: 16 }, elements: { line: { tension: 0.1 } }, scales: { x: { ticks: { maxRotation: 0, minRotation: 0, stepSize: 1, autoSkip: false, }, }, y: { ticks: { beginAtZero: true, userCallback: function (label, index, labels) { // when the floored value is the same as the value we have a whole number if ( Math.floor(label) === label ) { return label } }, stepSize: 1, callback: function (value, index, values) { return value // Добавляем знак % к значениям меток } }, min: 0, } }, } }) } } Object.assign(exports, { initThinkCalc }); })(__mods['_think'] = {}); /* ===== _words.js ===== */ (function (exports) { // Работа внутри initWordCalc /* авто-инициализация убрана: запуск из main.js */ const { countDigits, getFieldDate, getFieldValue, loadScript, saveAsPNG, sumDigits } = __mods['util']; const CONVERT_TO_TOP = { '111': 1, '011': 2, '101': 3, '001': 4, '110': 5, '010': 6, '100': 7, '000': 8, } async function initWordCalc() { const $word = document.querySelector('.word-calculator'); if (!$word) return; // Проверяем наличие выше элемента с классом "o-dopword-calculator" const hasDopWordAbove = document.querySelector('.o-dopword-calculator'); $word.className = 'word-calculator num-calculator'; $word.innerHTML = `

${hasDopWordAbove ? 'Калькулятор стандартной даты' : 'Алфавитный калькулятор'}

`; $word.querySelector('.btn-primary').addEventListener('click', updateResult); $word.querySelector('.calc-params .btn-warning').addEventListener('click', saveResult) async function saveResult() { const $res = $word.querySelector('.calc-results') if (!$res.children.length) { $word.querySelector('.calc-error').textContent = 'Выполните расчет' return } $res.insertAdjacentHTML('beforebegin', '
') await updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $print = $word.querySelector('.calc-results') const inputText = document.querySelector('#calc-word-mains').value.trim(); const today = `${inputText}-${new Date().toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' }).replace(/\./g, '-')}`; await saveAsPNG($print, `РАСЧЕТ_ДС-${today}.png`) // await saveAsPDF($el) $print.remove() } function updateResult() { const inputText = document.querySelector('#calc-word-mains')?.value?.trim(); const selectedLanguage = document.querySelector('#language-select')?.value; const errorContainer = document.querySelector('.calc-error'); const resultContainer = document.querySelector('.calc-results'); if (!inputText) { errorContainer.textContent = 'Введите текст для расчета.'; resultContainer.textContent = ''; return; } if (!selectedLanguage) { errorContainer.textContent = 'Выберите язык перед расчетом.'; resultContainer.textContent = ''; return; } // Проверяем наличие элемента o-dopword-calculator const hasDopWordAbove = document.querySelector('.o-dopword-calculator'); // Берем алфавит на основе выбранного языка const alphabetMap = alphabetMaps[selectedLanguage]; if (hasDopWordAbove) { // Проверка: inputText должен содержать и буквы, и цифры const hasLetters = new RegExp(`[${Object.keys(alphabetMaps[selectedLanguage]).join('')}]`, 'i').test(inputText); const hasDigits = /\d/.test(inputText); if (!hasLetters || !hasDigits) { document.querySelector('.calc-error').textContent = 'Текст должен содержать как минимум одну букву и одну цифру.'; document.querySelector('.calc-results').textContent = ''; return; } } else { // Проверка: inputText должен содержать только буквы из выбранного алфавита const validLettersPattern = new RegExp(`^[${Object.keys(alphabetMaps[selectedLanguage]).join('')}]+$`, 'i'); if (!validLettersPattern.test(inputText)) { document.querySelector('.calc-error').textContent = 'Текст должен содержать только буквы выбранного языка.'; document.querySelector('.calc-results').textContent = ''; return; } } document.querySelector('.calc-error').textContent = ''; const numbers = textToNumbers(inputText); const firstNumber = numbers.reduce((sum, num) => sum + num, 0); const secondNumber = sumDigits(firstNumber); const multiplier = 2; const firstDigit = numbers[0] || 0; const thirdNumber = firstNumber - firstDigit * multiplier; const fourthNumber = sumDigits(thirdNumber); distributeResultsToTable(numbers, { firstNumber, secondNumber, thirdNumber, fourthNumber }); //drawDay(); //calc(); const updateHexResult = initHexagramCalc(); updateHexResult(numbers.join('')) } const alphabetMaps = { 'ru': { 'а': 1, 'й': 1, 'у': 1, 'э': 1, 'б': 2, 'к': 2, 'ф': 2, 'ю': 2, 'в': 3, 'л': 3, 'х': 3, 'я': 3, 'г': 4, 'м': 4, 'ц': 4, 'д': 5, 'н': 5, 'ч': 5, 'е': 6, 'о': 6, 'ш': 6, 'ё': 7, 'п': 7, 'щ': 7, 'ж': 8, 'р': 8, 'ъ': 8, 'з': 9, 'с': 9, 'ы': 9, 'и': 0, 'т': 0, 'ь': 0 }, 'en': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6 }, 'de': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6, 'ä': 7, 'ö': 8, 'ü': 9 }, 'fr': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'ô': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'û': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6, 'o': 5, }, 'be': { 'а': 1, 'б': 2, 'в': 3, 'г': 4, 'д': 5, 'е': 6, 'ё': 7, 'ж': 8, 'з': 9, 'і': 0, 'й': 1, 'к': 2, 'л': 3, 'м': 4, 'н': 5, 'о': 6, 'п': 7, 'р': 8, 'с': 9, 'т': 0, 'у': 1, 'ф': 2, 'х': 3, 'ц': 4, 'ч': 5, 'ш': 6, 'щ': 7, 'ъ': 8, 'ы': 9, 'ь': 0, 'э': 1, 'ю': 2, 'я': 3 }, 'ga': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'r': 7, 's': 8, 't': 9, 'u': 0, 'v': 1, 'w': 2, 'x': 3, 'y': 4, 'z': 5 }, 'it': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6 }, 'kk': { 'а': 1, 'з': 1, 'ө': 1, 'һ': 1, 'ю': 1, 'ә': 2, 'и': 2, 'п': 2, 'ц': 2, 'я': 2, 'б': 3, 'й': 3, 'р': 3, 'ч': 3, 'в': 4, 'к': 4, 'с': 4, 'ш': 4, 'г': 5, 'қ': 5, 'т': 5, 'щ': 5, 'ғ': 6, 'л': 6, 'у': 6, 'ъ': 6, 'д': 7, 'м': 7, 'ұ': 7, 'ы': 7, 'е': 8, 'н': 8, 'ү': 8, 'і': 8, 'ё': 9, 'ң': 9, 'ф': 9, 'ь': 9, 'ж': 0, 'о': 0, 'х': 0, 'э': 0 }, 'lt': { 'a': 0, 'b': 1, 'c': 2, 'č': 3, 'd': 4, 'e': 5, 'ė': 6, 'f': 7, 'g': 8, 'h': 9, 'i': 0, 'į': 1, 'j': 2, 'k': 3, 'l': 4, 'm': 5, 'n': 6, 'o': 7, 'p': 8, 'r': 9, 's': 0, 'š': 1, 't': 2, 'u': 3, 'ū': 4, 'v': 5, 'z': 6 }, 'pl': { 'a': 1, 'ą': 2, 'b': 3, 'c': 4, 'ć': 5, 'd': 6, 'e': 7, 'ę': 8, 'f': 9, 'g': 0, 'h': 1, 'i': 2, 'j': 3, 'k': 4, 'l': 5, 'ł': 6, 'm': 7, 'n': 8, 'ń': 9, 'o': 0, 'ó': 1, 'p': 2, 'q': 3, 'r': 4, 's': 5, 'ś': 6, 't': 7, 'u': 8, 'v': 9, 'w': 0, 'x': 1, 'y': 2, 'z': 3, 'ź': 4, 'ż': 5 }, 'sv': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6 }, 'uk': { 'а': 1, 'б': 2, 'в': 3, 'г': 4, 'ґ': 5, 'д': 6, 'е': 7, 'є': 8, 'ж': 9, 'з': 0, 'и': 1, 'і': 2, 'ї': 3, 'й': 4, 'к': 5, 'л': 6, 'м': 7, 'н': 8, 'о': 9, 'п': 0, 'р': 1, 'с': 2, 'т': 3, 'у': 4, 'ф': 5, 'х': 6, 'ц': 7, 'ч': 8, 'ш': 9, 'щ': 0, 'ь': 1, 'ю': 2, 'я': 3 }, 'el': { 'α': 1, 'Α': 1, 'λ': 1, 'Λ': 1, 'φ': 1, 'Φ': 1, 'β': 2, 'Β': 2, 'μ': 2, 'Μ': 2, 'χ': 2, 'Χ': 2, 'γ': 3, 'Γ': 3, 'ν': 3, 'Ν': 3, 'ψ': 3, 'Ψ': 3, 'δ': 4, 'Δ': 4, 'ξ': 4, 'Ξ': 4, 'ω': 4, 'Ω': 4, 'ε': 5, 'Ε': 5, 'ο': 5, 'Ο': 5, 'ζ': 6, 'Ζ': 6, 'π': 6, 'Π': 6, 'η': 7, 'Η': 7, 'ρ': 7, 'Ρ': 7, 'θ': 8, 'Θ': 8, 'σ': 8, 'Σ': 8, 'ς': 8, 'ι': 9, 'Ι': 9, 'τ': 9, 'Τ': 9, 'κ': 0, 'Κ': 0, 'υ': 0, 'Υ': 0, 'μ': 0, 'ύ': 0 } }; function textToNumbers(input) { // Получаем выбранный язык (предполагаем, что он всегда указан) const selectedLanguage = document.querySelector('#language-select').value; // Берем алфавит на основе выбранного языка const alphabetMap = alphabetMaps[selectedLanguage]; // Проверяем наличие элемента с классом '.o-dopword-calculator' const hasDopWordAbove = document.querySelector('.o-dopword-calculator'); if (hasDopWordAbove) { // Преобразуем текст, сохраняя цифры и конвертируя буквы return [...input].map(char => { const lowerChar = char.toLowerCase(); if (alphabetMap[lowerChar] !== undefined) { // Буквы из выбранного алфавита — конвертируем через alphabetMap return alphabetMap[lowerChar]; } else if (/[0-9]/.test(char)) { // Цифры — оставляем без изменений return parseInt(char, 10); } else { // Все остальное — игнорируем return null; } }).filter(value => value !== null); // Убираем игнорируемые символы } else { // Исходная логика без сохранения цифр // input = input.toLowerCase().replace(/[^а-яёa-z]/g, ''); input = input.toLowerCase().replace(/[^\p{L}]/gu, ''); return [...input].map(char => alphabetMap[char] || 0); } } function sumDigits(num) { return [...`${Math.abs(num)}`].map(s => parseInt(s, 10)).reduce((sum, n) => sum + n, 0); } function distributeResultsToTable(numbers, { firstNumber, secondNumber, thirdNumber, fourthNumber }) { const tableHtml = `

Психоматрица

Основное значение

`; document.querySelector('.calc-results').innerHTML = tableHtml; const numbersText = numbers.join(''); document.querySelector('.psychomatrix_numbers').textContent = numbersText; const matrix_all = { '1': document.querySelector('.numbers_1'), '2': document.querySelector('.numbers_2'), '3': document.querySelector('.numbers_3'), '4': document.querySelector('.numbers_4'), '5': document.querySelector('.numbers_5'), '6': document.querySelector('.numbers_6'), '7': document.querySelector('.numbers_7'), '8': document.querySelector('.numbers_8'), '9': document.querySelector('.numbers_9'), }; // Очищаем ячейки Object.values(matrix_all).forEach(cell => cell.textContent = ''); function distributeDigits(number) { const digits = String(number).split(''); digits.forEach(digit => { if (matrix_all[digit]) matrix_all[digit].textContent += digit; }); } // Распределяем цифры слова и подсчетов distributeDigits(numbersText); distributeDigits(firstNumber); distributeDigits(secondNumber); distributeDigits(thirdNumber); distributeDigits(fourthNumber); // Дополнительные цифры const allNumbers = `${firstNumber}${secondNumber}${thirdNumber}${fourthNumber}`; document.querySelector('.dop_numbers').textContent = allNumbers; function countDigits(classes) { return classes.reduce((sum, className) => { const el = document.querySelector(`.${className}`); return sum + (el?.textContent.length || 0); }, 0); } document.querySelector('.goal').textContent = countDigits(['numbers_1', 'numbers_4', 'numbers_7']); document.querySelector('.family').textContent = countDigits(['numbers_2', 'numbers_5', 'numbers_8']); document.querySelector('.habit').textContent = countDigits(['numbers_3', 'numbers_6', 'numbers_9']); document.querySelector('.selfrating').textContent = countDigits(['numbers_1', 'numbers_2', 'numbers_3']); document.querySelector('.life').textContent = countDigits(['numbers_4', 'numbers_5', 'numbers_6']); document.querySelector('.potential').textContent = countDigits(['numbers_7', 'numbers_8', 'numbers_9']); document.querySelector('.spiritual').textContent = countDigits(['numbers_1', 'numbers_5', 'numbers_9']); document.querySelector('.carnals').textContent = countDigits(['numbers_3', 'numbers_5', 'numbers_7']); } // Интеграция с гексаграммой const updateHexResult = initHexagramCalc(); updateHexResult(numbers.join('')); } // работаем с гекси нового формата const TYPE_NAME = [ '----', 'Наводящий порядок', 'Копирующий', 'Создающий свой мир', 'Ищущий новое', 'Революционер', 'Разрушитель, бунтарь', ] function initHexagramCalc() { function updateResult(code) { const $result = document.querySelector('.hexagram_full'); const result = calc(code); $result.innerHTML = `

Гексаграмма

${drawDay(result)}

Тип мышления

${result.type_text_think} `; } function drawDay(r) { return `

Прямая ${r.topName}

${r.hexagram.map(h => (h === 1 ? '' : '')).join('')}

Противоположная ${r.bottomName}

${r.oneCalculate}${r.twoCalculate}${r.threeCalculate}${r.fourCalculate}
${r.matrix[1]}${r.matrix[4]}${r.matrix[7]} ${r.matrix[2]}${r.matrix[5]}${r.matrix[8]} ${r.matrix[3]}${r.matrix[6]}${r.matrix[9]}${r.matrix[0]}
`; } function calc(code) { const oneCalculate = [...code].reduce((sum, digit) => sum + parseInt(digit, 10), 0); const twoCalculate = [...`${oneCalculate}`].reduce((sum, digit) => sum + parseInt(digit, 10), 0); const threeCalculate = Math.abs(oneCalculate - parseInt(code[0], 10) * 2); const fourCalculate = [...`${threeCalculate}`].reduce((sum, digit) => sum + parseInt(digit, 10), 0); const matrix = countDigits(`${code}${oneCalculate}${twoCalculate}${threeCalculate}${fourCalculate}`); let hexagram = [] let $althexagram = [] hexagram[0] = matrix[4] % 2 && 1 hexagram[1] = matrix[7] % 2 && 1 hexagram[2] = (matrix[0] + matrix[3]) % 2 && 1 hexagram[3] = (matrix[8] + matrix[5]) % 2 && 1 hexagram[4] = (matrix[1] + matrix[2]) % 2 && 1 hexagram[5] = (matrix[6] + matrix[9]) % 2 && 1 let $top = CONVERT_TO_TOP[`${hexagram[0]}${hexagram[1]}${hexagram[2]}`] let $bottom = CONVERT_TO_TOP[`${hexagram[3]}${hexagram[4]}${hexagram[5]}`] let $hexotable = [ [1, 43, 14, 34, 9, 5, 26, 11], [10, 58, 38, 54, 61, 60, 41, 19], [13, 49, 30, 55, 37, 63, 22, 36], [25, 17, 21, 51, 42, 3, 27, 24], [44, 28, 50, 32, 57, 48, 18, 46], [6, 47, 64, 40, 59, 29, 4, 7], [33, 31, 56, 62, 53, 39, 52, 15], [12, 45, 35, 16, 20, 8, 23, 2] ] let $nametable = [ 'Творчество', 'Исполнение', 'Начальная трудность', 'Недоразвитость', 'Необходимость ждать', 'Суд', 'Войско', 'Приближение', 'Воспитание малым', 'Наступление', 'Расцвет', 'Упадок', 'Единомышленники, родня', 'Владение великим', 'Смирение', 'Вольность', 'Последование', 'Исправление порчи', 'Посещение', 'Созерцание', 'Стиснутые зубы', 'Убранство', 'Разрушение', 'Возврат', 'Беспорочность', 'Воспитание великим', 'Питание', 'Переразвитие великого', 'Повторная опасность, бездна', 'Сияние', 'Взаимодействие', 'Постоянство', 'Бегство', 'Мощь великого', 'Восход', 'Поражение света', 'Домашние', 'Разлад', 'Препятствие', 'Разрешение', 'Убыль', 'Приумножение', 'Выход', 'Перечение', 'Воссоединение', 'Подъём', 'Истощение', 'Колодец', 'Смена', 'Жертвенник', 'Возбуждение, молния', 'Сосредоточенность', 'Течение', 'Невеста', 'Изобилие', 'Странствие', 'Проникновение', 'Радость', 'Раздробленность', 'Ограничение', 'Внутренняя правда', 'Переразвитие малого', 'Уже конец', 'Ещё не конец' ] for (let $i = 0; $i < 6; $i++) { if (hexagram[$i] === 1) { $althexagram[$i] = 0 } else { $althexagram[$i] = 1 } } let $alttop = CONVERT_TO_TOP[`${$althexagram[0]}${$althexagram[1]}${$althexagram[2]}`] let $altbottom = CONVERT_TO_TOP[`${$althexagram[3]}${$althexagram[4]}${$althexagram[5]}`] let $hexnumber = $hexotable[$bottom - 1][$top - 1] let $hexname = $nametable[$hexnumber - 1] let $althexnumber = $hexotable[$altbottom - 1][$alttop - 1] let $althexname = $nametable[$althexnumber - 1] let topName = `${$hexnumber} ${$hexname}` let bottomName = `${$althexnumber} ${$althexname}` const matrix_for_think = [ [matrix[1], matrix[4], matrix[7]], [matrix[2], matrix[5], matrix[8]], [matrix[3], matrix[6], matrix[9]] ] const d = matrix_for_think[0][0] * matrix_for_think[1][1] - matrix_for_think[0][1] * matrix_for_think[1][0] const triangle = Math.abs( matrix_for_think[0][0] * matrix_for_think[1][1] * matrix_for_think[2][2] + matrix_for_think[1][0] * matrix_for_think[2][1] * matrix_for_think[0][2] + matrix_for_think[0][1] * matrix_for_think[2][0] * matrix_for_think[1][2] - matrix_for_think[0][2] * matrix_for_think[1][1] * matrix_for_think[2][0] - matrix_for_think[0][1] * matrix_for_think[1][0] * matrix_for_think[2][2] - matrix_for_think[0][0] * matrix_for_think[2][1] * matrix_for_think[1][2] ); let type = 0 if (d > 0 && triangle === 0) type += 6 if (d < 0 && triangle === 0) type += 5 if (d === 0 && triangle !== 0) type += 4 if (d > 0 && triangle !== 0) type += 3 if (d < 0 && triangle !== 0) type += 2 if (d === 0 && triangle === 0) type += 1 const TYPE_NAME = [ '----', 'Наводящий порядок', 'Копирующий', 'Создающий свой мир', 'Ищущий новое', 'Революционер', 'Разрушитель, бунтарь', ] const type_text_think = `
№${type} — ${TYPE_NAME[type]}
` return { oneCalculate, twoCalculate, threeCalculate, fourCalculate, topName, bottomName, hexagram, matrix, type_text_think }; } function getHexagramIndex(hex) { const binaryString = hex.map(h => (h === 1 ? '1' : '0')).join(''); const binaryToIndex = parseInt(binaryString, 2); return HEX_TABLE[binaryToIndex]; } function countDigits(str) { const counts = Array(10).fill(0); for (const char of str) { counts[parseInt(char, 10)] += 1; } return counts; } return updateResult; } // Таблица соответствия бинарного кода и номера гексаграммы const HEX_TABLE = [ 1, 43, 14, 34, 9, 5, 26, 11, 10, 58, 38, 54, 61, 60, 41, 19, 13, 49, 30, 55, 37, 63, 22, 36, 25, 17, 21, 51, 42, 3, 27, 24, 44, 28, 50, 32, 57, 48, 18, 46, 6, 47, 64, 40, 59, 29, 4, 7, 33, 31, 56, 62, 53, 39, 52, 15, 12, 45, 35, 16, 20, 8, 23, 2, ]; // Названия гексаграмм const HEX_NAMES = [ 'Творчество', 'Исполнение', 'Начальная трудность', 'Недоразвитость', 'Необходимость ждать', 'Суд', 'Войско', 'Приближение', 'Воспитание малым', 'Наступление', 'Расцвет', 'Упадок', 'Единомышленники, родня', 'Владение великим', 'Смирение', 'Вольность', 'Последование', 'Исправление порчи', 'Посещение', 'Созерцание', 'Стиснутые зубы', 'Убранство', 'Разрушение', 'Возврат', 'Беспорочность', 'Воспитание великим', 'Питание', 'Переразвитие великого', 'Повторная опасность, бездна', 'Сияние', 'Взаимодействие', 'Постоянство', 'Бегство', 'Мощь великого', 'Восход', 'Поражение света', 'Домашние', 'Разлад', 'Препятствие', 'Разрешение', 'Убыль', 'Приумножение', 'Выход', 'Перечение', 'Воссоединение', 'Подъём', 'Истощение', 'Колодец', 'Смена', 'Жертвенник', 'Возбуждение, молния', 'Сосредоточенность', 'Течение', 'Невеста', 'Изобилие', 'Странствие', 'Проникновение', 'Радость', 'Раздробленность', 'Ограничение', 'Внутренняя правда', 'Переразвитие малого', 'Уже конец', 'Ещё не конец', ]; Object.assign(exports, { initWordCalc }); })(__mods['_words'] = {}); /* ===== _timeline.js ===== */ (function (exports) { // Работа внутри initWordCalc /* авто-инициализация убрана: запуск из main.js */ const { countDigits, getFieldDate, getFieldValue, loadScript, saveAsPNG, sumDigits } = __mods['util']; const PHI = 0.618; async function initTimeline() { const $container = document.querySelector('.timeline-calculator'); if (!$container) return; // очищаем и рисуем новый интерфейс $container.className = 'timeline-calculator'; $container.innerHTML = `

Метод золотого сечения

Прошлое Будущее
`; // Навешиваем обработчики на те же селекторы / кнопки, что и в оригинале document.getElementById('method').addEventListener('change', updateMethodDescription); $container.querySelector('.btn-primary').addEventListener('click', updateResult); $container.querySelector('.calc-params .btn-save').addEventListener('click', saveResult); // Показать описание метода изначально updateMethodDescription(); // ------------------ ФУНКЦИИ ------------------ function updateMethodDescription() { const method = document.getElementById('method').value; const description = document.getElementById('method-description'); const warning = document.getElementById('equal-distance-warning'); if (method === 'big') { description.innerHTML = ` Большой метод: Сложный алгоритм с множественными расчетами через золотое сечение. Создает точки M, P, K, O для определения различных типов событий в будущем. Введите годы трех событий в прошлом. `; //warning.style.display = 'none'; } else { description.innerHTML = ` Малый метод (циклический): Циклический расчет для равномерно распределенных событий. Определяет следующий цикл (точка D) и проверочное событие (точка E) через золотое сечение. Для малого метода события должны находиться на равных расстояниях (АВ = ВС). `; // warning.style.display = 'block'; } } function updateResult() { // wrapper: вызывает основную логику и заполняет .calc-results calculateEvents(); } function calculateEvents() { try { const errorDiv = document.getElementById('error'); const resultsDiv = document.getElementById('results'); if (!errorDiv || !resultsDiv) { console.error('Не найдены необходимые элементы DOM'); return; } errorDiv.style.display = 'none'; const yearAInput = document.getElementById('yearA'); const yearBInput = document.getElementById('yearB'); const yearCInput = document.getElementById('yearC'); const methodInput = document.getElementById('method'); if (!yearAInput || !yearBInput || !yearCInput || !methodInput) { throw new Error('Не найдены поля ввода'); } const yearA = parseInt(yearAInput.value, 10); const yearB = parseInt(yearBInput.value, 10); const yearC = parseInt(yearCInput.value, 10); const method = methodInput.value; if (!yearA || !yearB || !yearC) { throw new Error('Пожалуйста, заполните все поля годов'); } if (yearA >= yearB || yearB >= yearC) { throw new Error('Годы должны быть в порядке возрастания: A < B < C'); } let calculations; if (method === 'big') { calculations = performBigMethodCalculations(yearA, yearB, yearC); } else { calculations = performSmallMethodCalculations(yearA, yearB, yearC); } displayResults(calculations, method); visualizeTimeline(calculations, method); // показать блок результатов — используем классы/видимость как нужно // убираем/добавляем классы .hide const summary = document.querySelector('.result-summary'); const calcDetails = document.getElementById('calculations'); if (summary) summary.classList.remove('hide'); if (calcDetails) calcDetails.classList.remove('hide'); $('.calc-results').removeClass('hide'); } catch (error) { console.error('Ошибка в calculateEvents:', error); const errorDiv = document.getElementById('error'); if (errorDiv) { errorDiv.textContent = error.message; errorDiv.style.display = 'block'; $('.calc-results').addClass('hide'); } } } function performBigMethodCalculations(yearA, yearB, yearC) { const AC = yearC - yearA; const CM = AC; const yearM = yearC + CM; const CK = CM / PHI; const yearK = yearC + CK; const MK = CK - CM; const KP = MK * PHI; const yearP = yearK - KP; const KO = MK / PHI; const yearO = yearK + KO; return { input: { yearA, yearB, yearC }, results: { yearM: Math.round(yearM), yearK: Math.round(yearK), yearP: Math.round(yearP), yearO: Math.round(yearO) }, distances: { AC, CM, CK, MK, KP, KO }, calculations: { step1: `СМ = АС = ${yearC} - ${yearA} = ${AC} лет`, step2: `СК = СМ : φ = ${CM} : ${PHI} = ${Math.round(CK)} лет`, step3: `МК = СК - СМ = ${Math.round(CK)} - ${CM} = ${Math.round(MK)} лет`, step4: `КР = МК × φ = ${Math.round(MK)} × ${PHI} = ${Math.round(KP)} лет`, step5: `КО = МК : φ = ${Math.round(MK)} : ${PHI} = ${Math.round(KO)} лет` } }; } function performSmallMethodCalculations(yearA, yearB, yearC) { const AB = yearB - yearA; const BC = yearC - yearB; const tolerance = Math.abs(AB - BC); const isEqualDistance = tolerance <= 1; if (!isEqualDistance) { throw new Error(`Для малого метода события должны быть на равных расстояниях. AB = ${AB}, BC = ${BC}`); } const cycleLength = Math.round((AB + BC) / 2); // АВ = ВС = СД const yearD = yearC + cycleLength; const DE = cycleLength * PHI; const yearE = yearC + cycleLength * PHI; return { input: { yearA, yearB, yearC }, results: { yearD: Math.round(yearD), yearE: Math.round(yearE) }, distances: { AB, BC, cycleLength, DE }, calculations: { step1: `АВ = ${yearB} - ${yearA} = ${AB} лет`, step2: `ВС = ${yearC} - ${yearB} = ${BC} лет`, step3: `Длина цикла = ${cycleLength} лет`, step4: `СД = длина цикла = ${cycleLength} лет`, step5: `ДЕ = СД × φ = ${cycleLength} × ${PHI} = ${Math.round(DE)} лет` }, isEqualDistance: isEqualDistance, tolerance: tolerance }; } function displayResults(calc, method) { const resultsList = document.getElementById('results-list'); if (!resultsList) return; if (method === 'big') { resultsList.innerHTML = `
M: ${calc.results.yearM}
P: ${calc.results.yearP}
K: ${calc.results.yearK}
O: ${calc.results.yearO}
`; } else { resultsList.innerHTML = `
D: ${calc.results.yearD}
E: ${calc.results.yearE}
`; } const calcContent = document.getElementById('calc-content'); if (!calcContent) return; let steps = ''; for (let i = 1; i <= 5; i++) { if (calc.calculations && calc.calculations['step' + i]) { steps += `
${i}. ${calc.calculations['step' + i]}
`; } } if (method === 'big') { calcContent.innerHTML = `
φ = ${PHI}

${steps}
Точки M, P, K, O задают окрестности событий, но не строго определенные даты.
`; } else { calcContent.innerHTML = `
φ = ${PHI}

${steps}
Условие равенства циклов: АВ = ВС = СД
Точки D и E задают окрестности событий, но не строго определенные даты.
`; } } function visualizeTimeline(calc, method) { const timeline = document.getElementById('timeline'); if (!timeline) return; timeline.innerHTML = ''; let points; if (method === 'big') { points = [ { year: calc.input.yearA, label: 'A', isPast: true }, { year: calc.input.yearB, label: 'B', isPast: true }, { year: calc.input.yearC, label: 'C', isPast: true }, { year: calc.results.yearM, label: 'M', isPast: false }, { year: calc.results.yearP, label: 'P', isPast: false }, { year: calc.results.yearK, label: 'K', isPast: false }, { year: calc.results.yearO, label: 'O', isPast: false } ]; } else { points = [ { year: calc.input.yearA, label: 'A', isPast: true }, { year: calc.input.yearB, label: 'B', isPast: true }, { year: calc.input.yearC, label: 'C', isPast: true }, { year: calc.results.yearD, label: 'D', isPast: false }, { year: calc.results.yearE, label: 'E', isPast: false } ]; } points.sort((a, b) => a.year - b.year); const minYear = Math.min(...points.map(p => p.year)); const maxYear = Math.max(...points.map(p => p.year)); const range = maxYear - minYear || 1; const dividerYear = calc.input.yearC; const dividerPos = ((dividerYear - minYear) / range) * 90 + 5; const divider = document.createElement('div'); divider.className = 'divider'; divider.style.left = dividerPos + '%'; timeline.appendChild(divider); points.forEach((point) => { const position = ((point.year - minYear) / range) * 90 + 5; const pointEl = document.createElement('div'); pointEl.className = `timeline-point ${point.isPast ? 'past' : 'future'}`; pointEl.style.left = position + '%'; const labelEl = document.createElement('div'); labelEl.className = 'timeline-label above'; labelEl.textContent = point.label; labelEl.style.left = '0'; const yearEl = document.createElement('div'); yearEl.className = `timeline-year timeline-year-${point.label}`; yearEl.textContent = Math.round(point.year); yearEl.style.left = '0'; if (!point.isPast) { if (method === 'big') { if (point.label === 'P') yearEl.style.color = '#dc3545'; if (point.label === 'O') yearEl.style.color = '#28a745'; } else { if (point.label === 'E') yearEl.style.color = '#dc3545'; } } pointEl.appendChild(labelEl); pointEl.appendChild(yearEl); timeline.appendChild(pointEl); }); } async function saveResult () { const $res = $container.querySelector('.calc-results') const $error = $container.querySelector('.calc-error') if (!$res || !$res.children.length) { if ($error) $error.textContent = 'Выполните расчет' return } if ($error) $error.textContent = '' // Удаляем старые временные блоки если были const prevPrint = $container.querySelector('.calc-results.calc-print') if (prevPrint) prevPrint.remove() // создаём временный блок для печати (пустой) $res.insertAdjacentHTML('beforebegin', '
') updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $original = $container.querySelector('.calc-results:not(.calc-print)') const $print = $container.querySelector('.calc-results.calc-print') if (!$original || !$print) { if ($error) $error.textContent = 'Не удалось подготовить данные для сохранения' if ($print) $print.remove() return } // копируем содержимое (клонируем HTML). Это не перенесёт обработчики событий, но для снимка это не нужно $print.innerHTML = $original.innerHTML // доставка даты/имени файла const today = new Date().toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' }).replace(/\./g, '-') try { await saveAsPNG($print, `ЗОЛОТОЕ_СЕЧЕНИЕ-${today}.png`) } catch (err) { console.error('Ошибка при сохранении PNG:', err) if ($error) $error.textContent = 'Ошибка при сохранении файла' } finally { // удаляем временный контейнер $print.remove() } } } Object.assign(exports, { initTimeline }); })(__mods['_timeline'] = {}); /* ===== _wordCause.js ===== */ (function (exports) { // initWordCauseEffectCalc.js // Вставь этот блок в проект рядом с initWordCalc. // Он использует те же алфавитные таблицы. // Требуется: saveAsPNG (если хочешь сохранить), но для работы не обязательно. // Работа внутри initWordCalc /* авто-инициализация убрана: запуск из main.js */ const { countDigits, getFieldDate, getFieldValue, loadScript, saveAsPNG, sumDigits } = __mods['util']; // $word.className = 'word-cause-calc num-calculator'; async function initWordCause() { const CONVERT_TO_TOP = { '111': 1, '011': 2, '101': 3, '001': 4, '110': 5, '010': 6, '100': 7, '000': 8, }; const HEX_TABLE = [ 1, 43, 14, 34, 9, 5, 26, 11, 10, 58, 38, 54, 61, 60, 41, 19, 13, 49, 30, 55, 37, 63, 22, 36, 25, 17, 21, 51, 42, 3, 27, 24, 44, 28, 50, 32, 57, 48, 18, 46, 6, 47, 64, 40, 59, 29, 4, 7, 33, 31, 56, 62, 53, 39, 52, 15, 12, 45, 35, 16, 20, 8, 23, 2 ]; const HEX_NAMES = [ 'Творчество','Исполнение','Начальная трудность','Недоразвитость','Необходимость ждать','Суд', 'Войско','Приближение','Воспитание малым','Наступление','Расцвет','Упадок', 'Единомышленники, родня','Владение великим','Смирение','Вольность','Последование','Исправление порчи', 'Посещение','Созерцание','Стиснутые зубы','Убранство','Разрушение','Возврат','Беспорочность', 'Воспитание великим','Питание','Переразвитие великого','Повторная опасность, бездна','Сияние', 'Взаимодействие','Постоянство','Бегство','Мощь великого','Восход','Поражение света', 'Домашние','Разлад','Препятствие','Разрешение','Убыль','Приумножение','Выход', 'Перечение','Воссоединение','Подъём','Истощение','Колодец','Смена','Жертвенник', 'Возбуждение, молния','Сосредоточенность','Течение','Невеста','Изобилие','Странствие', 'Проникновение','Радость','Раздробленность','Ограничение','Внутренняя правда', 'Переразвитие малого','Уже конец','Ещё не конец' ]; const alphabetMaps = { 'ru': { 'а': 1, 'й': 1, 'у': 1, 'э': 1, 'б': 2, 'к': 2, 'ф': 2, 'ю': 2, 'в': 3, 'л': 3, 'х': 3, 'я': 3, 'г': 4, 'м': 4, 'ц': 4, 'д': 5, 'н': 5, 'ч': 5, 'е': 6, 'о': 6, 'ш': 6, 'ё': 7, 'п': 7, 'щ': 7, 'ж': 8, 'р': 8, 'ъ': 8, 'з': 9, 'с': 9, 'ы': 9, 'и': 0, 'т': 0, 'ь': 0 }, 'en': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6 }, 'de': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6, 'ä': 7, 'ö': 8, 'ü': 9 }, 'fr': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'ô': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'û': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6, 'o': 5, }, 'be': { 'а': 1, 'б': 2, 'в': 3, 'г': 4, 'д': 5, 'е': 6, 'ё': 7, 'ж': 8, 'з': 9, 'і': 0, 'й': 1, 'к': 2, 'л': 3, 'м': 4, 'н': 5, 'о': 6, 'п': 7, 'р': 8, 'с': 9, 'т': 0, 'у': 1, 'ф': 2, 'х': 3, 'ц': 4, 'ч': 5, 'ш': 6, 'щ': 7, 'ъ': 8, 'ы': 9, 'ь': 0, 'э': 1, 'ю': 2, 'я': 3 }, 'ga': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'r': 7, 's': 8, 't': 9, 'u': 0, 'v': 1, 'w': 2, 'x': 3, 'y': 4, 'z': 5 }, 'it': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6 }, 'kk': { 'а': 1, 'з': 1, 'ө': 1, 'һ': 1, 'ю': 1, 'ә': 2, 'и': 2, 'п': 2, 'ц': 2, 'я': 2, 'б': 3, 'й': 3, 'р': 3, 'ч': 3, 'в': 4, 'к': 4, 'с': 4, 'ш': 4, 'г': 5, 'қ': 5, 'т': 5, 'щ': 5, 'ғ': 6, 'л': 6, 'у': 6, 'ъ': 6, 'д': 7, 'м': 7, 'ұ': 7, 'ы': 7, 'е': 8, 'н': 8, 'ү': 8, 'і': 8, 'ё': 9, 'ң': 9, 'ф': 9, 'ь': 9, 'ж': 0, 'о': 0, 'х': 0, 'э': 0 }, 'lt': { 'a': 0, 'b': 1, 'c': 2, 'č': 3, 'd': 4, 'e': 5, 'ė': 6, 'f': 7, 'g': 8, 'h': 9, 'i': 0, 'į': 1, 'j': 2, 'k': 3, 'l': 4, 'm': 5, 'n': 6, 'o': 7, 'p': 8, 'r': 9, 's': 0, 'š': 1, 't': 2, 'u': 3, 'ū': 4, 'v': 5, 'z': 6 }, 'pl': { 'a': 1, 'ą': 2, 'b': 3, 'c': 4, 'ć': 5, 'd': 6, 'e': 7, 'ę': 8, 'f': 9, 'g': 0, 'h': 1, 'i': 2, 'j': 3, 'k': 4, 'l': 5, 'ł': 6, 'm': 7, 'n': 8, 'ń': 9, 'o': 0, 'ó': 1, 'p': 2, 'q': 3, 'r': 4, 's': 5, 'ś': 6, 't': 7, 'u': 8, 'v': 9, 'w': 0, 'x': 1, 'y': 2, 'z': 3, 'ź': 4, 'ż': 5 }, 'sv': { 'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 0, 'k': 1, 'l': 2, 'm': 3, 'n': 4, 'o': 5, 'p': 6, 'q': 7, 'r': 8, 's': 9, 't': 0, 'u': 1, 'v': 2, 'w': 3, 'x': 4, 'y': 5, 'z': 6 }, 'uk': { 'а': 1, 'б': 2, 'в': 3, 'г': 4, 'ґ': 5, 'д': 6, 'е': 7, 'є': 8, 'ж': 9, 'з': 0, 'и': 1, 'і': 2, 'ї': 3, 'й': 4, 'к': 5, 'л': 6, 'м': 7, 'н': 8, 'о': 9, 'п': 0, 'р': 1, 'с': 2, 'т': 3, 'у': 4, 'ф': 5, 'х': 6, 'ц': 7, 'ч': 8, 'ш': 9, 'щ': 0, 'ь': 1, 'ю': 2, 'я': 3 } }; // --- Создаем контейнер калькулятора --- const $container = document.querySelector('.word-cause-calc'); if (!$container) return; $container.className = 'word-cause-calc num-calculator'; $container.innerHTML = `

Особенности восприятия информации и масштаб реализации личности

`; $container.querySelector('.calc-params .btn-primary').addEventListener('click', updateResult); $container.querySelector('.calc-params .btn-warning').addEventListener('click', saveResult) function updateResult() { const word = ($container.querySelector('#calc-word-mains').value || '').trim().toLowerCase(); const lang = $container.querySelector('#language-select').value; const dateText = ($container.querySelector('#calc-word-mains').value || '').trim().toLowerCase(); const err = $container.querySelector('.calc-error'); err.textContent = ''; if (!word) { err.textContent = 'Введите слово'; return; } if (!lang || !alphabetMaps[lang]) { err.textContent = 'Выберите язык'; return; } if (!dateText) { err.textContent = 'Введите дату события'; return; } const numbers = textToNumbers(word, lang); if (!numbers.length) { err.textContent = 'Не удалось извлечь числа из текста'; return; } const code = numbers.join(''); const eventHex = calcHexByCode(code); let causeDate, causeHex, effectDate, effectHex; try { ({ causeDate, causeHex, effectDate, effectHex } = findNearestOppositeDates(eventHex, dateText, lang)); } catch (e) { err.textContent = e.message; // console.error(e); return; } $container.querySelector('.calc-results').innerHTML = renderResultBlock({ causeDate, causeHex, eventHex, effectDate, effectHex, word, dateLang: lang }); } // --- Преобразование текста в числа --- function textToNumbers(input, lang) { const map = alphabetMaps[lang]; const hasDopWordAbove = !!document.querySelector('.o-dopword-calculator'); if (hasDopWordAbove) { return [...input.toLowerCase()].map(ch => { if (/[0-9]/.test(ch)) return parseInt(ch, 10); const v = map[ch.toLowerCase()]; return typeof v === 'number' ? v : null; }).filter(v => v !== null); } else { //input = input.toLowerCase().replace(/[^a-zа-яёäöü]/g, ''); input = input.toLowerCase().replace(/[^\p{L}]/gu, ''); return [...input].map(ch => map[ch] || 0); } } // --- Гексаграмма из числа-кода --- function calcHexByCode(codeStr) { const oneCalculate = [...codeStr].reduce((s, ch) => s + parseInt(ch, 10), 0); const twoCalculate = String(oneCalculate).split('').reduce((s, ch) => s + parseInt(ch, 10), 0); const firstDigit = parseInt(codeStr[0] || '0', 10); const threeCalculate = Math.abs(oneCalculate - firstDigit * 2); const fourCalculate = String(threeCalculate).split('').reduce((s, ch) => s + parseInt(ch, 10), 0); const matrix = safeCountDigits(`${codeStr}${oneCalculate}${twoCalculate}${threeCalculate}${fourCalculate}`); let hexagram = []; hexagram[0] = matrix[4] % 2 && 1; hexagram[1] = matrix[7] % 2 && 1; hexagram[2] = (matrix[0] + matrix[3]) % 2 && 1; hexagram[3] = (matrix[8] + matrix[5]) % 2 && 1; hexagram[4] = (matrix[1] + matrix[2]) % 2 && 1; hexagram[5] = (matrix[6] + matrix[9]) % 2 && 1; const top = CONVERT_TO_TOP[`${hexagram[0]||0}${hexagram[1]||0}${hexagram[2]||0}`]; const bottom = CONVERT_TO_TOP[`${hexagram[3]||0}${hexagram[4]||0}${hexagram[5]||0}`]; const hexnumber = HEX_TABLE[(bottom - 1) * 8 + (top - 1)]; const hexname = HEX_NAMES[hexnumber - 1]; const althex = hexagram.map(h => h === 1 ? 0 : 1); const alttop = CONVERT_TO_TOP[`${althex[0]}${althex[1]}${althex[2]}`]; const altbottom = CONVERT_TO_TOP[`${althex[3]}${althex[4]}${althex[5]}`]; const althexnumber = HEX_TABLE[(altbottom - 1) * 8 + (alttop - 1)]; const althexname = HEX_NAMES[althexnumber - 1]; return { code: codeStr, oneCalculate, twoCalculate, threeCalculate, fourCalculate, matrix, hexagram, top, bottom, number: hexnumber, name: `${hexnumber} ${hexname}`, altNumber: althexnumber, altName: `${althexnumber} ${althexname}`, topName: `${hexnumber} ${hexname}`, bottomName: `${althexnumber} ${althexname}` }; } // --- Гексаграмма по дате --- function calcHexByDate(date) { const dStr = `${date.getDate()}${date.getMonth() + 1}${date.getFullYear()}`; let oneCalculate = 0; for (let i = 0; i < dStr.length; i++) oneCalculate += parseInt(dStr[i], 10); const twoCalculate = String(oneCalculate).split('').reduce((s, ch) => s + parseInt(ch, 10), 0); const threeCalculate = oneCalculate - parseInt(dStr[0], 10) * 2; const fourCalculate = String(Math.abs(threeCalculate)).split('').reduce((s, ch) => s + parseInt(ch, 10), 0); const matrix = safeCountDigits(`${dStr}${oneCalculate}${twoCalculate}${threeCalculate}${fourCalculate}`); let hexagram = []; hexagram[0] = matrix[4] % 2 && 1; hexagram[1] = matrix[7] % 2 && 1; hexagram[2] = (matrix[0] + matrix[3]) % 2 && 1; hexagram[3] = (matrix[8] + matrix[5]) % 2 && 1; hexagram[4] = (matrix[1] + matrix[2]) % 2 && 1; hexagram[5] = (matrix[6] + matrix[9]) % 2 && 1; const $althex = hexagram.map(h => h === 1 ? 0 : 1); const top = CONVERT_TO_TOP[`${hexagram[0]||0}${hexagram[1]||0}${hexagram[2]||0}`]; const bottom = CONVERT_TO_TOP[`${hexagram[3]||0}${hexagram[4]||0}${hexagram[5]||0}`]; const alttop = CONVERT_TO_TOP[`${$althex[0]}${$althex[1]}${$althex[2]}`]; const altbottom = CONVERT_TO_TOP[`${$althex[3]}${$althex[4]}${$althex[5]}`]; const hexnumber = HEX_TABLE[(bottom - 1) * 8 + (top - 1)]; const hexname = HEX_NAMES[hexnumber - 1]; const althexnumber = HEX_TABLE[(altbottom - 1) * 8 + (alttop - 1)]; const althexname = HEX_NAMES[althexnumber - 1]; return { date: new Date(date), matrix, hexagram, oneCalculate, twoCalculate, threeCalculate, fourCalculate, top, bottom, number: hexnumber, name: `${hexnumber} ${hexname}`, altNumber: althexnumber, altName: `${althexnumber} ${althexname}`, topName: `${hexnumber} ${hexname}`, bottomName: `${althexnumber} ${althexname}` }; } // --- Безопасный countDigits --- function safeCountDigits(str) { if (typeof countDigits === 'function') { try { return countDigits(str); } catch (e) { } } const counts = Array(10).fill(0); for (const ch of String(str)) { if (/\d/.test(ch)) counts[parseInt(ch, 10)]++; } return counts; } // --- Поиск ближайших дат (причина/следствие) --- const MONTHS_BY_LANG = { ru: ['января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'], en: ['january','february','march','april','may','june','july','august','september','october','november','december'], de: ['januar','februar','märz','april','mai','juni','juli','august','september','oktober','november','dezember'], fr: ['janvier','février','mars','avril','mai','juin','juillet','août','septembre','octobre','novembre','décembre'], it: ['gennaio','febbraio','marzo','aprile','maggio','giugno','luglio','agosto','settembre','ottobre','novembre','dicembre'], be: ['студзеня','лютага','сакавіка','красавіка','мая','чэрвеня','ліпеня','жніўня','верасня','кастрычніка','лістапада','снежня'], uk: ['січня','лютого','березня','квітня','травня','червня','липня','серпня','вересня','жовтня','листопада','грудня'], ga: ['eanáir','feabhra','márta','aibreán','bealtaine','meitheamh','iúil','lúnasa','meán fómhair','deireadh fómhair','samhain','nollaig'], kk: ['қаңтар','ақпан','наурыз','сәуір','мамыр','маусым','шілде','тамыз','қыркүйек','қазан','қараша','желтоқсан'], lt: ['sausio','vasario','kovo','balandžio','gegužės','birželio','liepos','rugpjūčio','rugsėjo','spalio','lapkričio','gruodžio'], pl: ['stycznia','lutego','marca','kwietnia','maja','czerwca','lipca','sierpnia','września','października','listopada','grudnia'], sv: ['januari','februari','mars','april','maj','juni','juli','augusti','september','oktober','november','december'] }; // Специальные гексаграммы для каждого языка (возвращают 7) const SPECIAL_HEX_BY_LANG = { ru: [6, 9, 10, 61], en: [2, 34, 24, 46, 40, 64, 18], de: [46, 4, 51, 27, 50, 26, 3], fr: [11, 44, 2, 46, 41, 6, 4, 35], it: [47, 24, 27, 42, 40, 63, 44, 46, 40], be: [54, 27, 23, 64], uk: [48, 6, 16, 7, 40, 60, 52, 56, 62], ga: [17, 43, 54, 9, 27, 3, 51, 64], kk: [35, 40, 55], lt: [42, 25, 17], pl: [59, 4, 54, 5, 33], sv: [24, 44, 7, 46, 41, 32, 64, 56] }; // Получение правильного суффикса для немецкой даты function getGermanSuffix(day) { if (day >= 1 && day <= 19) return 'te'; if (day >= 20 && day <= 31) return 'ste'; return ''; } // Проверка корректности немецкого суффикса function validateGermanSuffix(day, suffix) { const expected = getGermanSuffix(day); return suffix === expected; } // Парсинг немецкой даты с суффиксом function parseGermanDate(dateText) { const parts = dateText.trim().toLowerCase().split(/\s+/); // используем регулярку для split по любым пробелам if (parts.length < 2) return null; let dayPart = parts[0]; let suffix = ''; let monthName = ''; // Вариант 1: "1te januar" или "20ste januar" (суффикс слитно с числом) if (dayPart.match(/^\d+(te|ste)$/)) { if (dayPart.endsWith('ste')) { suffix = 'ste'; dayPart = dayPart.slice(0, -3); } else if (dayPart.endsWith('te')) { suffix = 'te'; dayPart = dayPart.slice(0, -2); } monthName = parts[1]; } // Вариант 2: "1 te januar" или "20 ste januar" (суффикс отдельно) else if (dayPart.match(/^\d+$/) && parts.length >= 3) { suffix = parts[1]; // суффикс во второй части monthName = parts[2]; // месяц в третьей части // Проверяем, что это действительно суффикс if (suffix !== 'te' && suffix !== 'ste') { return null; } } // Вариант 3: "1 januar" (без суффикса, допускаем такой формат) else if (dayPart.match(/^\d+$/)) { monthName = parts[1]; } else { return null; } const day = parseInt(dayPart, 10); if (isNaN(day) || day < 1 || day > 31) return null; // Проверяем корректность суффикса (если он был указан) if (suffix && !validateGermanSuffix(day, suffix)) { throw new Error(`Некорректный суффикс для даты ${day}. Ожидается "${getGermanSuffix(day)}", получено "${suffix}"`); } const monthIndex = MONTHS_BY_LANG.de.indexOf(monthName); if (monthIndex === -1) return null; return { day, monthIndex, suffix }; } // Форматирование немецкой даты с суффиксом (с пробелом между числом и суффиксом) function formatGermanDate(day, monthIndex) { const suffix = getGermanSuffix(day); const monthName = MONTHS_BY_LANG.de[monthIndex]; return `${day} ${suffix} ${monthName}`; // пробел перед suffix для вывода } function dateToText(day, monthIndex) { return `${day} ${MONTHS[monthIndex]}`; } function shiftDateText(day, monthIndex, delta) { const daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; day += delta; if (day < 1) { monthIndex = (monthIndex - 1 + 12) % 12; day = daysInMonth[monthIndex]; } else if (day > daysInMonth[monthIndex]) { monthIndex = (monthIndex + 1) % 12; day = 1; } return { day, monthIndex }; } function findNearestOppositeDates(eventHex, eventDateText, dateLang = 'ru') { if (!eventDateText) throw new Error('Не указана дата события для поиска причин/следствий'); const months = MONTHS_BY_LANG[dateLang] || MONTHS_BY_LANG['ru']; let startDay, startMonth; // Для немецкого языка используем специальный парсер if (dateLang === 'de') { const parsed = parseGermanDate(eventDateText); if (!parsed) throw new Error('Некорректная дата события: ' + eventDateText); startDay = parsed.day; startMonth = parsed.monthIndex; } else { const parts = eventDateText.trim().toLowerCase().split(' '); startDay = parseInt(parts[0], 10); startMonth = months.indexOf(parts[1]?.toLowerCase()); if (isNaN(startDay) || startMonth === -1) throw new Error('Некорректная дата события: ' + eventDateText); } const maxDays = 365 * 5; let causeDate = null, causeHex = null; let effectDate = null, effectHex = null; // console.groupCollapsed(`🔍 Поиск причинно-следственных дат для "${eventHex.name}" от "${eventDateText}" (lang=${dateLang})`); // --- ПОИСК ПРИЧИНЫ (назад) --- let day = startDay, month = startMonth; // console.groupCollapsed('⬅️ Поиск причины (назад)'); for (let i = 0; i < maxDays; i++) { const { day: d, monthIndex: m } = shiftDateText(day, month, -1); day = d; month = m; // Форматируем дату с учетом языка const dateWord = dateLang === 'de' ? formatGermanDate(day, month) : `${day} ${months[month]}`; const numbers = textToNumbers(dateWord.toLowerCase(), dateLang); const code = numbers.join(''); const h = calcHexByCode(code); //console.log(`День -${i + 1}: ${dateWord} → ${h.name} | Сравнение: ${h.topName + h.bottomName} == ${eventHex.bottomName + eventHex.topName}`); //console.log(`${dateWord} → ${h.name}`); if ((h.topName + h.bottomName) === (eventHex.bottomName + eventHex.topName)) { causeDate = dateWord; causeHex = h; // console.log(`✅ НАЙДЕНО совпадение для причины: ${causeDate} (${h.name})`); break; } } // console.groupEnd(); // --- ПОИСК СЛЕДСТВИЯ (вперёд) --- day = startDay; month = startMonth; console.groupCollapsed('➡️ Поиск следствия (вперёд)'); for (let i = 0; i < maxDays; i++) { const { day: d, monthIndex: m } = shiftDateText(day, month, +1); day = d; month = m; // Форматируем дату с учетом языка const dateWord = dateLang === 'de' ? formatGermanDate(day, month) : `${day} ${months[month]}`; const numbers = textToNumbers(dateWord, dateLang); const code = numbers.join(''); const h = calcHexByCode(code); //console.log(`День +${i + 1}: ${dateWord} → ${h.name} | Сравнение: ${h.topName} == ${eventHex.bottomName}`); console.log(`${dateWord} → ${h.name}`); if (h.topName === eventHex.bottomName) { effectDate = dateWord; effectHex = h; // console.log(`✅ НАЙДЕНО совпадение для следствия: ${effectDate} (${h.name})`); break; } } // console.groupEnd(); // console.groupEnd(); return { causeDate, causeHex, effectDate, effectHex }; } // --- Рендер результата --- function renderResultBlock({ causeDate, causeHex, eventHex, effectDate, effectHex, word, dateLang }) { const daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; function renderHexBlock(hexObj) { if (!hexObj) return '
— не найдено —
'; const lines = (hexObj.hexagram || []).map(h => (h === 1 ? '-----' : '-- --')).reverse().join('
'); return `
Прямая: ${hexObj.number} ${HEX_NAMES[hexObj.number - 1] || ''}
${lines}
Противоположная: ${hexObj.altNumber} ${HEX_NAMES[hexObj.altNumber - 1] || ''}
`; } function dateStr(d) { if (!d) return '—'; if (typeof d === 'string') return d; if (d instanceof Date) { const day = d.getDate(); const months = MONTHS_BY_LANG[dateLang] || MONTHS_BY_LANG['ru']; const monthName = months[d.getMonth()]; const year = d.getFullYear(); // Для немецкого добавляем суффикс (с пробелом) if (dateLang === 'de') { const suffix = getGermanSuffix(day); return `${day} ${suffix} ${monthName} ${year}`; // пробел перед suffix для вывода } return `${day} ${monthName} ${year}`; } return String(d); } function dateTextToDayIndex(dateText) { if (!dateText || typeof dateText !== 'string') return null; let day, monthIndex; // Для немецкого парсим с учетом суффиксов if (dateLang === 'de') { const parsed = parseGermanDate(dateText); if (!parsed) return null; day = parsed.day; monthIndex = parsed.monthIndex; } else { const parts = dateText.trim().split(' '); day = parseInt(parts[0], 10); const months = MONTHS_BY_LANG[dateLang]; monthIndex = months.indexOf(parts[1]); if (isNaN(day) || monthIndex === -1) return null; } let dayOfYear = day; for (let i = 0; i < monthIndex; i++) dayOfYear += daysInMonth[i]; return dayOfYear; } function daysBetween(a, b) { const da = dateTextToDayIndex(a); const db = dateTextToDayIndex(b); if (da == null || db == null) return null; let diff = db - da; if (diff < 0) diff += 365; return diff; } const daysEventToEffect = daysBetween(causeDate, word); const daysCauseToEvent = daysBetween(word, effectDate); // --- Новый расчёт дроби по количеству дней --- function getPeriodByDays(days, hexNumber, lang = 'ru') { if (days == null) return '—'; // проверяем противоположную гексаграмму с учетом языка const specialHexNumbers = SPECIAL_HEX_BY_LANG[lang] || SPECIAL_HEX_BY_LANG['ru']; if (specialHexNumbers.includes(+hexNumber)) { // console.log(`special hex for ${lang} → returning 7`); return 7; } if (days <= 5) return 1; if (days >= 6 && days <= 22) return 2; if (days >= 23 && days <= 45) return 3; if (days >= 46 && days <= 50) return 4; if (days >= 51 && days <= 60) return 5; if (days >= 61) return 6; return '—'; } const numerator = getPeriodByDays(daysEventToEffect, eventHex.altNumber, dateLang); // причина → событие const denominator = getPeriodByDays(daysCauseToEvent, eventHex.altNumber, dateLang); // событие → следствие const fractionBlock = `
${denominator}
${numerator}
`; const left = causeHex ? `
${dateStr(causeDate)}
${renderHexBlock(causeHex)}
${daysEventToEffect != null ? daysEventToEffect : '—'} дня
` : '—'; const middle = `
${word}
${renderHexBlock(eventHex)} ${fractionBlock} `; const right = effectHex ? `
${dateStr(effectDate)}
${renderHexBlock(effectHex)}
${daysCauseToEvent != null ? daysCauseToEvent : '—'} дня
` : '—'; return `

Масштаб восприятия информации (знаменатель)

${left}

Стандартная дата

${middle}

Масштаб развития (числитель)

${right}
`; } return { calcHexByCode, calcHexByDate, findNearestOppositeDates }; async function saveResult() { const $res = $container.querySelector('.calc-results') if (!$res.children.length) { $container.querySelector('.calc-error').textContent = 'Выполните расчет' return } $res.insertAdjacentHTML('beforebegin', '
') await updateResult() await new Promise(resolve => setTimeout(resolve, 500)) const $print = $container.querySelector('.calc-results') const inputText = document.querySelector('#calc-word-mains').value.trim(); const today = `${inputText}-${new Date().toLocaleDateString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric' }).replace(/\./g, '-')}`; await saveAsPNG($print, `Причина_Следствие-${today}.png`) // await saveAsPDF($el) $print.remove() } } Object.assign(exports, { initWordCause }); })(__mods['_wordCause'] = {}); /* ===== main.js ===== */ (function () { var $ = window.jQuery || window.$ || function (fn) { if ( typeof fn !== 'function' ) return; if ( document.readyState !== 'loading' ) fn(); else document.addEventListener('DOMContentLoaded', fn); }; const { initHexagramCalc } = __mods['_hexagram']; const { initFamilyCalc } = __mods['_family']; const { initChartsCalc } = __mods['_charts']; const { initThinkCalc } = __mods['_think']; const { initWordCalc } = __mods['_words']; const { initTimeline } = __mods['_timeline']; const { initWordCause } = __mods['_wordCause']; const ALLOWED_DOMAINS = [ 'cdn.getcourse.ru', 'aleksandrovanumerology.com', 'aleksandrovanumerology.getcourse.ru', ] $(() => { if ( !ALLOWED_DOMAINS.includes(window.location.hostname) ) return initHexagramCalc() initFamilyCalc() initChartsCalc() initThinkCalc() initWordCalc() initTimeline() initWordCause() }) })(); })();