This commit introduces a comprehensive set of new scripts and examples to enhance the scripting capabilities of the crawl4ai project. The changes include the addition of several Python scripts for compiling and executing scripts, as well as a variety of example scripts demonstrating different functionalities such as login flows, data extraction, and multi-step workflows. Additionally, detailed documentation has been created to guide users on how to utilize these new features effectively. The following significant modifications were made: - Added core scripting files: , , and . - Created a new documentation file to provide an overview of the new features. - Introduced multiple example scripts in the directory to showcase various use cases. - Updated and to integrate the new functionalities. - Added font assets for improved documentation presentation. These changes significantly expand the functionality of the crawl4ai project, allowing users to create more complex and varied scripts with ease.
217 lines
5.2 KiB
Python
217 lines
5.2 KiB
Python
"""
|
|
C4A-Script API Usage Examples
|
|
Shows how to use the new Result-based API in various scenarios
|
|
"""
|
|
|
|
from c4a_compile import compile, validate, compile_file
|
|
from c4a_result import CompilationResult, ValidationResult
|
|
import json
|
|
|
|
|
|
print("C4A-Script API Usage Examples")
|
|
print("=" * 80)
|
|
|
|
# Example 1: Basic compilation
|
|
print("\n1. Basic Compilation")
|
|
print("-" * 40)
|
|
|
|
script = """
|
|
GO https://example.com
|
|
WAIT 2
|
|
IF (EXISTS `.cookie-banner`) THEN CLICK `.accept`
|
|
REPEAT (SCROLL DOWN 300, 3)
|
|
"""
|
|
|
|
result = compile(script)
|
|
print(f"Success: {result.success}")
|
|
print(f"Statements generated: {len(result.js_code) if result.js_code else 0}")
|
|
|
|
# Example 2: Error handling
|
|
print("\n\n2. Error Handling")
|
|
print("-" * 40)
|
|
|
|
error_script = """
|
|
GO https://example.com
|
|
IF (EXISTS `.modal`) CLICK `.close`
|
|
undefined_procedure
|
|
"""
|
|
|
|
result = compile(error_script)
|
|
if not result.success:
|
|
# Access error details
|
|
error = result.first_error
|
|
print(f"Error on line {error.line}: {error.message}")
|
|
print(f"Error code: {error.code}")
|
|
|
|
# Show suggestions if available
|
|
if error.suggestions:
|
|
print("Suggestions:")
|
|
for suggestion in error.suggestions:
|
|
print(f" - {suggestion.message}")
|
|
|
|
# Example 3: Validation only
|
|
print("\n\n3. Validation (no code generation)")
|
|
print("-" * 40)
|
|
|
|
validation_script = """
|
|
PROC validate_form
|
|
IF (EXISTS `#email`) THEN TYPE "test@example.com"
|
|
PRESS Tab
|
|
ENDPROC
|
|
|
|
validate_form
|
|
"""
|
|
|
|
validation = validate(validation_script)
|
|
print(f"Valid: {validation.valid}")
|
|
if validation.errors:
|
|
print(f"Errors found: {len(validation.errors)}")
|
|
|
|
# Example 4: JSON output for UI
|
|
print("\n\n4. JSON Output for UI Integration")
|
|
print("-" * 40)
|
|
|
|
ui_script = """
|
|
CLICK button.submit
|
|
"""
|
|
|
|
result = compile(ui_script)
|
|
if not result.success:
|
|
# Get JSON for UI
|
|
error_json = result.to_dict()
|
|
print("Error data for UI:")
|
|
print(json.dumps(error_json["errors"][0], indent=2))
|
|
|
|
# Example 5: File compilation
|
|
print("\n\n5. File Compilation")
|
|
print("-" * 40)
|
|
|
|
# Create a test file
|
|
test_file = "test_script.c4a"
|
|
with open(test_file, "w") as f:
|
|
f.write("""
|
|
GO https://example.com
|
|
WAIT `.content` 5
|
|
CLICK `.main-button`
|
|
""")
|
|
|
|
result = compile_file(test_file)
|
|
print(f"File compilation: {'Success' if result.success else 'Failed'}")
|
|
if result.success:
|
|
print(f"Generated {len(result.js_code)} JavaScript statements")
|
|
|
|
# Clean up
|
|
import os
|
|
os.remove(test_file)
|
|
|
|
# Example 6: Batch processing
|
|
print("\n\n6. Batch Processing Multiple Scripts")
|
|
print("-" * 40)
|
|
|
|
scripts = [
|
|
"GO https://example1.com\nCLICK `.button`",
|
|
"GO https://example2.com\nWAIT 2",
|
|
"GO https://example3.com\nINVALID_CMD"
|
|
]
|
|
|
|
results = []
|
|
for i, script in enumerate(scripts, 1):
|
|
result = compile(script)
|
|
results.append(result)
|
|
status = "✓" if result.success else "✗"
|
|
print(f"Script {i}: {status}")
|
|
|
|
# Summary
|
|
successful = sum(1 for r in results if r.success)
|
|
print(f"\nBatch result: {successful}/{len(scripts)} successful")
|
|
|
|
# Example 7: Custom error formatting
|
|
print("\n\n7. Custom Error Formatting")
|
|
print("-" * 40)
|
|
|
|
def format_error_for_ide(error):
|
|
"""Format error for IDE integration"""
|
|
return f"{error.source_line}:{error.line}:{error.column}: {error.type.value}: {error.message} [{error.code}]"
|
|
|
|
error_script = "IF EXISTS `.button` THEN CLICK `.button`"
|
|
result = compile(error_script)
|
|
|
|
if not result.success:
|
|
error = result.first_error
|
|
print("IDE format:", format_error_for_ide(error))
|
|
print("Simple format:", error.simple_message)
|
|
print("Full format:", error.formatted_message)
|
|
|
|
# Example 8: Working with warnings (future feature)
|
|
print("\n\n8. Handling Warnings")
|
|
print("-" * 40)
|
|
|
|
# In the future, we might have warnings
|
|
result = compile("GO https://example.com\nWAIT 100") # Very long wait
|
|
print(f"Success: {result.success}")
|
|
print(f"Warnings: {len(result.warnings)}")
|
|
|
|
# Example 9: Metadata usage
|
|
print("\n\n9. Using Metadata")
|
|
print("-" * 40)
|
|
|
|
complex_script = """
|
|
PROC helper1
|
|
CLICK `.btn1`
|
|
ENDPROC
|
|
|
|
PROC helper2
|
|
CLICK `.btn2`
|
|
ENDPROC
|
|
|
|
GO https://example.com
|
|
helper1
|
|
helper2
|
|
"""
|
|
|
|
result = compile(complex_script)
|
|
if result.success:
|
|
print(f"Script metadata:")
|
|
for key, value in result.metadata.items():
|
|
print(f" {key}: {value}")
|
|
|
|
# Example 10: Integration patterns
|
|
print("\n\n10. Integration Patterns")
|
|
print("-" * 40)
|
|
|
|
# Web API endpoint simulation
|
|
def api_compile(request_body):
|
|
"""Simulate API endpoint"""
|
|
script = request_body.get("script", "")
|
|
result = compile(script)
|
|
|
|
response = {
|
|
"status": "success" if result.success else "error",
|
|
"data": result.to_dict()
|
|
}
|
|
return response
|
|
|
|
# CLI tool simulation
|
|
def cli_compile(script, output_format="text"):
|
|
"""Simulate CLI tool"""
|
|
result = compile(script)
|
|
|
|
if output_format == "json":
|
|
return result.to_json()
|
|
elif output_format == "simple":
|
|
if result.success:
|
|
return f"OK: {len(result.js_code)} statements"
|
|
else:
|
|
return f"ERROR: {result.first_error.simple_message}"
|
|
else:
|
|
return str(result)
|
|
|
|
# Test the patterns
|
|
api_response = api_compile({"script": "GO https://example.com"})
|
|
print(f"API response status: {api_response['status']}")
|
|
|
|
cli_output = cli_compile("WAIT 2", "simple")
|
|
print(f"CLI output: {cli_output}")
|
|
|
|
print("\n" + "=" * 80)
|
|
print("All examples completed successfully!") |