Node.js library and API for working with the I Ching, including as a graph.
Install:
npm install --save i-ching
Load the module, and consult the Oracle:
var iChing = require('i-ching');
var reading = iChing.ask('to be or not to be?');
console.log('%d %s %s',
reading.hexagram.number,
reading.hexagram.character,
reading.hexagram.names.join(', '));
if (reading.change) {
console.log('changing lines: %j', reading.change.changingLines);
console.log('change to hexagram: %d %s %s',
reading.change.to.number,
reading.change.to.character,
reading.change.to.names.join(', '));
} else {
console.log('no changing lines');
}
Example output:
14 ䷍ Great Possessing, Possession in Great Measure
changing lines: [1,1,1,0,0,1]
change to hexagram: 16 ䷏ Providing-For, Enthusiasm
Get trigram 8:
console.log(iChing.trigram(8));
/* output:
Trigram {
number: 8,
names: [ 'Open', 'The Joyous' ],
chineseName: '兌',
pinyinName: 'duì',
character: '☱',
attribute: 'joyful',
images: [ 'swamp', 'lake' ],
chineseImage: '澤',
pinyinImage: 'zé',
familyRelationship: 'third daughter',
binary: '011',
lines: [ 1, 1, 0 ] }
*/
Get hexagram 3:
console.log(iChing.hexagram(3));
/* output:
Hexagram {
number: 3,
names: [ 'Sprouting', 'Difficulty at the Beginning' ],
chineseName: '屯',
pinyinName: 'zhūn',
character: '䷂',
topTrigram:
Trigram {
number: 4,
// ...etc...
}
bottomTrigram:
Trigram {
number: 3,
// ...etc...
},
binary: '010001',
lines: [ 1, 0, 0, 0, 1, 0 ] }
*/
Get a specific Change:
console.log(iChing.hexagram(1).changeTo(63));
/* output:
Change {
from:
Hexagram {
number: 1,
// ...etc...
},
to:
Hexagram {
number: 63,
// ...etc...
},
binary: '101010',
changingLines: [ 0, 1, 0, 1, 0, 1 ] }
*/
npm install --save i-ching
iChing.asGraph()
iChing.ask(question)
iChing.hexagram(number)
iChing.trigram(number)
iChing.trigramSequence(name)
Hexagram.binary
Hexagram.bottomTrigram
Hexagram.changes
Hexagram.character
Hexagram.chineseName
Hexagram.lines
Hexagram.names
Hexagram.number
Hexagram.pinyinName
Hexagram.topTrigram
Trigram.attribute
Trigram.binary
Trigram.character
Trigram.chineseImage
Trigram.chineseName
Trigram.familyRelationship
Trigram.images
Trigram.lines
Trigram.names
Trigram.number
Trigram.pinyinImage
Trigram.pinyinName
var iChing = require('i-ching');
Returns an array containing the 64 Hexagram
s.
Example
console.log(iChing.hexagrams.length);
// output: 64
Returns an array containing the 8 Trigram
s.
Example
console.log(iChing.trigrams.length);
// output: 8
Returns an object suitable for graph applications.
Example
console.log(iChing.asGraph());
/* output excerpt:
{ nodes:
[ { id: 't1', type: 'trigram', name: '☰', number: 1 },
{ id: 't2', type: 'trigram', name: '☷', number: 2 },
// ... etc trigrams ...
{ id: 't8', type: 'trigram', name: '☱', number: 8 },
//
{ id: 'h1', type: 'hexagram', name: '䷀', number: 1 },
{ id: 'h2', type: 'hexagram', name: '䷁', number: 2 },
// ... etc hexagrams ...
{ id: 'h64', type: 'hexagram', name: '䷿', number: 64 } ],
edges:
[ // ... etc hexagrams 1,2,3 edges ...
//
// hexagram 4 edge to top and bottom trigram
{ id: 'h4-t4-bottom', from: 'h4', to: 't4', name: 'bottom' }
{ id: 'h4-t5-top', from: 'h4', to: 't5', name: 'top' }
// hexagram 4 edge to other hexagrams, name = changed lines
{ id: 'h4-h1', from: 'h4', to: 'h1', name: '011101' }
{ id: 'h4-h2', from: 'h4', to: 'h2', name: '100010' }
// ... etc hexagram 4 edges ...
{ id: 'h4-h64', from: 'h4', to: 'h64', name: '001000' }
//
// ... etc hexagram 5-64 edges
]
} */
The names of the hexagram-to-hexagram edges are the binary representation of the changing lines between those hexagrams. For more information see the Change.binary
property.
Returns a Reading
with randomness seeded by the supplied question
. The question can be any javascript type including strings, numbers, objects, arrays, and even undefined
. Supplying the same question
a second time will not, however, result in the same reading.
The reading is generated using the yarrow stalk method described in Wilhelm's translation. See references.
Example
var reading = iChing.ask('what is the meaning of life?');
console.log('%d -> %d %j',
reading.hexagram.character,
reading.change.to.character,
reading.change.changingLines);
// output (will vary due to randomness):
䷀ -> ䷾ [0,1,0,1,0,1]
Returns the Hexagram
corresponding to the number
. The number
must be an integer from 1 to 64 inclusive. Hexagrams are numbered according to the traditional sequence.
Example
console.log(iChing.hexagram(22).names);
// output: [ 'Adorning', 'Grace' ]
Returns the Trigram
corresponding to the number
. The number
must be an integer from 1 to 8 inclusive. Trigrams are numbered as follows:
- ☰ Force, The Creative
- ☷ Field, The Receptive
- ☳ Shake, The Arousing
- ☵ Gorge, The Abysmal
- ☶ Bound, Keeping Still
- ☴ Ground, The Gentle
- ☲ Radiance, The Clinging
- ☱ Open, The Joyous
Example
console.log(iChing.trigram(1).names);
// output: [ 'Force', 'The Creative' ]
Returns an array of Trigram
s ordered according to the name
d traditional sequence. Possible values for name
and their corresponding outputs are as follows.
"earlierHeaven"
0. ☰ The Creative
1. ☴ Ground, The Gentle
2. ☵ Gorge, The Abysmal
3. ☶ Bound, Keeping Still
4. ☷ Field, The Receptive
5. ☳ Shake, The Arousing
6. ☲ Radiance, The Clinging
7. ☱ Open, The Joyous
"laterHeaven"
0. ☲ Radiance, The Clinging
1. ☷ Field, The Receptive
2. ☱ Open, The Joyous
3. ☰ The Creative
4. ☵ Gorge, The Abysmal
5. ☶ Bound, Keeping Still
6. ☳ Shake, The Arousing
7. ☴ Ground, The Gentle
The Change
class represents a change from one hexagram to another.
Returns a string containing the binary representation of the change lines. The most significant digit represents the top line and the least significant digit represents the bottom line. A bit value of 1 means the line changed, and a value of 0 means it did not change.
Example
var h = iChing.hexagram(5);
var c = h.changeTo(1);
console.log('%s -> %s %s',
c.from.character,
c.to.character,
c.binary);
// output: ䷄ -> ䷀ 101000
Returns an array of integers representing the changing lines. A value of 1 denotes a changed line. A value of 0 denotes an unchanged line. Lines are represented from the bottom of the hexagram to top in the array.
Example
var h = iChing.hexagram(5);
var c = h.changeTo(1);
console.log('%s -> %s %s',
c.from.character,
c.to.character,
c.changingLines);
// output: ䷄ -> ䷀ [ 0, 0, 0, 1, 0, 1 ]
Returns the Hexagram
from which the change originated.
Example
console.log(iChing.hexagram(5).changeTo(1).from.number);
// output: 5
Returns the Hexagram
which results from the change.
Example
console.log(iChing.hexagram(5).changeTo(1).to.number);
// output: 1
The Hexagram
class represents a hexagram of the I Ching. There are 64 possible Hexagram
instances.
Returns a string containing the binary representation of the lines of the hexagram. The most significant digit is the top line and the least significant digit is the bottom line.
Example
console.log('%s %s',
iChing.hexagram(63).character,
iChing.hexagram(63).binary);
// output: ䷾ 010101
Returns a Trigram
representing the bottom 3 lines of the hexagram.
Example
console.log('%s %s',
iChing.hexagram(8).character,
iChing.hexagram(8).bottomTrigram.character);
// output: ䷇ ☷
Returns an array of Change
s representing the 63 possible changes to the other hexagrams of the I Ching.
Example
var h = iChing.hexagram(48);
var c = h.changes[0];
console.log('%s -> %s %s', h.character, c.to.character, c.binary);
// output: ䷯ -> ䷀ 101001
Returns a string containing the hexagram character, which is a pictogram representing the lines of the hexagram. The characters codes for these characters range from \u4dc0
to \u4dff
(hexadecimal character codes).
Example
var c = iChing.hexagram(2).character;
console.log('%s \\u%s', c, c.charCodeAt(0).toString(16));
// output ䷁ \u4dc0
Returns a string containing the Chinese name of the hexagram.
Example
console.log(iChing.hexagram(5).chineseName);
// output: 需
Returns an array of integers representing the lines of the hexagram. A value of 1 denotes a solid line. A value of 0 denotes a broken line. Lines are represented from the bottom of the hexagram to top in the array.
Example
console.log('%s %j',
iChing.hexagram(64).character,
iChing.hexagram(64).lines);
// output: ䷿ [0,1,0,1,0,1]
Returns an array of strings containing the names of the hexagram.
Example
console.log(iChing.hexagram(31).names);
// output: [ 'Conjoining', 'Influence (Wooing)' ]
Returns an integer which is the hexagram number. Hexagrams are numbered according to the traditional sequence.
Example
console.log(iChing.hexagram(15).number);
// output: 15
Returns a string containing the pinyin representation of the Chinese name of the hexagram.
Example
console.log(iChing.hexagram(5).pinyinName);
// output: xū
Returns a Trigram
representing the top 3 lines of the hexagram.
Example
console.log('%s %s',
iChing.hexagram(8).character,
iChing.hexagram(8).topTrigram.character);
// output: ䷇ ☵
Returns a Change
representing the change that would occur if the specified lines
of the hexagram were changed. The lines
parameter must be an Array
with 6 elements whose values are either 1 or 0. Element zero of the lines
array represents the bottom line of the hexagram and element five represents the top line. A value of 1 means the corresponding line changes. A value of 0 means that the corresponding line does not change.
Example
var change = iChing.hexagram(1).changeLines([1,0,1,0,1,0]);
console.log('%s -> %s %j',
change.from.character,
change.to.character,
change.changingLines);
// output: ䷀ -> ䷿ [1,0,1,0,1,0]
Returns a Change
representing the change from the current hexagram to the hexagram specified by number
. The number
must be an integer from 1 to 64 inclusive. If number
is the number of the current hexagram, then the method returns null
. Hexagrams are numbered according to the traditional sequence.
Example
console.log(iChing.hexagram(5).changeTo(1).changingLines);
// output: [ 0, 0, 0, 1, 0, 1 ]
The Reading
class represents the results of a consultation with the Oracle. The yarrow stalk method is used to obtain the reading, as described in Wilhelm's translation. See references.
Returns the Change
that was divined by the Oracle of the main hexagram of the reading to one of the other hexagrams of the I Ching. This property will return null
if there are no changed lines in the reading.
Example
var reading = iChing.ask('what am I becoming?');
console.log(reading.change ? reading.change.to.number : 'nothing!');
// output (will vary due to randomness in the reading):
[ 'Bound', 'Keeping Still, Mountain' ]
Returns the Hexagram
that was divined by the Oracle based on the question.
Example
var reading = iChing.ask('which hexagram is the best for me?');
console.log(reading.hexagram.names);
// output (will very due to randomness in the reading):
[ 'Great Exceeding', 'Preponderance of the Great' ]
The Trigram
class represents a trigram of the I Ching. There are 8 possible Trigram
instances.
Returns a string containing the "attribute" of the trigram.
Example
console.log(iChing.trigram(1).attribute);
// output: strong
Returns a string containing the binary representation of the lines of the trigram. The most significant digit is the top line and the least significant digit is the bottom line.
Example
console.log('%s %s',
iChing.trigram(3).character,
iChing.trigram(3).binary);
// output: ☳ 001
Returns a string containing the trigram character, which is a pictogram representing the lines of the trigram. The characters codes for these characters range from \u2630
to \u2637
(hexadecimal character codes).
Example
var c = iChing.trigram(2).character;
console.log('%s \\u%s', c, c.charCodeAt(0).toString(16));
// output: ☷ \u2637
Returns a string containing the Chinese "image" of the trigram.
Example
console.log(iChing.trigram(5).chineseImage);
// output: 山
Returns a string containing the Chinese name of the trigram.
Example
console.log(iChing.trigram(5).chineseName);
// output: 艮
Returns a string containing the "family relationship" represented by the trigram.
Example
console.log(iChing.trigram(6).familyRelationship);
// output: first daughter
Returns an array of strings containing the "images" of the trigram. These are the inherent properties of nature represented by the trigram.
Example
console.log(iChing.trigram(6).images);
// output: [ 'wind', 'wood' ]
Returns an array of integers representing the lines of the trigram. A value of 1 denotes a solid line. A value of 0 denotes a broken line. Lines are represented from bottom of the trigram to top in the array.
Example
console.log('%s %j',
iChing.trigram(3).character,
iChing.trigram(3).lines);
// output: ☳ [1,0,0]
Returns an array of strings containing the names of the trigram.
Example
console.log(iChing.trigram(2).names);
// output: [ 'Field', 'The Receptive' ]
Returns an integer which is the trigram number. Trigrams are numbered according to the order presented in the Wilhelm translation (see references) as follows:
- ☰ Force, The Creative
- ☷ Field, The Receptive
- ☳ Shake, The Arousing
- ☵ Gorge, The Abysmal
- ☶ Bound, Keeping Still
- ☴ Ground, The Gentle
- ☲ Radiance, The Clinging
- ☱ Open, The Joyous
Example
console.log(iChing.trigram(1).number);
// output: 1
Returns a string containing the pinyin representation of the Chinese "image" of the trigram.
Example
console.log(iChing.trigram(5).pinyinImage);
// output: shān
Returns a string containing the pinyin representation of the Chinese name of the trigram.
Example
console.log(iChing.trigram(5).pinyinName);
// output: gèn
Returns an array of Hexagram
s that have the current trigram in the specified position
. Valid values for position
are as follows:
'top'
- returns the 8 hexagrams that have the current trigram in the top position.'bottom'
- returns the 8 hexagrams that have the current trigram in bottom position.undefined
- returns the 15 hexagrams that have the current trigram in either the top or bottom position. Note that one of the hexagrams will have the trigram in both the top and bottom positions, which is why there are a total 15 instead of 16.
Examples
var hexagrams = iChing.trigram(2).hexagrams();
var numbers = [];
hexagrams.forEach((h) => {
numbers.push(h.number);
});
console.log('%d items: %j', numbers.length, numbers);
// output:
// 15 items: [2,7,8,11,12,15,16,19,20,23,24,35,36,45,46]
var hexagrams = iChing.trigram(2).hexagrams('top');
var numbers = [];
hexagrams.forEach((h) => {
numbers.push(h.number);
});
console.log('%d items: %j', numbers.length, numbers);
// output:
// 8 items: [2,7,11,15,19,24,36,46]
npm test
- Added
Trigram.hexagrams(position)
method. - Documentation improvements in README.
- Fixed minor logical error in yarrow stalk operation.
- Changed
iChing.reading
method toiChing.ask
.
- Minor documentation cleanup.
- Added the
Reading
class and the yarrow stalk method of obtaining a reading. - Added
Hexagram.changeLines
method. - Separated pinyin names from Chinese names into their own properties.
- initial release