Spec-Zone.ru › Deno 2

@std/ini

Нестабильный API

Этот пакет @std является экспериментальным, и его API может измениться без увеличения основной версии.

Обзор

parse и stringify для работы с данными в формате INI, например с данными из спецификации Desktop Entry. По умолчанию значения разбираются как строки, чтобы сохранить соответствие исходным данным. Настройка возможна с помощью функций reviver/replacer, подобных функциям в JSON.parse и JSON.stringify. Вложенные секции, повторяющиеся имена ключей в одной секции и массивы ключей/значений не поддерживаются, но сохраняются при использовании IniMap. Многострочные значения не поддерживаются и приводят к синтаксической ошибке. Отступы из пробелов и строки, начинающиеся с '#', ';' или '//', считаются комментариями.

import * as ini from "@std/ini";
import { assertEquals } from "@std/assert";

const iniFile = `# Example configuration file
Global Key=Some data here

[Section #1]
Section Value=42
Section Date=1977-05-25`;

const parsed = ini.parse(iniFile, {
  reviver(key, value, section) {
    if (section === "Section #1") {
      if (key === "Section Value") return Number(value);
      if (key === "Section Date") return new Date(value);
    }
    return value;
  },
});

assertEquals(parsed, {
  "Global Key": "Some data here",
  "Section #1": {
    "Section Value": 42,
    "Section Date": new Date("1977-05-25T00:00:00.000Z"),
  },
});

const text = ini.stringify(parsed, {
  replacer(key, value, section) {
    if (section === "Section #1" && key === "Section Date") {
      return (value as Date).toISOString().split("T")[0];
    }
    return value;
  },
});

assertEquals(text, `Global Key=Some data here
[Section #1]
Section Value=42
Section Date=1977-05-25`);

При необходимости для более точной работы с INI можно использовать IniMap. Этот класс позволяет сохранять комментарии, обращаться к значениям как к элементам map, перебирать записи ключей/значений/секций и выполнять другие действия.

import { IniMap } from "@std/ini/ini-map";
import { assertEquals } from "@std/assert";

const ini = new IniMap();
ini.set("section1", "keyA", 100);
assertEquals(ini.toString(), `[section1]
keyA=100`);

ini.set('keyA', 25)
assertEquals(ini.toObject(), {
  keyA: 25,
  section1: {
    keyA: 100
  }
});

API reviver и replacer можно использовать для расширения возможностей IniMap, например, чтобы добавить поддержку дублирующихся ключей, представленных в виде массивов значений.

import { IniMap } from "@std/ini/ini-map";
import { assertEquals } from "@std/assert";

const iniFile = `# Example of key/value arrays
[section1]
key1=This key
key1=is non-standard
key1=but can be captured!`;

const ini = new IniMap({ assignment: "=", deduplicate: true });
ini.parse(iniFile, (key, value, section) => {
  if (section) {
    if (ini.has(section, key)) {
      const exists = ini.get(section, key);
      if (Array.isArray(exists)) {
        exists.push(value);
        return exists;
      } else {
        return [exists, value];
      }
    }
  }
  return value;
});

assertEquals(
  ini.get("section1", "key1"),
  ["This key", "is non-standard", "but can be captured!"]
);

const result = ini.toString((key, value) => {
  if (Array.isArray(value)) {
    return value.join(
      `${ini.formatting.lineBreak}${key}${ini.formatting.assignment}`,
    );
  }
  return value;
});

assertEquals(result, iniFile);

Добавление в проект

›_
deno add jsr:@std/ini

Все символы в @std/ini на

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/std/ini

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API