mirror of
https://github.com/bcye/structured-wikivoyage-exports.git
synced 2025-04-20 09:46:20 +00:00
254 lines
5.2 KiB
TypeScript
254 lines
5.2 KiB
TypeScript
/**
|
|
* Enum for all possible node types
|
|
*/
|
|
export enum NodeType {
|
|
Root = "root",
|
|
Section = "section",
|
|
Text = "text",
|
|
Template = "template",
|
|
See = "see",
|
|
Do = "do",
|
|
Buy = "buy",
|
|
Eat = "eat",
|
|
Drink = "drink",
|
|
Sleep = "sleep",
|
|
Listing = "listing",
|
|
Marker = "marker",
|
|
}
|
|
|
|
/**
|
|
* Base interface for all node types in the Wikivoyage tree
|
|
*/
|
|
export interface BaseNode {
|
|
/** Type identifier for the node */
|
|
type: NodeType;
|
|
/** Properties specific to this node type */
|
|
properties: Record<string, any>;
|
|
/** Child nodes */
|
|
children: WikiNode[];
|
|
}
|
|
|
|
/**
|
|
* Root node of the document
|
|
*/
|
|
export interface RootNode extends BaseNode {
|
|
type: NodeType.Root;
|
|
properties: {
|
|
/** Page banner information */
|
|
pagebanner?: {
|
|
[key: string]: string;
|
|
};
|
|
/** Map frame information */
|
|
mapframe?: {
|
|
[key: string]: string;
|
|
};
|
|
/** Route box information */
|
|
routebox?: {
|
|
[key: string]: string;
|
|
};
|
|
/** Geographic coordinates */
|
|
geo?: {
|
|
[key: string]: string;
|
|
};
|
|
/** Parent region information */
|
|
isPartOf?: {
|
|
[key: string]: string;
|
|
};
|
|
/** City status information */
|
|
usablecity?: {
|
|
[key: string]: string;
|
|
};
|
|
guidecity?: {
|
|
[key: string]: string;
|
|
};
|
|
outlinecity?: {
|
|
[key: string]: string;
|
|
};
|
|
title: string;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Section node representing a heading and its content
|
|
*/
|
|
export interface SectionNode extends BaseNode {
|
|
type: NodeType.Section;
|
|
properties: {
|
|
/** Section title */
|
|
title: string;
|
|
/** Heading level (1-6) */
|
|
level: number;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Text node containing markdown content
|
|
*/
|
|
export interface TextNode extends BaseNode {
|
|
type: NodeType.Text;
|
|
properties: {
|
|
/** Markdown formatted text */
|
|
markdown: string;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Generic template node for templates not specifically handled
|
|
*/
|
|
export interface TemplateNode extends BaseNode {
|
|
type: NodeType.Template;
|
|
properties: {
|
|
/** Template name */
|
|
name: string;
|
|
/** Template parameters */
|
|
params: {
|
|
[key: string]: string;
|
|
};
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Base interface for listing templates (see, do, buy, eat, drink, sleep)
|
|
*/
|
|
export interface ListingNode extends BaseNode {
|
|
properties: {
|
|
/** Name of the listing */
|
|
name: string;
|
|
/** Alternative name */
|
|
alt?: string;
|
|
/** URL for the listing */
|
|
url?: string;
|
|
/** Email address */
|
|
email?: string;
|
|
/** Physical address */
|
|
address?: string;
|
|
/** Latitude coordinate */
|
|
lat?: string;
|
|
/** Longitude coordinate */
|
|
long?: string;
|
|
/** Directions to reach the location */
|
|
directions?: string;
|
|
/** Phone number */
|
|
phone?: string;
|
|
/** Toll-free phone number */
|
|
tollfree?: string;
|
|
/** Fax number */
|
|
fax?: string;
|
|
/** Opening hours */
|
|
hours?: string;
|
|
/** Price information */
|
|
price?: string;
|
|
/** Last edit timestamp */
|
|
lastedit?: string;
|
|
/** Wikipedia article name */
|
|
wikipedia?: string;
|
|
/** Wikidata ID */
|
|
wikidata?: string;
|
|
/** Image filename */
|
|
image?: string;
|
|
/** Description content */
|
|
content?: string;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* See listing (attractions, landmarks)
|
|
*/
|
|
export interface SeeNode extends ListingNode {
|
|
type: NodeType.See;
|
|
}
|
|
|
|
/**
|
|
* Do listing (activities)
|
|
*/
|
|
export interface DoNode extends ListingNode {
|
|
type: NodeType.Do;
|
|
}
|
|
|
|
/**
|
|
* Buy listing (shopping)
|
|
*/
|
|
export interface BuyNode extends ListingNode {
|
|
type: NodeType.Buy;
|
|
}
|
|
|
|
/**
|
|
* Eat listing (restaurants)
|
|
*/
|
|
export interface EatNode extends ListingNode {
|
|
type: NodeType.Eat;
|
|
}
|
|
|
|
/**
|
|
* Drink listing (bars, cafes)
|
|
*/
|
|
export interface DrinkNode extends ListingNode {
|
|
type: NodeType.Drink;
|
|
}
|
|
|
|
/**
|
|
* Sleep listing (accommodations)
|
|
*/
|
|
export interface SleepNode extends ListingNode {
|
|
type: NodeType.Sleep;
|
|
properties: ListingNode["properties"] & {
|
|
/** Check-in time */
|
|
checkin?: string;
|
|
/** Check-out time */
|
|
checkout?: string;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Generic listing node
|
|
*/
|
|
export interface GenericListingNode extends ListingNode {
|
|
type: NodeType.Listing;
|
|
}
|
|
|
|
/**
|
|
* Marker node for map locations
|
|
*/
|
|
export interface MarkerNode extends BaseNode {
|
|
type: NodeType.Marker;
|
|
properties: {
|
|
/** Type of marker */
|
|
type: string;
|
|
/** Name of the location */
|
|
name: string;
|
|
/** Latitude coordinate */
|
|
lat: string;
|
|
/** Longitude coordinate */
|
|
long: string;
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Union type of all possible node types
|
|
*/
|
|
export type WikiNode<T extends NodeType = NodeType> = T extends NodeType.Root
|
|
? RootNode
|
|
: T extends NodeType.Section
|
|
? SectionNode
|
|
: T extends NodeType.Text
|
|
? TextNode
|
|
: T extends NodeType.Template
|
|
? TemplateNode
|
|
: T extends NodeType.See
|
|
? SeeNode
|
|
: T extends NodeType.Do
|
|
? DoNode
|
|
: T extends NodeType.Buy
|
|
? BuyNode
|
|
: T extends NodeType.Eat
|
|
? EatNode
|
|
: T extends NodeType.Drink
|
|
? DrinkNode
|
|
: T extends NodeType.Sleep
|
|
? SleepNode
|
|
: T extends NodeType.Listing
|
|
? GenericListingNode
|
|
: T extends NodeType.Marker
|
|
? MarkerNode
|
|
: never;
|