ottosmops / beacon
A PHP library for parsing BEACON files
Requires
- php: >=8.1
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: ^3.7
README
BEACON Parser
A PHP library for parsing BEACON files.
The package was heavily constructed with AI assistence. Please doublecheck if you want to use it in production.
Overview
BEACON is a data interchange format for large numbers of uniform links. A BEACON file contains meta fields and links that can be used to create connections between different datasets.
This library provides a PHP implementation for parsing BEACON files according to the BEACON specification.
Features
- Parse BEACON files from strings or file paths
- Extract meta fields and link data
- Support for all BEACON meta fields (PREFIX, TARGET, MESSAGE, RELATION, etc.)
- Link construction with URI pattern expansion
- Validation of BEACON file format
Installation
Install via Composer:
composer require ottosmops/beacon
Quick Start
Basic Usage
use BeaconParser\BeaconParser; // Parse from file $parser = new BeaconParser(); $beaconData = $parser->parseFile('path/to/beacon.txt'); // Parse from string $beaconContent = file_get_contents('beacon.txt'); $beaconData = $parser->parseString($beaconContent); // Access meta fields $description = $beaconData->getMetaField('DESCRIPTION'); $prefix = $beaconData->getMetaField('PREFIX'); // Access links $links = $beaconData->getLinks(); foreach ($links as $link) { echo $link->getSourceIdentifier() . ' -> ' . $link->getTargetIdentifier() . "\n"; }
Working with Links
// Get constructed links with full URIs $links = $beaconData->getConstructedLinks(); foreach ($links as $link) { echo "Source: " . $link->getSourceIdentifier() . "\n"; echo "Target: " . $link->getTargetIdentifier() . "\n"; echo "Relation: " . $link->getRelationType() . "\n"; if ($link->hasAnnotation()) { echo "Annotation: " . $link->getAnnotation() . "\n"; } echo "---\n"; }
BEACON Format
BEACON files consist of:
- Format indicator (
#FORMAT: BEACON
) - Meta fields (lines starting with
#
) - Empty lines (optional)
- Link lines
Example BEACON File
#FORMAT: BEACON
#PREFIX: http://example.org/
#TARGET: http://example.com/
#DESCRIPTION: Example link dump
#CREATOR: Example Organization
alice|About Alice
bob||http://example.net/bob
charlie|Charlie's Page|http://example.net/charlie
Meta Fields
The library supports all standard BEACON meta fields:
Link Construction Fields
PREFIX
- URI pattern for source identifiersTARGET
- URI pattern for target identifiersMESSAGE
- Default link annotationRELATION
- Relation type for linksANNOTATION
- Meaning of link annotations
Link Dump Description Fields
DESCRIPTION
- Human readable descriptionCREATOR
- Creator name or URICONTACT
- Contact informationHOMEPAGE
- Website with additional informationFEED
- Download URLTIMESTAMP
- Last modification dateUPDATE
- Update frequency
Dataset Fields
SOURCESET
- Source dataset URITARGETSET
- Target dataset URINAME
- Target dataset nameINSTITUTION
- Responsible organization
Link Construction
The library automatically constructs full URIs from link tokens using the meta fields:
- Source identifiers are constructed using the
PREFIX
pattern - Target identifiers are constructed using the
TARGET
pattern - Default values are applied when tokens are missing
- URI patterns support
{ID}
and{+ID}
expansions
Validation
The library includes a validator to check BEACON files.
Using the Validator
use BeaconParser\BeaconParser; $validator = new BeaconValidator(); // Validate from file $result = $validator->validateFile('beacon.txt'); // Validate from string $result = $validator->validateString($beaconContent); // Check if valid if ($result->isValid()) { echo "BEACON file is valid!\n"; } else { echo "BEACON file has errors:\n"; foreach ($result->getErrors() as $error) { echo "- $error\n"; } } // Show detailed report echo $result->getDetailedReport();
CLI Validation Tool
A command-line validation tool is included that supports both local files and URLs:
# Validate a local BEACON file php bin/validate-beacon.php example.beacon # Validate a BEACON file from URL php bin/validate-beacon.php https://example.org/beacon.txt # Validate with full path php bin/validate-beacon.php /path/to/beacon/file.txt # Show help php bin/validate-beacon.php --help
The CLI tool automatically detects whether the input is a URL (starting with http://
or https://
) or a local file path and handles the validation accordingly.
URL Validation Features
- Automatic URL Detection: Recognizes HTTP/HTTPS URLs automatically
- Secure Downloads: Uses proper HTTP headers and timeout handling
- Error Handling: Provides clear error messages for HTTP errors (404, 500, etc.)
- Content Type Support: Accepts text/plain and other text formats
Validation Features
The validator checks for:
- File Structure: Format indicator, proper line endings, UTF-8 encoding
- Meta Fields: Known fields, proper syntax, valid values
- URI Validation: Valid URIs in appropriate fields
- Link Construction: Proper token handling and URI building
- Best Practices: Recommended fields, HTTPS usage, proper formatting
- Specification Compliance: Full adherence to BEACON specification
Exit codes:
0
: File is valid1
: File has validation errors2
: File not found or other error
Usage Examples
CLI Usage Examples
# Validate local files php bin/validate-beacon.php example.beacon php bin/validate-beacon.php /path/to/beacon/file.txt # Validate remote files from URLs php bin/validate-beacon.php https://example.org/beacon.txt php bin/validate-beacon.php http://data.example.com/links.beacon # Show detailed help php bin/validate-beacon.php --help
Programming Examples
Example BEACON File
## Examples
### Sample BEACON File
```beacon
#FORMAT: BEACON
#PREFIX: http://example.org/people/
#TARGET: http://example.com/documents/
#DESCRIPTION: Example BEACON file mapping people to documents
#CREATOR: Example Organization
#RELATION: http://purl.org/dc/elements/1.1/contributor
alice
bob|author
charlie|editor|special-doc
diana||http://example.net/external-doc
Parsing Example
use BeaconParser\BeaconValidator; $parser = new BeaconParser(); $beaconData = $parser->parseFile('example.beacon'); // Get meta information echo "Description: " . $beaconData->getMetaField('DESCRIPTION') . "\n"; echo "Creator: " . $beaconData->getMetaField('CREATOR') . "\n"; // Process links foreach ($beaconData->getConstructedLinks() as $link) { echo $link->getSourceIdentifier() . " -> " . $link->getTargetIdentifier() . "\n"; if ($link->hasAnnotation()) { echo " Annotation: " . $link->getAnnotation() . "\n"; } }
Expected Output
Description: Example BEACON file mapping people to documents
Creator: Example Organization
http://example.org/people/alice -> http://example.com/documents/alice
http://example.org/people/bob -> http://example.com/documents/bob
Annotation: author
http://example.org/people/charlie -> http://example.com/documents/special-doc
Annotation: editor
http://example.org/people/diana -> http://example.net/external-doc
Validation Examples
use BeaconParser\BeaconValidator; $validator = new BeaconValidator(); // Validate a local file $result = $validator->validateFile('beacon.txt'); // Validate content from a URL programmatically $content = file_get_contents('https://example.org/beacon.txt'); $result = $validator->validateString($content); // Check validation results if ($result->isValid()) { echo "✅ BEACON file is valid\n"; } else { echo "❌ BEACON file has errors:\n"; foreach ($result->getErrors() as $error) { echo " - $error\n"; } } // Show detailed report echo $result->getDetailedReport();
Requirements
- PHP 8.0 or higher
Development
Running Tests
composer test
Code Style
composer phpcs
Static Analysis
composer phpstan
License
MIT License. See LICENSE file for details.