0.0.7 • Published 7 years ago

sgf2go v0.0.7

Weekly downloads
3
License
ISC
Repository
github
Last release
7 years ago

sgf2go

An SGF File Format FF[4] compliant SGF file parser and generator.

Installation

npm install sgf2go

Introduction

I used to use a regular expression to extract what I needed from an sgf file, specifically this one:

/;[BW]\[\w{2}]|A[BWE](\[(\w|:)+]|\s)+|PL\[[BW]]/gi

until I found myself naïve when dealing with an sgf file with variations. most of, if not all, the time, I don't care about the variations. However, my regular expression could not differentiate the nodes belong to the main stream from the nodes belong to a variation. This library serves the purpose of solving this problem.

Essentially, an sgf file contains lists of lists of nodes. A list is enclosed in a pair of curly brackets, while a node starts with a semi-colon ;.

With sgf2go, an sgf file with no variations: will be converted to the following json format:

sgf:

(;FF[4]GM[1]SZ[19];B[aa];W[bb];B[cc];W[dd];B[ad];W[bd])

json:

[
  [
    [
      {"key": "FF", "value": ["4"]},
      {"key": "GM", "value": ["1"]},
      {"key": "SZ", "value": ["19"]}
    ],
    [
      {"key": "B", "value": ["aa"]}
    ],
    [
      {"key": "W", "value": ["bb"]}
    ],
    [
      {"key": "B", "value": ["cc"]}
    ],
    [
      {"key": "W", "value": ["dd"]}
    ],
    [
      {"key": "B", "value": ["ad"]}
    ],
    [
      {"key": "W", "value": ["bd"]}
    ]
  ]
]

One with variation will yield the following result:

sgf:

(;FF[4]GM[1]SZ[19];B[aa];W[bb](;B[cc];W[dd];B[ad];W[bd])
(;B[hh];W[hg]))

json:

[
  [
    [
      {"key":"FF","value":["4"]},
      {"key":"GM","value":["1"]},
      {"key":"SZ","value":["19"]}
    ],
    [
      {"key":"B","value":["aa"]}
    ],
    [
      {"key":"W","value":["bb"]}
    ],
    [
      [
        {"key":"B","value":["cc"]}
      ],
      [
        {"key":"W","value":["dd"]}
      ],
      [
        {"key":"B","value":["ad"]}
      ],
      [
        {"key":"W","value":["bd"]}
      ]
    ],
    [
      [
        {"key":"B","value":["hh"]}
      ],
      [
        {"key":"W","value":["hg"]}
      ]
    ]
  ]
]

Usage

With Nodejs

const sgf2go = require('sgf2go');

With browser

<script src="path/to/sgf2go.js" />

Parse an sgf file into json:

const sgf = `(;FF[4]GM[1]SZ[19];B[aa];W[bb](;B[cc];W[dd];B[ad];W[bd])(;B[hh];W[hg]))`;
const parsed = sgf2go.sgf2json(sgf);
// in browser, const parsed = sgf2json(sgf);
console.log(parsed);

The output will be:

[
  [
    [
      {"key":"FF","value":["4"]},
      {"key":"GM","value":["1"]},
      {"key":"SZ","value":["19"]}
    ],
    [
      {"key":"B","value":["aa"]}
    ],
    [
      {"key":"W","value":["bb"]}
    ],
    [
      [
        {"key":"B","value":["cc"]}
      ],
      [
        {"key":"W","value":["dd"]}
      ],
      [
        {"key":"B","value":["ad"]}
      ],
      [
        {"key":"W","value":["bd"]}
      ]
    ],
    [
      [
        {"key":"B","value":["hh"]}
      ],
      [
        {"key":"W","value":["hg"]}
      ]
    ]
  ]
]

Parse an sgf file into json, but only get the main stream, ignoring any variations:

const sgf = `(;FF[4]GM[1]SZ[19];B[aa];W[bb](;B[cc];W[dd];B[ad];W[bd])(;B[hh];W[hg]))`;
const parsed = sgf2go.sgf2jsonMain(sgf);
// in browser, const parsed = sgf2jsonMain(sgf);
console.log(parsed);

The output will be:

[
  [
    [
      {"key":"FF","value":["4"]},
      {"key":"GM","value":["1"]},
      {"key":"SZ","value":["19"]}
    ],
    [
      {"key":"B","value":["aa"]}
    ],
    [
      {"key":"W","value":["bb"]}
    ],
    [
      {"key":"B","value":["cc"]}
    ],
    [
      {"key":"W","value":["dd"]}
    ],
    [
      {"key":"B","value":["ad"]}
    ],
    [
      {"key":"W","value":["bd"]}
    ]
  ]
]

Generate sgf from json:

const json =[
  [
    [
      {"key":"FF","value":["4"]},
      {"key":"GM","value":["1"]},
      {"key":"SZ","value":["19"]}
    ],
    [
      {"key":"B","value":["aa"]}
    ],
    [
      {"key":"W","value":["bb"]}
    ],
    [
      [
        {"key":"B","value":["cc"]}
      ],
      [
        {"key":"W","value":["dd"]}
      ],
      [
        {"key":"B","value":["ad"]}
      ],
      [
        {"key":"W","value":["bd"]}
      ]
    ],
    [
      [
        {"key":"B","value":["hh"]}
      ],
      [
        {"key":"W","value":["hg"]}
      ]
    ]
  ]
];

const generated = sgf2go.json2sgf(json);
// in browser, const generated = json2sgf(json);
console.log(generated);

The output will be:

(;FF[4]GM[1]SZ[19];B[aa];W[bb](;B[cc];W[dd];B[ad];W[bd])(;B[hh];W[hg]))

Hope it helps.

0.0.7

7 years ago

0.0.6

7 years ago

0.0.5

7 years ago

0.0.4

7 years ago

0.0.3

7 years ago

0.0.2

7 years ago

0.0.1

7 years ago