chart2txt 0.5.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -34
- package/dist/chart2txt.d.ts +9 -0
- package/dist/chart2txt.js +30 -0
- package/dist/chart2txt.min.js +1 -1
- package/dist/config/ChartSettings.d.ts +13 -6
- package/dist/config/ChartSettings.js +36 -10
- package/dist/constants.d.ts +17 -2
- package/dist/constants.js +301 -32
- package/dist/core/analysis.d.ts +6 -0
- package/dist/core/analysis.js +235 -0
- package/dist/core/aspectPatterns.d.ts +10 -0
- package/dist/core/aspectPatterns.js +460 -0
- package/dist/core/aspects.d.ts +14 -11
- package/dist/core/aspects.js +142 -40
- package/dist/core/astrology.d.ts +8 -2
- package/dist/core/astrology.js +23 -6
- package/dist/core/dignities.d.ts +2 -0
- package/dist/core/dignities.js +71 -0
- package/dist/core/dispositors.d.ts +9 -0
- package/dist/core/dispositors.js +57 -0
- package/dist/core/grouping.d.ts +9 -0
- package/dist/core/grouping.js +45 -0
- package/dist/core/signDistributions.d.ts +21 -0
- package/dist/core/signDistributions.js +50 -0
- package/dist/core/stelliums.d.ts +10 -0
- package/dist/core/stelliums.js +108 -0
- package/dist/formatters/text/sections/angles.js +4 -4
- package/dist/formatters/text/sections/aspectPatterns.d.ts +9 -0
- package/dist/formatters/text/sections/aspectPatterns.js +199 -0
- package/dist/formatters/text/sections/aspects.d.ts +3 -6
- package/dist/formatters/text/sections/aspects.js +35 -49
- package/dist/formatters/text/sections/birthdata.js +1 -1
- package/dist/formatters/text/sections/dispositors.d.ts +8 -0
- package/dist/formatters/text/sections/dispositors.js +19 -0
- package/dist/formatters/text/sections/houseOverlays.d.ts +11 -6
- package/dist/formatters/text/sections/houseOverlays.js +38 -69
- package/dist/formatters/text/sections/houses.d.ts +6 -0
- package/dist/formatters/text/sections/houses.js +36 -0
- package/dist/formatters/text/sections/metadata.d.ts +2 -0
- package/dist/formatters/text/sections/metadata.js +54 -0
- package/dist/formatters/text/sections/planets.d.ts +3 -5
- package/dist/formatters/text/sections/planets.js +12 -38
- package/dist/formatters/text/sections/signDistributions.d.ts +9 -0
- package/dist/formatters/text/sections/signDistributions.js +21 -0
- package/dist/formatters/text/textFormatter.d.ts +4 -5
- package/dist/formatters/text/textFormatter.js +86 -112
- package/dist/index.d.ts +7 -4
- package/dist/index.js +11 -6
- package/dist/types.d.ts +159 -13
- package/dist/types.js +15 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.js +56 -0
- package/dist/utils/houseCalculations.d.ts +10 -0
- package/dist/utils/houseCalculations.js +23 -0
- package/dist/utils/precision.d.ts +49 -0
- package/dist/utils/precision.js +71 -0
- package/dist/utils/validation.d.ts +37 -0
- package/dist/utils/validation.js +181 -0
- package/package.json +2 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateHousesOutput = generateHousesOutput;
|
|
4
|
+
const astrology_1 = require("../../../core/astrology");
|
|
5
|
+
const formatting_1 = require("../../../utils/formatting");
|
|
6
|
+
/**
|
|
7
|
+
* Generates the [HOUSE CUSPS] section of the chart output.
|
|
8
|
+
* @param houseCusps Array of 12 house cusp degrees (0-360), or undefined if not available.
|
|
9
|
+
* @returns An array of strings for the output.
|
|
10
|
+
*/
|
|
11
|
+
function generateHousesOutput(houseCusps) {
|
|
12
|
+
const output = ['[HOUSE CUSPS]'];
|
|
13
|
+
if (!houseCusps || houseCusps.length !== 12) {
|
|
14
|
+
output.push('House cusps not available');
|
|
15
|
+
return output;
|
|
16
|
+
}
|
|
17
|
+
// Format houses in two columns: 1-6 and 7-12
|
|
18
|
+
for (let i = 0; i < 6; i++) {
|
|
19
|
+
const leftHouseIndex = i;
|
|
20
|
+
const rightHouseIndex = i + 6;
|
|
21
|
+
const leftCusp = houseCusps[leftHouseIndex];
|
|
22
|
+
const rightCusp = houseCusps[rightHouseIndex];
|
|
23
|
+
const leftSign = (0, astrology_1.getDegreeSign)(leftCusp);
|
|
24
|
+
const leftDegInSign = Math.floor((0, astrology_1.getDegreeInSign)(leftCusp));
|
|
25
|
+
const leftHouseLabel = (0, formatting_1.getOrdinal)(leftHouseIndex + 1) + ' house';
|
|
26
|
+
const rightSign = (0, astrology_1.getDegreeSign)(rightCusp);
|
|
27
|
+
const rightDegInSign = Math.floor((0, astrology_1.getDegreeInSign)(rightCusp));
|
|
28
|
+
const rightHouseLabel = (0, formatting_1.getOrdinal)(rightHouseIndex + 1) + ' house';
|
|
29
|
+
// Pad the left side to align columns
|
|
30
|
+
const leftPart = `${leftHouseLabel}: ${leftDegInSign}° ${leftSign}`;
|
|
31
|
+
const paddedLeftPart = leftPart.padEnd(24); // Adjust padding as needed
|
|
32
|
+
const rightPart = `${rightHouseLabel}: ${rightDegInSign}° ${rightSign}`;
|
|
33
|
+
output.push(`${paddedLeftPart} ${rightPart}`);
|
|
34
|
+
}
|
|
35
|
+
return output;
|
|
36
|
+
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { ChartSettings } from '../../../config/ChartSettings';
|
|
2
|
+
import { MultiChartData } from '../../../types';
|
|
3
|
+
export declare function determineChartType(data: MultiChartData): string;
|
|
2
4
|
/**
|
|
3
5
|
* Generates the [METADATA] section of the chart output.
|
|
4
6
|
* @param settings The chart settings.
|
|
@@ -1,6 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.determineChartType = determineChartType;
|
|
3
4
|
exports.generateMetadataOutput = generateMetadataOutput;
|
|
5
|
+
function determineChartType(data) {
|
|
6
|
+
let baseChartString = 'natal';
|
|
7
|
+
let suffixString = '';
|
|
8
|
+
const natalCharts = data.filter(({ chartType }) => chartType !== 'transit' && chartType !== 'event');
|
|
9
|
+
const eventCharts = data.filter(({ chartType }) => chartType === 'event');
|
|
10
|
+
const transitCharts = data.filter(({ chartType }) => chartType === 'transit');
|
|
11
|
+
if (transitCharts.length > 1) {
|
|
12
|
+
throw new Error('Must provide at most one transit chart');
|
|
13
|
+
}
|
|
14
|
+
const hasTransit = transitCharts.length > 0;
|
|
15
|
+
// first determine suffix
|
|
16
|
+
if (natalCharts.length > 0) {
|
|
17
|
+
if (eventCharts.length === 0) {
|
|
18
|
+
if (hasTransit) {
|
|
19
|
+
suffixString = '_with_transit';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else if (eventCharts.length === 1) {
|
|
23
|
+
suffixString = hasTransit ? '_with_event_and_transit' : '_with_event';
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
suffixString = hasTransit ? '_with_events_and_transit' : '_with_events';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// base event charts can have transits
|
|
31
|
+
if (hasTransit) {
|
|
32
|
+
suffixString = '_with_transit';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// then determine base string
|
|
36
|
+
if (natalCharts.length === 0) {
|
|
37
|
+
if (eventCharts.length === 0) {
|
|
38
|
+
throw new Error('Must provide at least one non-transit chart');
|
|
39
|
+
}
|
|
40
|
+
else if (eventCharts.length === 1) {
|
|
41
|
+
baseChartString = 'event';
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
baseChartString = 'multi_event';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (natalCharts.length === 1) {
|
|
48
|
+
baseChartString = 'natal';
|
|
49
|
+
}
|
|
50
|
+
else if (natalCharts.length === 2) {
|
|
51
|
+
baseChartString = 'synastry';
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
baseChartString = 'group_synastry';
|
|
55
|
+
}
|
|
56
|
+
return baseChartString + suffixString;
|
|
57
|
+
}
|
|
4
58
|
/**
|
|
5
59
|
* Generates the [METADATA] section of the chart output.
|
|
6
60
|
* @param settings The chart settings.
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { ChartSettings } from '../../../config/ChartSettings';
|
|
1
|
+
import { PlanetPosition } from '../../../types';
|
|
3
2
|
/**
|
|
4
3
|
* Generates the [PLANETS] section of the chart output.
|
|
5
|
-
* @param
|
|
6
|
-
* @param houseCusps Array of 12 house cusp degrees, or undefined if not available.
|
|
4
|
+
* @param placements Array of planet positions.
|
|
7
5
|
* @param settings The chart settings.
|
|
8
6
|
* @returns An array of strings for the output.
|
|
9
7
|
*/
|
|
10
|
-
export declare function generatePlanetsOutput(
|
|
8
|
+
export declare function generatePlanetsOutput(placements: PlanetPosition[]): string[];
|
|
@@ -1,52 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generatePlanetsOutput = generatePlanetsOutput;
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
// (Copied from houseOverlays.ts - consider moving to a shared util if used in more places)
|
|
7
|
-
function getHouseForPoint(pointDegree, houseCusps) {
|
|
8
|
-
if (!houseCusps || houseCusps.length !== 12) {
|
|
9
|
-
return 0; // Indicate failure or inability to calculate
|
|
10
|
-
}
|
|
11
|
-
for (let i = 0; i < 12; i++) {
|
|
12
|
-
const cuspStart = houseCusps[i];
|
|
13
|
-
const cuspEnd = houseCusps[(i + 1) % 12];
|
|
14
|
-
if (cuspStart < cuspEnd) {
|
|
15
|
-
if (pointDegree >= cuspStart && pointDegree < cuspEnd) {
|
|
16
|
-
return i + 1;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
if (pointDegree >= cuspStart || pointDegree < cuspEnd) {
|
|
21
|
-
return i + 1;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return 0; // Should not be reached if cusps cover 360 degrees
|
|
26
|
-
}
|
|
4
|
+
const formatting_1 = require("../../../utils/formatting");
|
|
5
|
+
const dignities_1 = require("../../../core/dignities");
|
|
27
6
|
/**
|
|
28
7
|
* Generates the [PLANETS] section of the chart output.
|
|
29
|
-
* @param
|
|
30
|
-
* @param houseCusps Array of 12 house cusp degrees, or undefined if not available.
|
|
8
|
+
* @param placements Array of planet positions.
|
|
31
9
|
* @param settings The chart settings.
|
|
32
10
|
* @returns An array of strings for the output.
|
|
33
11
|
*/
|
|
34
|
-
function generatePlanetsOutput(
|
|
12
|
+
function generatePlanetsOutput(placements) {
|
|
35
13
|
const output = ['[PLANETS]'];
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const houseNumber = getHouseForPoint(planet.degree, houseCusps);
|
|
43
|
-
if (houseNumber > 0) {
|
|
44
|
-
line += `, House ${houseNumber}`;
|
|
45
|
-
}
|
|
14
|
+
placements.forEach((planet) => {
|
|
15
|
+
const dignities = (0, dignities_1.formatPlanetWithDignities)(planet);
|
|
16
|
+
const retrograde = planet.speed && planet.speed < 0 ? ' Retrograde' : '';
|
|
17
|
+
let line = `${planet.name}: ${Math.floor(planet.degree % 30)}° ${planet.sign}${retrograde} ${dignities}`;
|
|
18
|
+
if (planet.house) {
|
|
19
|
+
line += `, ${(0, formatting_1.getOrdinal)(planet.house)} house`;
|
|
46
20
|
}
|
|
47
|
-
output.push(line);
|
|
21
|
+
output.push(line.replace(/\s+/g, ' ').trim());
|
|
48
22
|
});
|
|
49
|
-
if (
|
|
23
|
+
if (placements.length === 0) {
|
|
50
24
|
output.push('No planets listed.');
|
|
51
25
|
}
|
|
52
26
|
return output;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function generateElementDistributionOutput(elements: {
|
|
2
|
+
[key: string]: string[];
|
|
3
|
+
}): string[];
|
|
4
|
+
export declare function generateModalityDistributionOutput(modalities: {
|
|
5
|
+
[key: string]: number;
|
|
6
|
+
}): string[];
|
|
7
|
+
export declare function generatePolarityOutput(polarities: {
|
|
8
|
+
[key: string]: number;
|
|
9
|
+
}): string[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateElementDistributionOutput = generateElementDistributionOutput;
|
|
4
|
+
exports.generateModalityDistributionOutput = generateModalityDistributionOutput;
|
|
5
|
+
exports.generatePolarityOutput = generatePolarityOutput;
|
|
6
|
+
const signDistributions_1 = require("../../../core/signDistributions");
|
|
7
|
+
function generateElementDistributionOutput(elements) {
|
|
8
|
+
const output = ['[ELEMENT DISTRIBUTION]'];
|
|
9
|
+
output.push(...(0, signDistributions_1.formatElementDistribution)(elements));
|
|
10
|
+
return output;
|
|
11
|
+
}
|
|
12
|
+
function generateModalityDistributionOutput(modalities) {
|
|
13
|
+
const output = ['[MODALITY DISTRIBUTION]'];
|
|
14
|
+
output.push(...(0, signDistributions_1.formatModalityDistribution)(modalities));
|
|
15
|
+
return output;
|
|
16
|
+
}
|
|
17
|
+
function generatePolarityOutput(polarities) {
|
|
18
|
+
const output = ['[POLARITY]'];
|
|
19
|
+
output.push(...(0, signDistributions_1.formatPolarityDistribution)(polarities));
|
|
20
|
+
return output;
|
|
21
|
+
}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AstrologicalReport } from '../../types';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* @param
|
|
5
|
-
* @param partialSettings Optional: Custom settings to override defaults.
|
|
3
|
+
* Formats a pre-computed and pre-grouped AstrologicalReport into a human-readable text string.
|
|
4
|
+
* @param report The AstrologicalReport object, with aspects already grouped.
|
|
6
5
|
* @returns A string representing the full chart report.
|
|
7
6
|
*/
|
|
8
|
-
export declare function
|
|
7
|
+
export declare function formatReportToText(report: AstrologicalReport): string;
|
|
@@ -1,151 +1,125 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const types_1 = require("../../types");
|
|
5
|
-
const ChartSettings_1 = require("../../config/ChartSettings");
|
|
6
|
-
const aspects_1 = require("../../core/aspects");
|
|
3
|
+
exports.formatReportToText = formatReportToText;
|
|
7
4
|
const metadata_1 = require("./sections/metadata");
|
|
8
5
|
const chartHeader_1 = require("./sections/chartHeader");
|
|
9
6
|
const birthdata_1 = require("./sections/birthdata");
|
|
10
7
|
const angles_1 = require("./sections/angles");
|
|
8
|
+
const houses_1 = require("./sections/houses");
|
|
11
9
|
const planets_1 = require("./sections/planets");
|
|
12
|
-
const
|
|
10
|
+
const dispositors_1 = require("./sections/dispositors");
|
|
11
|
+
const aspects_1 = require("./sections/aspects");
|
|
12
|
+
const aspectPatterns_1 = require("./sections/aspectPatterns");
|
|
13
13
|
const houseOverlays_1 = require("./sections/houseOverlays");
|
|
14
|
-
const
|
|
14
|
+
const signDistributions_1 = require("./sections/signDistributions");
|
|
15
|
+
const stelliums_1 = require("../../core/stelliums");
|
|
16
|
+
const processSingleChartOutput = (analysis, settings, chartTitlePrefix) => {
|
|
15
17
|
const outputLines = [];
|
|
16
|
-
|
|
17
|
-
outputLines.push(...(0,
|
|
18
|
-
outputLines.push(...(0,
|
|
19
|
-
outputLines.push(...(0,
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
outputLines.push(...(0,
|
|
18
|
+
const { chart, groupedAspects, patterns, stelliums, signDistributions, dispositors, placements, } = analysis;
|
|
19
|
+
outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(chart.name, chartTitlePrefix));
|
|
20
|
+
outputLines.push(...(0, birthdata_1.generateBirthdataOutput)(chart.location, chart.timestamp, settings));
|
|
21
|
+
outputLines.push(...(0, angles_1.generateAnglesOutput)(chart.ascendant, chart.midheaven));
|
|
22
|
+
outputLines.push(...(0, houses_1.generateHousesOutput)(chart.houseCusps));
|
|
23
|
+
outputLines.push(...(0, planets_1.generatePlanetsOutput)(placements.planets));
|
|
24
|
+
outputLines.push(...(0, dispositors_1.generateDispositorsOutput)(dispositors));
|
|
25
|
+
if (settings.includeSignDistributions) {
|
|
26
|
+
outputLines.push(...(0, signDistributions_1.generateElementDistributionOutput)(signDistributions.elements));
|
|
27
|
+
outputLines.push(...(0, signDistributions_1.generateModalityDistributionOutput)(signDistributions.modalities));
|
|
28
|
+
outputLines.push(...(0, signDistributions_1.generatePolarityOutput)(signDistributions.polarities));
|
|
29
|
+
}
|
|
30
|
+
outputLines.push(...(0, aspects_1.generateAspectsOutput)('[ASPECTS]', groupedAspects));
|
|
31
|
+
if (settings.includeAspectPatterns) {
|
|
32
|
+
outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(patterns, undefined, false));
|
|
33
|
+
if (stelliums.length > 0) {
|
|
34
|
+
stelliums.forEach((stellium) => {
|
|
35
|
+
outputLines.push(...(0, stelliums_1.formatStellium)(stellium));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
outputLines.push('No Stelliums detected.');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
23
42
|
outputLines.push('');
|
|
24
43
|
return outputLines;
|
|
25
44
|
};
|
|
26
|
-
const processChartPairOutput = (
|
|
45
|
+
const processChartPairOutput = (analysis, settings) => {
|
|
27
46
|
const outputLines = [];
|
|
47
|
+
const { chart1, chart2, groupedSynastryAspects, compositePatterns, houseOverlays, } = analysis;
|
|
28
48
|
const header = chart1.chartType === 'event' && chart2.chartType === 'event'
|
|
29
49
|
? 'EVENT_RELATIONSHIP'
|
|
30
50
|
: chart1.chartType === 'event' || chart2.chartType === 'event'
|
|
31
51
|
? 'NATAL_EVENT'
|
|
32
52
|
: 'SYNASTRY';
|
|
33
53
|
outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(`${chart1.name}-${chart2.name}`, header));
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
outputLines.push(...(0, aspects_1.generateAspectsOutput)('[PLANET-PLANET ASPECTS]', groupedSynastryAspects, chart1.name, chart2.name));
|
|
55
|
+
if (settings.includeAspectPatterns && compositePatterns.length > 0) {
|
|
56
|
+
outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(compositePatterns, `${chart1.name}-${chart2.name} Composite`, true));
|
|
57
|
+
}
|
|
36
58
|
outputLines.push('');
|
|
37
|
-
outputLines.push(...(0, houseOverlays_1.generateHouseOverlaysOutput)(chart1, chart2
|
|
59
|
+
outputLines.push(...(0, houseOverlays_1.generateHouseOverlaysOutput)(houseOverlays, chart1.name, chart2.name));
|
|
38
60
|
outputLines.push('');
|
|
39
61
|
return outputLines;
|
|
40
62
|
};
|
|
41
|
-
const
|
|
63
|
+
const processGlobalPatternsOutput = (analysis, isTransit = false) => {
|
|
42
64
|
const outputLines = [];
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
};
|
|
50
|
-
const determineChartType = (data) => {
|
|
51
|
-
let baseChartString = 'natal';
|
|
52
|
-
let suffixString = '';
|
|
53
|
-
const natalCharts = data.filter(({ chartType }) => chartType !== 'transit' && chartType !== 'event');
|
|
54
|
-
const eventCharts = data.filter(({ chartType }) => chartType === 'event');
|
|
55
|
-
const transitCharts = data.filter(({ chartType }) => chartType === 'transit');
|
|
56
|
-
if (transitCharts.length > 1) {
|
|
57
|
-
throw new Error('Must provide at most one transit chart');
|
|
58
|
-
}
|
|
59
|
-
const hasTransit = transitCharts.length > 0;
|
|
60
|
-
// first determine suffix
|
|
61
|
-
if (natalCharts.length > 0) {
|
|
62
|
-
if (eventCharts.length === 0) {
|
|
63
|
-
if (hasTransit) {
|
|
64
|
-
suffixString = '_with_transit';
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else if (eventCharts.length === 1) {
|
|
68
|
-
suffixString = hasTransit ? '_with_event_and_transit' : '_with_event';
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
suffixString = hasTransit ? '_with_events_and_transit' : '_with_events';
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
// base event charts can have transits
|
|
76
|
-
if (hasTransit) {
|
|
77
|
-
suffixString = '_with_transit';
|
|
65
|
+
const { charts, patterns } = analysis;
|
|
66
|
+
if (patterns.length > 0) {
|
|
67
|
+
const chartNames = charts.map((c) => c.name).join('-');
|
|
68
|
+
let title = `${chartNames} Global Composite`;
|
|
69
|
+
if (isTransit) {
|
|
70
|
+
title = `${chartNames} Global Transit Composite`;
|
|
78
71
|
}
|
|
72
|
+
outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(patterns, title, true));
|
|
73
|
+
outputLines.push('');
|
|
79
74
|
}
|
|
80
|
-
|
|
81
|
-
if (natalCharts.length === 0) {
|
|
82
|
-
if (eventCharts.length === 0) {
|
|
83
|
-
throw new Error('Must provide at least one non-transit chart');
|
|
84
|
-
}
|
|
85
|
-
else if (eventCharts.length === 1) {
|
|
86
|
-
baseChartString = 'event';
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
baseChartString = 'multi_event';
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
else if (natalCharts.length === 1) {
|
|
93
|
-
baseChartString = 'natal';
|
|
94
|
-
}
|
|
95
|
-
else if (natalCharts.length === 2) {
|
|
96
|
-
baseChartString = 'synastry';
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
baseChartString = 'group_synastry';
|
|
100
|
-
}
|
|
101
|
-
return baseChartString + suffixString;
|
|
75
|
+
return outputLines;
|
|
102
76
|
};
|
|
103
77
|
/**
|
|
104
|
-
*
|
|
105
|
-
* @param
|
|
106
|
-
* @param partialSettings Optional: Custom settings to override defaults.
|
|
78
|
+
* Formats a pre-computed and pre-grouped AstrologicalReport into a human-readable text string.
|
|
79
|
+
* @param report The AstrologicalReport object, with aspects already grouped.
|
|
107
80
|
* @returns A string representing the full chart report.
|
|
108
81
|
*/
|
|
109
|
-
function
|
|
110
|
-
const
|
|
111
|
-
const
|
|
82
|
+
function formatReportToText(report) {
|
|
83
|
+
const { chartAnalyses, pairwiseAnalyses, globalAnalysis, transitAnalyses, globalTransitAnalysis, } = report;
|
|
84
|
+
const settings = report.settings;
|
|
112
85
|
const outputLines = [];
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
outputLines.push(...processSingleChartOutput(
|
|
121
|
-
return outputLines.join('\n').trimEnd();
|
|
86
|
+
const originalCharts = chartAnalyses.map((ca) => ca.chart);
|
|
87
|
+
const chartType = (0, metadata_1.determineChartType)(originalCharts);
|
|
88
|
+
outputLines.push(...(0, metadata_1.generateMetadataOutput)(settings, chartType, settings.houseSystemName));
|
|
89
|
+
outputLines.push('');
|
|
90
|
+
// 1. Process individual non-transit charts
|
|
91
|
+
const nonTransitAnalyses = chartAnalyses.filter((a) => a.chart.chartType !== 'transit');
|
|
92
|
+
for (const analysis of nonTransitAnalyses) {
|
|
93
|
+
outputLines.push(...processSingleChartOutput(analysis, settings));
|
|
122
94
|
}
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
outputLines.push(...(0, metadata_1.generateMetadataOutput)(settings, chartType, houseSystemName));
|
|
127
|
-
outputLines.push(''); // Blank line after metadata
|
|
128
|
-
const nonTransitCharts = data.filter(({ chartType }) => chartType !== 'transit');
|
|
129
|
-
const transitChart = data.find(({ chartType }) => chartType === 'transit');
|
|
130
|
-
// first, process each chart individually
|
|
131
|
-
for (const chart of nonTransitCharts) {
|
|
132
|
-
outputLines.push(...processSingleChartOutput(settings, chart));
|
|
95
|
+
// 2. Process pairwise analyses
|
|
96
|
+
for (const analysis of pairwiseAnalyses) {
|
|
97
|
+
outputLines.push(...processChartPairOutput(analysis, settings));
|
|
133
98
|
}
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
outputLines.push(...processChartPairOutput(settings, nonTransitCharts[i], nonTransitCharts[j]));
|
|
138
|
-
}
|
|
99
|
+
// 3. Process global patterns (non-transit)
|
|
100
|
+
if (globalAnalysis) {
|
|
101
|
+
outputLines.push(...processGlobalPatternsOutput(globalAnalysis, false));
|
|
139
102
|
}
|
|
140
|
-
//
|
|
141
|
-
if (
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
outputLines.push(...(0,
|
|
103
|
+
// 4. Process transit analyses
|
|
104
|
+
if (transitAnalyses.length > 0) {
|
|
105
|
+
const transitChartAnalysis = chartAnalyses.find((a) => a.chart.chartType === 'transit');
|
|
106
|
+
if (transitChartAnalysis) {
|
|
107
|
+
outputLines.push(...(0, chartHeader_1.generateChartHeaderOutput)(transitChartAnalysis.chart.name, 'TRANSIT'));
|
|
108
|
+
outputLines.push(...(0, birthdata_1.generateBirthdataOutput)(transitChartAnalysis.chart.location, transitChartAnalysis.chart.timestamp, settings, '[DATETIME]'));
|
|
109
|
+
outputLines.push(...(0, planets_1.generatePlanetsOutput)(transitChartAnalysis.placements.planets));
|
|
147
110
|
outputLines.push('');
|
|
148
111
|
}
|
|
112
|
+
for (const analysis of transitAnalyses) {
|
|
113
|
+
outputLines.push(...(0, aspects_1.generateAspectsOutput)(`[TRANSIT ASPECTS: ${analysis.natalChart.name}]`, analysis.groupedAspects, analysis.natalChart.name, analysis.transitChart.name, true));
|
|
114
|
+
if (settings.includeAspectPatterns) {
|
|
115
|
+
outputLines.push(...(0, aspectPatterns_1.generateAspectPatternsOutput)(analysis.patterns, `Transit to ${analysis.natalChart.name}`, true));
|
|
116
|
+
}
|
|
117
|
+
outputLines.push('');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// 5. Process global transit patterns
|
|
121
|
+
if (globalTransitAnalysis) {
|
|
122
|
+
outputLines.push(...processGlobalPatternsOutput(globalTransitAnalysis, true));
|
|
149
123
|
}
|
|
150
124
|
return outputLines.join('\n').trimEnd();
|
|
151
125
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* This is the main entry point for the library.
|
|
6
6
|
*/
|
|
7
|
-
export {
|
|
7
|
+
export { chart2txt } from './chart2txt';
|
|
8
|
+
export { analyzeCharts } from './core/analysis';
|
|
9
|
+
export { groupAspects } from './core/grouping';
|
|
10
|
+
export { formatReportToText } from './formatters/text/textFormatter';
|
|
8
11
|
export * from './types';
|
|
9
|
-
export { DEFAULT_SETTINGS, DEFAULT_ASPECTS,
|
|
12
|
+
export { DEFAULT_SETTINGS, DEFAULT_ASPECTS, ZODIAC_SIGNS } from './constants';
|
|
10
13
|
export { ChartSettings } from './config/ChartSettings';
|
|
11
|
-
import {
|
|
12
|
-
export default
|
|
14
|
+
import { chart2txt } from './chart2txt';
|
|
15
|
+
export default chart2txt;
|
package/dist/index.js
CHANGED
|
@@ -20,21 +20,26 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
20
20
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.ChartSettings = exports.ZODIAC_SIGNS = exports.
|
|
24
|
-
// Core
|
|
23
|
+
exports.ChartSettings = exports.ZODIAC_SIGNS = exports.DEFAULT_ASPECTS = exports.DEFAULT_SETTINGS = exports.formatReportToText = exports.groupAspects = exports.analyzeCharts = exports.chart2txt = void 0;
|
|
24
|
+
// Core functions
|
|
25
|
+
var chart2txt_1 = require("./chart2txt");
|
|
26
|
+
Object.defineProperty(exports, "chart2txt", { enumerable: true, get: function () { return chart2txt_1.chart2txt; } });
|
|
27
|
+
var analysis_1 = require("./core/analysis");
|
|
28
|
+
Object.defineProperty(exports, "analyzeCharts", { enumerable: true, get: function () { return analysis_1.analyzeCharts; } });
|
|
29
|
+
var grouping_1 = require("./core/grouping");
|
|
30
|
+
Object.defineProperty(exports, "groupAspects", { enumerable: true, get: function () { return grouping_1.groupAspects; } });
|
|
25
31
|
var textFormatter_1 = require("./formatters/text/textFormatter");
|
|
26
|
-
Object.defineProperty(exports, "
|
|
32
|
+
Object.defineProperty(exports, "formatReportToText", { enumerable: true, get: function () { return textFormatter_1.formatReportToText; } });
|
|
27
33
|
// Export all types for library users
|
|
28
34
|
__exportStar(require("./types"), exports);
|
|
29
35
|
// Export constants that might be useful for users (e.g., for custom settings)
|
|
30
36
|
var constants_1 = require("./constants");
|
|
31
37
|
Object.defineProperty(exports, "DEFAULT_SETTINGS", { enumerable: true, get: function () { return constants_1.DEFAULT_SETTINGS; } });
|
|
32
38
|
Object.defineProperty(exports, "DEFAULT_ASPECTS", { enumerable: true, get: function () { return constants_1.DEFAULT_ASPECTS; } });
|
|
33
|
-
Object.defineProperty(exports, "DEFAULT_ASPECT_CATEGORIES", { enumerable: true, get: function () { return constants_1.DEFAULT_ASPECT_CATEGORIES; } });
|
|
34
39
|
Object.defineProperty(exports, "ZODIAC_SIGNS", { enumerable: true, get: function () { return constants_1.ZODIAC_SIGNS; } });
|
|
35
40
|
// Export ChartSettings class for advanced configuration
|
|
36
41
|
var ChartSettings_1 = require("./config/ChartSettings");
|
|
37
42
|
Object.defineProperty(exports, "ChartSettings", { enumerable: true, get: function () { return ChartSettings_1.ChartSettings; } });
|
|
38
43
|
// Default export for convenience (e.g. UMD builds or simple script tags)
|
|
39
|
-
const
|
|
40
|
-
exports.default =
|
|
44
|
+
const chart2txt_2 = require("./chart2txt");
|
|
45
|
+
exports.default = chart2txt_2.chart2txt;
|