From ec39dfc1ba3809f98c5081684418ef282cec9d1b Mon Sep 17 00:00:00 2001 From: Nicolas Mielec Date: Fri, 15 Aug 2025 11:24:07 +0200 Subject: [PATCH 1/3] lets-go:0.1.0 --- packages/preview/lets-go/0.1.0/LICENSE | 21 + .../lets-go/0.1.0/examples/example.svg | 895 ++++++++++++++++++ .../lets-go/0.1.0/examples/example.typ | 48 + packages/preview/lets-go/0.1.0/lib.typ | 194 ++++ packages/preview/lets-go/0.1.0/readme.md | 100 ++ packages/preview/lets-go/0.1.0/typst.toml | 11 + 6 files changed, 1269 insertions(+) create mode 100644 packages/preview/lets-go/0.1.0/LICENSE create mode 100644 packages/preview/lets-go/0.1.0/examples/example.svg create mode 100644 packages/preview/lets-go/0.1.0/examples/example.typ create mode 100644 packages/preview/lets-go/0.1.0/lib.typ create mode 100644 packages/preview/lets-go/0.1.0/readme.md create mode 100644 packages/preview/lets-go/0.1.0/typst.toml diff --git a/packages/preview/lets-go/0.1.0/LICENSE b/packages/preview/lets-go/0.1.0/LICENSE new file mode 100644 index 0000000000..d521660ac3 --- /dev/null +++ b/packages/preview/lets-go/0.1.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Nicolas M + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/packages/preview/lets-go/0.1.0/examples/example.svg b/packages/preview/lets-go/0.1.0/examples/example.svg new file mode 100644 index 0000000000..855149f699 --- /dev/null +++ b/packages/preview/lets-go/0.1.0/examples/example.svg @@ -0,0 +1,895 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/preview/lets-go/0.1.0/examples/example.typ b/packages/preview/lets-go/0.1.0/examples/example.typ new file mode 100644 index 0000000000..2e4f5d5a4d --- /dev/null +++ b/packages/preview/lets-go/0.1.0/examples/example.typ @@ -0,0 +1,48 @@ +#import "../lib.typ": go-board, go-board-9, go-board-19 + + +#set page(margin: 1cm, height: auto) + +#align(center, { + box(stroke: black, width: 40%, go-board-9(stones: ("ab", "ac", "ef"))) + h(1cm) + box(stroke: black, width: 40%, go-board( + size: 5, + // Stones stay positioned from the top left corner + stones: ((position: "ac", color: "white"), (position: "bb", skip-numbering: true), "cc", "ed", "ec", "dc"), + marks: ("db",), + mark-radius: 5%, + open-edges: ("left", "bottom"), + open-edges-added-length: 7%, + padding: 2mm, + board-fill: luma(90%), + black-stone: move(dx: -50%, dy: -50%, circle( + width: 100%, + fill: black, + stroke: white + 0.2pt, + )), + white-stone: move(dx: -50%, dy: -50%, circle( + width: 100%, + fill: white, + stroke: black + 0.2pt, + )), + stone-diameter-ratio: 0.8, + add-played-number: true, + )) +}) + +#figure( + { + set text(size: 15pt, weight: "semibold") + block(width: 70%, go-board( + size: 10, + stones: ("cc", "dd", "dc", "ed", "be", "dg", "fb", "hd"), + add-played-number: true, + open-edges: ("right", "bottom"), + marks: ("dd", "jd"), + )) + }, + caption: [Example joseki], + kind: "goban", + supplement: [Goban], +) diff --git a/packages/preview/lets-go/0.1.0/lib.typ b/packages/preview/lets-go/0.1.0/lib.typ new file mode 100644 index 0000000000..561d2b8e03 --- /dev/null +++ b/packages/preview/lets-go/0.1.0/lib.typ @@ -0,0 +1,194 @@ +#let input-position-to-coords(position) = { + if type(position) == array { + return ( + row: position.at(0), + col: position.at(1), + ) + } + + let m = position.match(regex("([ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst])(\d{1,2})")) + if m != none { + let A_UNICODE = 65 + let ZERO_UNICODE = 50 + return ( + row: m.captures.at(0).codepoints().at(0).to-unicode() - A_UNICODE, + col: int(m.captures.at(1)) - 1, + ) + } + + let m = position.match(regex("([abcdefghijklmnopqrst])([abcdefghijklmnopqrst])")) + if m != none { + let a_unicode = 97 + return ( + row: m.captures.at(0).to-unicode() - a_unicode, + col: m.captures.at(1).to-unicode() - a_unicode, + ) + } + + return none +} + +#let draw-stone(highlight-color: none, shadow-color: none) = { + move( + dx: -50%, + dy: -50%, + circle( + width: 100%, + fill: gradient.radial(center: (40%, 40%), highlight-color, shadow-color), + ), + ) +} +#let black-stone = draw-stone(highlight-color: luma(130), shadow-color: luma(40)) +#let white-stone = draw-stone(highlight-color: luma(100%), shadow-color: luma(70%)) + + +/// This is the main function that draws a go board +/// +/// - stones (): List of stones to place +/// - size (int): Board size +/// - marks (): Reference marks to draw +/// - padding (): Border padding +/// - board-fill (): Background fill +/// - mark-radius (): Reference marks radius +/// - stone-diameter-ratio (): Ratio of stone diameter to grid size +/// - black-stone (): Black stone to use +/// - white-stone (): White stone to use +/// - open-edges (): Which edges to extend a bit to mark that the board extends there +/// - open-edges-added-length (): Proportion to extend the edges +/// - add-played-number (): Add numbers showing the play order +/// -> content +#let go-board( + stones: (), + size: 13, + marks: (), + padding: 0mm, + board-fill: orange.lighten(70%), + mark-radius: 2%, + stone-diameter-ratio: 0.75, + black-stone: black-stone, + white-stone: white-stone, + open-edges: (), + open-edges-added-length: 4%, + add-played-number: false, +) = { + let ratio-line-board-len = (100% - 2 * padding) * (size - 1) / size + let edge-padding = padding + 0.5 / (size - 1) * ratio-line-board-len + let stone-diameter = stone-diameter-ratio / size * 100% + + black-stone = scale(stone-diameter-ratio / size * 100%, origin: top + left, black-stone) + white-stone = scale(stone-diameter-ratio / size * 100%, origin: top + left, white-stone) + + let open-edges-paddings = ( + top: 0%, + right: 0%, + bottom: 0%, + left: 0%, + ) + + for dir in open-edges-paddings.keys() { + if open-edges.contains(dir) { + open-edges-paddings.insert(dir, open-edges-added-length) + } + } + + square( + fill: board-fill, + stroke: none, + inset: 0%, + outset: 0%, + width: 100%, + { + for p in range(size) { + place( + dy: edge-padding + p / (size - 1) * ratio-line-board-len, + dx: edge-padding - open-edges-paddings.at("left"), + line(length: ratio-line-board-len + open-edges-paddings.at("left") + open-edges-paddings.at("right")), + ) + } + + for p in range(size) { + place( + dx: edge-padding + p / (size - 1) * ratio-line-board-len, + dy: edge-padding - open-edges-paddings.at("top"), + line( + angle: 90deg, + length: ratio-line-board-len + open-edges-paddings.at("top") + open-edges-paddings.at("bottom"), + ), + ) + } + + for mark in marks { + let coords = input-position-to-coords(mark) + place( + dx: edge-padding + (coords.col) * ratio-line-board-len / (size - 1) - mark-radius / 2, + dy: edge-padding + (coords.row) * ratio-line-board-len / (size - 1) - mark-radius / 2, + circle( + width: mark-radius, + fill: black, + stroke: none, + ), + ) + } + + let next-color = "black" + let next-number = 1 + for stone in stones { + let is-dict = type(stone) == dictionary + let is-black = next-color == "black" + let skip-numbering = false + + let coords = input-position-to-coords(if is-dict and "position" in stone { stone.at("position") } else { + stone + }) + + if is-dict and "skip-numbering" in stone { skip-numbering = true } + if is-dict and "color" in stone { + is-black = stone.at("color") == "black" + } + + let dx = edge-padding + (coords.col) * ratio-line-board-len / (size - 1) + let dy = edge-padding + (coords.row) * ratio-line-board-len / (size - 1) + place( + dx: dx, + dy: dy, + if is-black { + black-stone + } else { white-stone }, + ) + if add-played-number and not skip-numbering { + place( + dx: dx, + dy: dy, + // Hacky, I don't know how to center it better + move(dx: -5%, dy: -5%, box(width: 10%, height: 10%, align(horizon + center, text( + fill: if is-black { + white + } else { black }, + )[#next-number]))), + ) + } + if not skip-numbering { + next-number = next-number + 1 + } + next-color = if is-black { "white" } else { "black" } + } + }, + ) +} + + +#let go-board-19 = go-board.with( + marks: ((3, 3), (3, 9), (3, 15), (9, 3), (9, 9), (9, 15), (15, 3), (15, 9), (15, 15)), + size: 19, +) + +#let go-board-13 = go-board.with( + size: 13, + marks: ((3, 3), (9, 3), (3, 9), (9, 9), (6, 6)), +) + +#let go-board-9 = go-board.with( + size: 9, + marks: ((2, 2), (6, 2), (2, 6), (6, 6), (4, 4)), +) + diff --git a/packages/preview/lets-go/0.1.0/readme.md b/packages/preview/lets-go/0.1.0/readme.md new file mode 100644 index 0000000000..d6b2509af3 --- /dev/null +++ b/packages/preview/lets-go/0.1.0/readme.md @@ -0,0 +1,100 @@ +# Let's-Go: a goban drawing library for Typst + +Draw a goban that will scale to the width of its parent. + +The library exposes a generic `go-board` function which takes a size and stones to place. +For now the board will be a square, no possibility to draw a rectangular portion of a board. + +`#go-board(size: 13, stones: ("ab", "ac", "ef"))` + +The library also exposes functions `go-board-9`, `go-board-13`, and `go-board-19` which provide the sizes and the references marks for common goban sizes. + +Here is the list of current customization arguments for the goban, you can find it in the source : +``` +/// - stones (): List of stones to place ("ac", "ef", ...) +/// - size (int): Board size +/// - marks (): Reference marks to draw ("dd", "df", ...) +/// - padding (): Border padding +/// - board-fill (): Background fill +/// - mark-radius (): Reference marks radius +/// - stone-diameter-ratio (): Ratio of stone diameter to grid size +/// - black-stone (): Black stone to use +/// - white-stone (): White stone to use +/// - open-edges (): Which edges to extend a bit to mark that the board extends there +/// - open-edges-added-length (): Proportion to extend the edges +/// - add-played-number (): Add numbers showing the play order +``` + +Here are three example goban with different customizations. + +![Go board](examples/example.svg) + +```typst +#import "@preview/lets-go:0.1.0": go-board, go-board-9 + +#align(center, { + // First goban, no customization + box(stroke: black, width: 40%, go-board-9(stones: ("ab", "ac", "ef"))) + h(1cm) + // Second goban with: + // - stone parameters + // - custom marks + // - open edges to signify that this is a portion of a larger goban + // - a different background color + // - different black and white stones + // - numbering of the plays + box(stroke: black, width: 40%, go-board( + size: 5, + // Stones stay positioned from the top left corner + stones: ((position: "ac", color: "white"), (position: "bb", skip-numbering: true), "cc", "ed", "ec", "dc"), + marks: ("db",), + mark-radius: 5%, + open-edges: ("left", "bottom"), + open-edges-added-length: 7%, + padding: 2mm, + board-fill: luma(90%), + black-stone: move(dx: -50%, dy: -50%, circle( + width: 100%, + fill: black, + stroke: white + 0.2pt, + )), + white-stone: move(dx: -50%, dy: -50%, circle( + width: 100%, + fill: white, + stroke: black + 0.2pt, + )), + stone-diameter-ratio: 0.8, + add-played-number: true, + )) +}) + +// An example goban in a figure with adjusted font-size +#figure( + { + set text(size: 15pt, weight: "semibold") + block(width: 70%, go-board( + size: 10, + stones: ("cc", "dd", "dc", "ed", "be", "dg", "fb", "hd"), + add-played-number: true, + open-edges: ("right", "bottom"), + marks: ("dd", "jd"), + )) + }, + caption: [Example joseki], + kind: "goban", + supplement: [Goban], +) +``` + +# TODO + +- Fix font sizing +- Add labels and annotations +- Enhance stone placement definition +- Add the possibility to parse from a SGF game record + + +# Contributing + +This package is open to contributions, I don't have strong opinions on the direction it should take. +Don't hesitate to make pull requests, or to ask me to become a manager. \ No newline at end of file diff --git a/packages/preview/lets-go/0.1.0/typst.toml b/packages/preview/lets-go/0.1.0/typst.toml new file mode 100644 index 0000000000..1bffd706f5 --- /dev/null +++ b/packages/preview/lets-go/0.1.0/typst.toml @@ -0,0 +1,11 @@ +[package] +name = "lets-go" +version = "0.1.0" +entrypoint = "lib.typ" +authors = ["Nicolas Mielec"] +repository = "https://github.com/nmielec/lets-go" +license = "MIT" +description = "Draw go game boards easily, with some customization features." +keywords = ["go", "goban", "game"] +categories = [] +exclude = ["examples"] \ No newline at end of file From 682ada438cb20ab080f9be7efee7d82ef937e34a Mon Sep 17 00:00:00 2001 From: Nicolas Mielec Date: Fri, 15 Aug 2025 11:24:07 +0200 Subject: [PATCH 2/3] lets-go:0.1.0 Fix pull request errors --- packages/preview/lets-go/0.1.0/README.md | 100 ++++++++++++++++++ .../lets-go/0.1.0/examples/example.typ | 3 +- 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 packages/preview/lets-go/0.1.0/README.md diff --git a/packages/preview/lets-go/0.1.0/README.md b/packages/preview/lets-go/0.1.0/README.md new file mode 100644 index 0000000000..d6b2509af3 --- /dev/null +++ b/packages/preview/lets-go/0.1.0/README.md @@ -0,0 +1,100 @@ +# Let's-Go: a goban drawing library for Typst + +Draw a goban that will scale to the width of its parent. + +The library exposes a generic `go-board` function which takes a size and stones to place. +For now the board will be a square, no possibility to draw a rectangular portion of a board. + +`#go-board(size: 13, stones: ("ab", "ac", "ef"))` + +The library also exposes functions `go-board-9`, `go-board-13`, and `go-board-19` which provide the sizes and the references marks for common goban sizes. + +Here is the list of current customization arguments for the goban, you can find it in the source : +``` +/// - stones (): List of stones to place ("ac", "ef", ...) +/// - size (int): Board size +/// - marks (): Reference marks to draw ("dd", "df", ...) +/// - padding (): Border padding +/// - board-fill (): Background fill +/// - mark-radius (): Reference marks radius +/// - stone-diameter-ratio (): Ratio of stone diameter to grid size +/// - black-stone (): Black stone to use +/// - white-stone (): White stone to use +/// - open-edges (): Which edges to extend a bit to mark that the board extends there +/// - open-edges-added-length (): Proportion to extend the edges +/// - add-played-number (): Add numbers showing the play order +``` + +Here are three example goban with different customizations. + +![Go board](examples/example.svg) + +```typst +#import "@preview/lets-go:0.1.0": go-board, go-board-9 + +#align(center, { + // First goban, no customization + box(stroke: black, width: 40%, go-board-9(stones: ("ab", "ac", "ef"))) + h(1cm) + // Second goban with: + // - stone parameters + // - custom marks + // - open edges to signify that this is a portion of a larger goban + // - a different background color + // - different black and white stones + // - numbering of the plays + box(stroke: black, width: 40%, go-board( + size: 5, + // Stones stay positioned from the top left corner + stones: ((position: "ac", color: "white"), (position: "bb", skip-numbering: true), "cc", "ed", "ec", "dc"), + marks: ("db",), + mark-radius: 5%, + open-edges: ("left", "bottom"), + open-edges-added-length: 7%, + padding: 2mm, + board-fill: luma(90%), + black-stone: move(dx: -50%, dy: -50%, circle( + width: 100%, + fill: black, + stroke: white + 0.2pt, + )), + white-stone: move(dx: -50%, dy: -50%, circle( + width: 100%, + fill: white, + stroke: black + 0.2pt, + )), + stone-diameter-ratio: 0.8, + add-played-number: true, + )) +}) + +// An example goban in a figure with adjusted font-size +#figure( + { + set text(size: 15pt, weight: "semibold") + block(width: 70%, go-board( + size: 10, + stones: ("cc", "dd", "dc", "ed", "be", "dg", "fb", "hd"), + add-played-number: true, + open-edges: ("right", "bottom"), + marks: ("dd", "jd"), + )) + }, + caption: [Example joseki], + kind: "goban", + supplement: [Goban], +) +``` + +# TODO + +- Fix font sizing +- Add labels and annotations +- Enhance stone placement definition +- Add the possibility to parse from a SGF game record + + +# Contributing + +This package is open to contributions, I don't have strong opinions on the direction it should take. +Don't hesitate to make pull requests, or to ask me to become a manager. \ No newline at end of file diff --git a/packages/preview/lets-go/0.1.0/examples/example.typ b/packages/preview/lets-go/0.1.0/examples/example.typ index 2e4f5d5a4d..404e853a1e 100644 --- a/packages/preview/lets-go/0.1.0/examples/example.typ +++ b/packages/preview/lets-go/0.1.0/examples/example.typ @@ -1,5 +1,4 @@ -#import "../lib.typ": go-board, go-board-9, go-board-19 - +#import "@preview/lets-go:0.1.0": go-board, go-board-9, go-board-19 #set page(margin: 1cm, height: auto) From 086655fdf77a9e4a860bba4fc586161a33eb75b4 Mon Sep 17 00:00:00 2001 From: Nicolas Mielec Date: Fri, 15 Aug 2025 11:53:39 +0200 Subject: [PATCH 3/3] lets-go:0.1.0 Removes duplicate readme.md --- packages/preview/lets-go/0.1.0/readme.md | 100 ----------------------- 1 file changed, 100 deletions(-) delete mode 100644 packages/preview/lets-go/0.1.0/readme.md diff --git a/packages/preview/lets-go/0.1.0/readme.md b/packages/preview/lets-go/0.1.0/readme.md deleted file mode 100644 index d6b2509af3..0000000000 --- a/packages/preview/lets-go/0.1.0/readme.md +++ /dev/null @@ -1,100 +0,0 @@ -# Let's-Go: a goban drawing library for Typst - -Draw a goban that will scale to the width of its parent. - -The library exposes a generic `go-board` function which takes a size and stones to place. -For now the board will be a square, no possibility to draw a rectangular portion of a board. - -`#go-board(size: 13, stones: ("ab", "ac", "ef"))` - -The library also exposes functions `go-board-9`, `go-board-13`, and `go-board-19` which provide the sizes and the references marks for common goban sizes. - -Here is the list of current customization arguments for the goban, you can find it in the source : -``` -/// - stones (): List of stones to place ("ac", "ef", ...) -/// - size (int): Board size -/// - marks (): Reference marks to draw ("dd", "df", ...) -/// - padding (): Border padding -/// - board-fill (): Background fill -/// - mark-radius (): Reference marks radius -/// - stone-diameter-ratio (): Ratio of stone diameter to grid size -/// - black-stone (): Black stone to use -/// - white-stone (): White stone to use -/// - open-edges (): Which edges to extend a bit to mark that the board extends there -/// - open-edges-added-length (): Proportion to extend the edges -/// - add-played-number (): Add numbers showing the play order -``` - -Here are three example goban with different customizations. - -![Go board](examples/example.svg) - -```typst -#import "@preview/lets-go:0.1.0": go-board, go-board-9 - -#align(center, { - // First goban, no customization - box(stroke: black, width: 40%, go-board-9(stones: ("ab", "ac", "ef"))) - h(1cm) - // Second goban with: - // - stone parameters - // - custom marks - // - open edges to signify that this is a portion of a larger goban - // - a different background color - // - different black and white stones - // - numbering of the plays - box(stroke: black, width: 40%, go-board( - size: 5, - // Stones stay positioned from the top left corner - stones: ((position: "ac", color: "white"), (position: "bb", skip-numbering: true), "cc", "ed", "ec", "dc"), - marks: ("db",), - mark-radius: 5%, - open-edges: ("left", "bottom"), - open-edges-added-length: 7%, - padding: 2mm, - board-fill: luma(90%), - black-stone: move(dx: -50%, dy: -50%, circle( - width: 100%, - fill: black, - stroke: white + 0.2pt, - )), - white-stone: move(dx: -50%, dy: -50%, circle( - width: 100%, - fill: white, - stroke: black + 0.2pt, - )), - stone-diameter-ratio: 0.8, - add-played-number: true, - )) -}) - -// An example goban in a figure with adjusted font-size -#figure( - { - set text(size: 15pt, weight: "semibold") - block(width: 70%, go-board( - size: 10, - stones: ("cc", "dd", "dc", "ed", "be", "dg", "fb", "hd"), - add-played-number: true, - open-edges: ("right", "bottom"), - marks: ("dd", "jd"), - )) - }, - caption: [Example joseki], - kind: "goban", - supplement: [Goban], -) -``` - -# TODO - -- Fix font sizing -- Add labels and annotations -- Enhance stone placement definition -- Add the possibility to parse from a SGF game record - - -# Contributing - -This package is open to contributions, I don't have strong opinions on the direction it should take. -Don't hesitate to make pull requests, or to ask me to become a manager. \ No newline at end of file