mirror of
				https://github.com/bcye/structured-wikivoyage-exports.git
				synced 2025-11-04 00:52:43 +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;
 |