semvec/pypi-packages huggingface dataset:
darkest-parser 1.1.1
Parser for .darkest file
Requires Python: >=3.12,<4.0

# darkest-parser

**darkest-parser** is a module to parser `.darkest` file originally from [Darkest Dungeon](https://www.darkestdungeon.com/) programatically.

## Usage

```sh
pip install darkest-parser
```

```python
from darkest_parser import parse, unparse

text = '''
resistances: .stun 40% .poison 40% .bleed 40% .disease 30% .move 40% .debuff 30% .death_blow 67% .trap 40%
weapon: .name "houndmaster_weapon_0" .atk 0% .dmg 4 7 .crit 4% .spd 5
armour: .name "houndmaster_armour_0" .def 10% .prot 0 .hp 21 .spd 0
combat_skill: .id "hounds_rush" .level 0 .type "ranged" .atk 85% .dmg 0% .crit 5% .launch 432 .target 1234 .effect "Beast Killer 1"
combat_skill: .id "hounds_rush" .level 1 .type "ranged" .atk 90% .dmg 0% .crit 6% .launch 432 .target 1234 .effect "Beast Killer 2"
'''

dark = parse(text)

dark[0].tag == 'resistances'
dark[0].set('stun', '60%')
dark[0].poison = '40%'


weapon0 = dark.find('weapon', name='houndmaster_weapon_0')
weapon0.tag == 'weapon'
weapon0.dmg = [14, 17]
weapon0.spd = 25

for rush in dark.finditer('combat_skill', id='hounds_rush'):
    rush.type = 'meele'
    rush.set('ignore_guarded')

rush0 = dark.find(id='hounds_rush', level=0)
# x invalid:
# rush0.effect.append('Human Killer 1')
# √ use instead:
rush0.effect = [*rush0.effect, 'Human Killer 1']

rush1 = dark.find(id='hounds_rush', level=1)
rush1.has('target') == True
rush1.set('target', '~1234', 'literal')
# literal means that the value is unquoted, it's useful in some case,
# for example: launch, target, valid_modes, etc.

print(unparse(dark))
```

## API Reference

```python
def parse(str) -> Darkest:
    ...
def unparse(Darkest) -> str:
    ...

class Darkest:
    def __getitem__(int) -> Element:
        ...
    def finditer(str | None, **{str: Any}) -> Generator[Element, Any, Any]:
        ...
    def findall(str | None, **{str: Any}) -> List[Element]:
        ...
    def find(str | None, **{str: Any}) -> Element:
        ...

class Element:
    def get(str) -> List[Any]:
        ...
    def set(str, Any | List[Any] | None, Literal['number', 'bool', 'string', 'literal'] | None):
        ...
    def pop(str):
        ...
    def has(str) -> bool:
        ...
```
subio 0.1.0
A simple command line tool for convert proxy subscription links.

SubIO 是一个类似于 [Surgio](https://surgio.js.org/) 的订阅转换工具，但是更加轻量级，更易扩展新协议。

### 原理

SubIO 通过将已知的配置格式转换成一个统一的内部数据结构，然后再根据配置将内部数据结构转换成目标格式。

SubIO 和 Surgio 一样，主要有两部分组成，一部分是解析器，负责解析订阅中的节点并转换成内部数据结构，另一部分是渲染器，负责将内部数据结构转换成目标格式。

使用 SubIO 至少需要定义一个输入（provider）、一个转换规则（模板）和一个输出（artifact）。 

### 安装

```shell
pip3 install -e git+https://github.com/ekkog/subio#egg=subio
```

### 使用

- 在当前目录下，创建配置文件 `config.toml`，内容参考 [config.toml](./config.example.toml)。SubIO 也支持 config.yaml/config.json 格式的配置，json 文件支持 [JSON5](https://json5.org/)，JSON5 支持文件中带注释。
- 在当前目录下新建 `template` 目录，并在该目录下创建模板文件，参考 [template](./example/template/clash.yaml)。
- 可以在当前目录下创建 `snippet` 目录，用于存放一些公共的配置片段，参考 [snippet](./example/snippet)。 snippet 语法参考 [Jinja2](https://jinja.palletsprojects.com/en/3.0.x/templates/#macros)。
- 可以在模板中引用远程规则集，规则集需要在配置文件中定义

然后执行 `subio` 命令即可。

```shell
subio
```

### 致谢

- [Surgio](https://surgio.js.org/)