@4kk11/cooklang-sankey
v0.1.5
Published
Generate Sankey diagram data from Cooklang recipes
Maintainers
Readme
cooklang-sankey
Generate Sankey diagram data from Cooklang recipes.
Installation
npm install cooklang-sankeyUsage
Browser Environment
import { CooklangParser, generateSankeyData, optimizeSankeyData } from 'cooklang-sankey';
// Create a parser instance
const parser = new CooklangParser();
// Your Cooklang recipe text
const recipeText = `
---
title: カルボナーラ
servings: 2
---
@パスタ{200g}を茹でる。
@卵{2個}と@パルメザンチーズ{50g}を混ぜる。
@ベーコン{100g}を炒める。
パスタとソースを合わせて完成。
`;
// Parse the recipe text
const [recipe] = parser.parse(recipeText);
// Generate Sankey data from parsed recipe
const data = generateSankeyData(recipe, {
finalNodeName: "完成品",
normalization: "logarithmic",
});
// Optionally optimize the data
const optimized = data ? optimizeSankeyData(data) : null;
console.log(optimized);Node.js Environment
import { CooklangParser, generateSankeyData, optimizeSankeyData } from 'cooklang-sankey';
// Create parser instance
const parser = new CooklangParser();
const recipeText = `
@パスタ{200g}を茹でる。
@卵{2個}と@パルメザンチーズ{50g}を混ぜる。
`;
// Parse the recipe text
const [recipe] = parser.parse(recipeText);
// Generate Sankey data from parsed recipe
const data = generateSankeyData(recipe);
const optimized = data ? optimizeSankeyData(data) : null;
console.log(JSON.stringify(optimized, null, 2));API
generateSankeyData(recipe, options?)
Generates Sankey diagram data from a parsed Cooklang recipe.
Parameters:
recipe: CooklangRecipe- Parsed Cooklang recipe objectoptions?: SankeyGeneratorOptionsfinalNodeName?: string- Name for the final node (default: "完成品")normalization?: "logarithmic" | "linear" | "none"- Value normalization methodminLinkValue?: number- Minimum link value (default: 0.1)
Returns: SankeyData | null
optimizeSankeyData(data)
Validates and optimizes Sankey data by removing invalid links and orphaned nodes.
Returns: SankeyData
Types
interface SankeyData {
nodes: SankeyNode[];
links: SankeyLink[];
}
interface SankeyNode {
id: string;
name: string;
category: "ingredient" | "process" | "final";
value: number;
label: string;
originalValue?: number;
metadata?: BaseNodeMetadata;
}
interface SankeyLink {
source: string;
target: string;
value: number;
originalValue?: number;
metadata?: BaseLinkMetadata;
}React Integration
For React applications, we recommend creating custom hooks:
import { useMemo } from 'react';
import {
CooklangParser,
generateSankeyData,
optimizeSankeyData,
type CooklangRecipe
} from 'cooklang-sankey';
// Create a singleton parser instance
const parser = new CooklangParser();
export function useSankeyData(recipeText: string) {
return useMemo(() => {
if (!recipeText) return null;
// Parse the recipe text
const [recipe] = parser.parse(recipeText);
// Generate Sankey data from parsed recipe
const data = generateSankeyData(recipe);
return data ? optimizeSankeyData(data) : null;
}, [recipeText]);
}
// Or if you already have a parsed recipe:
export function useSankeyDataFromRecipe(recipe: CooklangRecipe | null) {
return useMemo(() => {
if (!recipe) return null;
const data = generateSankeyData(recipe);
return data ? optimizeSankeyData(data) : null;
}, [recipe]);
}License
MIT
