mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
@@ -2032,6 +2032,12 @@ YAML:
|
||||
- .rviz
|
||||
- .yaml
|
||||
|
||||
Zephir:
|
||||
type: programming
|
||||
lexer: PHP
|
||||
color: "#118f9e"
|
||||
primary_extension: .zep
|
||||
|
||||
eC:
|
||||
type: programming
|
||||
search_term: ec
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
"Agda": [
|
||||
".agda"
|
||||
],
|
||||
"Alloy": [
|
||||
".als"
|
||||
],
|
||||
"Apex": [
|
||||
".cls"
|
||||
],
|
||||
@@ -449,6 +452,9 @@
|
||||
".sh",
|
||||
".zsh"
|
||||
],
|
||||
"ShellSession": [
|
||||
".sh-session"
|
||||
],
|
||||
"Shen": [
|
||||
".shen"
|
||||
],
|
||||
@@ -537,6 +543,9 @@
|
||||
],
|
||||
"YAML": [
|
||||
".yml"
|
||||
],
|
||||
"Zephir": [
|
||||
".zep"
|
||||
]
|
||||
},
|
||||
"interpreters": {
|
||||
@@ -600,8 +609,8 @@
|
||||
".gemrc"
|
||||
]
|
||||
},
|
||||
"tokens_total": 525524,
|
||||
"languages_total": 635,
|
||||
"tokens_total": 527926,
|
||||
"languages_total": 643,
|
||||
"tokens": {
|
||||
"ABAP": {
|
||||
"*/**": 1,
|
||||
@@ -920,6 +929,241 @@
|
||||
"zero": 1,
|
||||
"Nat": 1
|
||||
},
|
||||
"Alloy": {
|
||||
"module": 3,
|
||||
"examples/systems/file_system": 1,
|
||||
"abstract": 2,
|
||||
"sig": 20,
|
||||
"Object": 10,
|
||||
"{": 54,
|
||||
"}": 60,
|
||||
"Name": 2,
|
||||
"File": 1,
|
||||
"extends": 10,
|
||||
"some": 3,
|
||||
"d": 3,
|
||||
"Dir": 8,
|
||||
"|": 19,
|
||||
"this": 14,
|
||||
"in": 19,
|
||||
"d.entries.contents": 1,
|
||||
"entries": 3,
|
||||
"set": 10,
|
||||
"DirEntry": 2,
|
||||
"parent": 3,
|
||||
"lone": 6,
|
||||
"this.": 4,
|
||||
"@contents.": 1,
|
||||
"@entries": 1,
|
||||
"all": 16,
|
||||
"e1": 2,
|
||||
"e2": 2,
|
||||
"e1.name": 1,
|
||||
"e2.name": 1,
|
||||
"@parent": 2,
|
||||
"Root": 5,
|
||||
"one": 8,
|
||||
"no": 8,
|
||||
"Cur": 1,
|
||||
"name": 1,
|
||||
"contents": 2,
|
||||
"pred": 16,
|
||||
"OneParent_buggyVersion": 2,
|
||||
"-": 41,
|
||||
"d.parent": 2,
|
||||
"OneParent_correctVersion": 2,
|
||||
"(": 12,
|
||||
"&&": 2,
|
||||
"contents.d": 1,
|
||||
")": 9,
|
||||
"NoDirAliases": 3,
|
||||
"o": 1,
|
||||
"o.": 1,
|
||||
"check": 6,
|
||||
"for": 7,
|
||||
"expect": 6,
|
||||
"examples/systems/marksweepgc": 1,
|
||||
"Node": 10,
|
||||
"HeapState": 5,
|
||||
"left": 3,
|
||||
"right": 1,
|
||||
"marked": 1,
|
||||
"freeList": 1,
|
||||
"clearMarks": 1,
|
||||
"[": 82,
|
||||
"hs": 16,
|
||||
".marked": 3,
|
||||
".right": 4,
|
||||
"hs.right": 3,
|
||||
"fun": 1,
|
||||
"reachable": 1,
|
||||
"n": 5,
|
||||
"]": 80,
|
||||
"+": 14,
|
||||
"n.": 1,
|
||||
"hs.left": 2,
|
||||
"mark": 1,
|
||||
"from": 2,
|
||||
"hs.reachable": 1,
|
||||
"setFreeList": 1,
|
||||
".freeList.*": 3,
|
||||
".left": 5,
|
||||
"hs.marked": 1,
|
||||
"GC": 1,
|
||||
"root": 5,
|
||||
"assert": 3,
|
||||
"Soundness1": 2,
|
||||
"h": 9,
|
||||
"live": 3,
|
||||
"h.reachable": 1,
|
||||
"h.right": 1,
|
||||
"Soundness2": 2,
|
||||
".reachable": 2,
|
||||
"h.GC": 1,
|
||||
".freeList": 1,
|
||||
"Completeness": 1,
|
||||
"examples/systems/views": 1,
|
||||
"open": 2,
|
||||
"util/ordering": 1,
|
||||
"State": 16,
|
||||
"as": 2,
|
||||
"so": 1,
|
||||
"util/relation": 1,
|
||||
"rel": 1,
|
||||
"Ref": 19,
|
||||
"t": 16,
|
||||
"b": 13,
|
||||
"v": 25,
|
||||
"views": 2,
|
||||
"when": 1,
|
||||
"is": 1,
|
||||
"view": 2,
|
||||
"of": 3,
|
||||
"type": 1,
|
||||
"backing": 1,
|
||||
"dirty": 3,
|
||||
"contains": 1,
|
||||
"refs": 7,
|
||||
"that": 1,
|
||||
"have": 1,
|
||||
"been": 1,
|
||||
"invalidated": 1,
|
||||
"obj": 1,
|
||||
"ViewType": 8,
|
||||
"anyviews": 2,
|
||||
"visualization": 1,
|
||||
"ViewType.views": 1,
|
||||
"Map": 2,
|
||||
"keys": 3,
|
||||
"map": 2,
|
||||
"s": 6,
|
||||
"Ref.map": 1,
|
||||
"s.refs": 3,
|
||||
"MapRef": 4,
|
||||
"fact": 4,
|
||||
"State.obj": 3,
|
||||
"Iterator": 2,
|
||||
"done": 3,
|
||||
"lastRef": 2,
|
||||
"IteratorRef": 5,
|
||||
"Set": 2,
|
||||
"elts": 2,
|
||||
"SetRef": 5,
|
||||
"KeySetView": 6,
|
||||
"State.views": 1,
|
||||
"IteratorView": 3,
|
||||
"s.views": 2,
|
||||
"handle": 1,
|
||||
"possibility": 1,
|
||||
"modifying": 1,
|
||||
"an": 1,
|
||||
"object": 1,
|
||||
"and": 1,
|
||||
"its": 1,
|
||||
"at": 1,
|
||||
"once": 1,
|
||||
"*": 1,
|
||||
"should": 1,
|
||||
"we": 1,
|
||||
"limit": 1,
|
||||
"frame": 1,
|
||||
"conds": 1,
|
||||
"to": 1,
|
||||
"non": 1,
|
||||
"*/": 1,
|
||||
"modifies": 5,
|
||||
"pre": 15,
|
||||
"post": 14,
|
||||
"rs": 4,
|
||||
"let": 5,
|
||||
"vr": 1,
|
||||
"pre.views": 8,
|
||||
"mods": 3,
|
||||
"rs.*vr": 1,
|
||||
"r": 3,
|
||||
"pre.refs": 6,
|
||||
"pre.obj": 10,
|
||||
"post.obj": 7,
|
||||
"viewFrame": 4,
|
||||
"post.dirty": 1,
|
||||
"pre.dirty": 1,
|
||||
"allocates": 5,
|
||||
"&": 3,
|
||||
"post.refs": 1,
|
||||
".map": 3,
|
||||
".elts": 3,
|
||||
"dom": 1,
|
||||
"<:>": 1,
|
||||
"setRefs": 1,
|
||||
"MapRef.put": 1,
|
||||
"k": 5,
|
||||
"none": 4,
|
||||
"post.views": 4,
|
||||
"SetRef.iterator": 1,
|
||||
"iterRef": 4,
|
||||
"i": 7,
|
||||
"i.left": 3,
|
||||
"i.done": 1,
|
||||
"i.lastRef": 1,
|
||||
"IteratorRef.remove": 1,
|
||||
".lastRef": 2,
|
||||
"IteratorRef.next": 1,
|
||||
"ref": 3,
|
||||
"IteratorRef.hasNext": 1,
|
||||
"s.obj": 1,
|
||||
"zippishOK": 2,
|
||||
"ks": 6,
|
||||
"vs": 6,
|
||||
"m": 4,
|
||||
"ki": 2,
|
||||
"vi": 2,
|
||||
"s0": 4,
|
||||
"so/first": 1,
|
||||
"s1": 4,
|
||||
"so/next": 7,
|
||||
"s2": 6,
|
||||
"s3": 4,
|
||||
"s4": 4,
|
||||
"s5": 4,
|
||||
"s6": 4,
|
||||
"s7": 2,
|
||||
"precondition": 2,
|
||||
"s0.dirty": 1,
|
||||
"ks.iterator": 1,
|
||||
"vs.iterator": 1,
|
||||
"ki.hasNext": 1,
|
||||
"vi.hasNext": 1,
|
||||
"ki.this/next": 1,
|
||||
"vi.this/next": 1,
|
||||
"m.put": 1,
|
||||
"ki.remove": 1,
|
||||
"vi.remove": 1,
|
||||
"State.dirty": 1,
|
||||
"ViewType.pre.views": 2,
|
||||
"but": 1,
|
||||
"#s.obj": 1,
|
||||
"<": 1
|
||||
},
|
||||
"ApacheConf": {
|
||||
"ServerSignature": 1,
|
||||
"Off": 1,
|
||||
@@ -48819,6 +49063,151 @@
|
||||
"foodforthought.jpg": 1,
|
||||
"name##*fo": 1
|
||||
},
|
||||
"ShellSession": {
|
||||
"echo": 2,
|
||||
"FOOBAR": 2,
|
||||
"Hello": 2,
|
||||
"World": 2,
|
||||
"gem": 4,
|
||||
"install": 4,
|
||||
"nokogiri": 6,
|
||||
"...": 4,
|
||||
"Building": 2,
|
||||
"native": 2,
|
||||
"extensions.": 2,
|
||||
"This": 4,
|
||||
"could": 2,
|
||||
"take": 2,
|
||||
"a": 4,
|
||||
"while...": 2,
|
||||
"checking": 1,
|
||||
"for": 4,
|
||||
"libxml/parser.h...": 1,
|
||||
"***": 2,
|
||||
"extconf.rb": 1,
|
||||
"failed": 1,
|
||||
"Could": 2,
|
||||
"not": 2,
|
||||
"create": 1,
|
||||
"Makefile": 1,
|
||||
"due": 1,
|
||||
"to": 3,
|
||||
"some": 1,
|
||||
"reason": 2,
|
||||
"probably": 1,
|
||||
"lack": 1,
|
||||
"of": 2,
|
||||
"necessary": 1,
|
||||
"libraries": 1,
|
||||
"and/or": 1,
|
||||
"headers.": 1,
|
||||
"Check": 1,
|
||||
"the": 2,
|
||||
"mkmf.log": 1,
|
||||
"file": 1,
|
||||
"more": 1,
|
||||
"details.": 1,
|
||||
"You": 1,
|
||||
"may": 1,
|
||||
"need": 1,
|
||||
"configuration": 1,
|
||||
"options.": 1,
|
||||
"brew": 2,
|
||||
"tap": 2,
|
||||
"homebrew/dupes": 1,
|
||||
"Cloning": 1,
|
||||
"into": 1,
|
||||
"remote": 3,
|
||||
"Counting": 1,
|
||||
"objects": 3,
|
||||
"done.": 4,
|
||||
"Compressing": 1,
|
||||
"%": 5,
|
||||
"(": 6,
|
||||
"/591": 1,
|
||||
")": 6,
|
||||
"Total": 1,
|
||||
"delta": 2,
|
||||
"reused": 1,
|
||||
"Receiving": 1,
|
||||
"/1034": 1,
|
||||
"KiB": 1,
|
||||
"|": 1,
|
||||
"bytes/s": 1,
|
||||
"Resolving": 1,
|
||||
"deltas": 1,
|
||||
"/560": 1,
|
||||
"Checking": 1,
|
||||
"connectivity...": 1,
|
||||
"done": 1,
|
||||
"Warning": 1,
|
||||
"homebrew/dupes/lsof": 1,
|
||||
"over": 1,
|
||||
"mxcl/master/lsof": 1,
|
||||
"Tapped": 1,
|
||||
"formula": 4,
|
||||
"apple": 1,
|
||||
"-": 12,
|
||||
"gcc42": 1,
|
||||
"Downloading": 1,
|
||||
"http": 2,
|
||||
"//r.research.att.com/tools/gcc": 1,
|
||||
"darwin11.pkg": 1,
|
||||
"########################################################################": 1,
|
||||
"Caveats": 1,
|
||||
"NOTE": 1,
|
||||
"provides": 1,
|
||||
"components": 1,
|
||||
"that": 1,
|
||||
"were": 1,
|
||||
"removed": 1,
|
||||
"from": 3,
|
||||
"XCode": 2,
|
||||
"in": 2,
|
||||
"release.": 1,
|
||||
"There": 1,
|
||||
"is": 2,
|
||||
"no": 1,
|
||||
"this": 1,
|
||||
"if": 1,
|
||||
"you": 1,
|
||||
"are": 1,
|
||||
"using": 1,
|
||||
"version": 1,
|
||||
"prior": 1,
|
||||
"contains": 1,
|
||||
"compilers": 2,
|
||||
"built": 2,
|
||||
"Apple": 1,
|
||||
"s": 1,
|
||||
"GCC": 1,
|
||||
"sources": 1,
|
||||
"build": 1,
|
||||
"available": 1,
|
||||
"//opensource.apple.com/tarballs/gcc": 1,
|
||||
"All": 1,
|
||||
"have": 1,
|
||||
"suffix.": 1,
|
||||
"A": 1,
|
||||
"GFortran": 1,
|
||||
"compiler": 1,
|
||||
"also": 1,
|
||||
"included.": 1,
|
||||
"Summary": 1,
|
||||
"/usr/local/Cellar/apple": 1,
|
||||
"gcc42/4.2.1": 1,
|
||||
"files": 1,
|
||||
"M": 1,
|
||||
"seconds": 1,
|
||||
"v": 1,
|
||||
"Fetching": 1,
|
||||
"Successfully": 1,
|
||||
"installed": 2,
|
||||
"Installing": 2,
|
||||
"ri": 1,
|
||||
"documentation": 2,
|
||||
"RDoc": 1
|
||||
},
|
||||
"Shen": {
|
||||
"*": 47,
|
||||
"graph.shen": 1,
|
||||
@@ -54312,11 +54701,163 @@
|
||||
"GMT": 1,
|
||||
"recorded_with": 1,
|
||||
"VCR": 1
|
||||
},
|
||||
"Zephir": {
|
||||
"%": 10,
|
||||
"{": 56,
|
||||
"#define": 1,
|
||||
"MAX_FACTOR": 3,
|
||||
"}": 50,
|
||||
"namespace": 3,
|
||||
"Test": 2,
|
||||
";": 86,
|
||||
"#include": 1,
|
||||
"static": 1,
|
||||
"long": 3,
|
||||
"fibonacci": 4,
|
||||
"(": 55,
|
||||
"n": 5,
|
||||
")": 53,
|
||||
"if": 39,
|
||||
"<": 1,
|
||||
"return": 25,
|
||||
"else": 11,
|
||||
"-": 25,
|
||||
"+": 5,
|
||||
"class": 2,
|
||||
"Cblock": 1,
|
||||
"public": 22,
|
||||
"function": 22,
|
||||
"testCblock1": 1,
|
||||
"int": 3,
|
||||
"a": 6,
|
||||
"testCblock2": 1,
|
||||
"Router": 1,
|
||||
"Route": 1,
|
||||
"protected": 9,
|
||||
"_pattern": 3,
|
||||
"_compiledPattern": 3,
|
||||
"_paths": 3,
|
||||
"_methods": 5,
|
||||
"_hostname": 3,
|
||||
"_converters": 3,
|
||||
"_id": 2,
|
||||
"_name": 3,
|
||||
"_beforeMatch": 3,
|
||||
"__construct": 1,
|
||||
"pattern": 37,
|
||||
"paths": 7,
|
||||
"null": 11,
|
||||
"httpMethods": 6,
|
||||
"this": 28,
|
||||
"reConfigure": 2,
|
||||
"let": 51,
|
||||
"compilePattern": 2,
|
||||
"var": 4,
|
||||
"idPattern": 6,
|
||||
"memstr": 10,
|
||||
"str_replace": 6,
|
||||
".": 5,
|
||||
"via": 1,
|
||||
"extractNamedParams": 2,
|
||||
"string": 6,
|
||||
"char": 1,
|
||||
"ch": 27,
|
||||
"tmp": 4,
|
||||
"matches": 5,
|
||||
"boolean": 1,
|
||||
"notValid": 5,
|
||||
"false": 3,
|
||||
"cursor": 4,
|
||||
"cursorVar": 5,
|
||||
"marker": 4,
|
||||
"bracketCount": 7,
|
||||
"parenthesesCount": 5,
|
||||
"foundPattern": 6,
|
||||
"intermediate": 4,
|
||||
"numberMatches": 4,
|
||||
"route": 12,
|
||||
"item": 7,
|
||||
"variable": 5,
|
||||
"regexp": 7,
|
||||
"strlen": 1,
|
||||
"<=>": 5,
|
||||
"0": 9,
|
||||
"for": 4,
|
||||
"in": 4,
|
||||
"1": 3,
|
||||
"substr": 3,
|
||||
"break": 9,
|
||||
"&&": 6,
|
||||
"z": 2,
|
||||
"Z": 2,
|
||||
"true": 2,
|
||||
"<='9')>": 1,
|
||||
"_": 1,
|
||||
"2": 2,
|
||||
"continue": 1,
|
||||
"[": 14,
|
||||
"]": 14,
|
||||
"moduleName": 5,
|
||||
"controllerName": 7,
|
||||
"actionName": 4,
|
||||
"parts": 9,
|
||||
"routePaths": 5,
|
||||
"realClassName": 1,
|
||||
"namespaceName": 1,
|
||||
"pcrePattern": 4,
|
||||
"compiledPattern": 4,
|
||||
"extracted": 4,
|
||||
"typeof": 2,
|
||||
"throw": 1,
|
||||
"new": 1,
|
||||
"Exception": 1,
|
||||
"explode": 1,
|
||||
"switch": 1,
|
||||
"count": 1,
|
||||
"case": 3,
|
||||
"controller": 1,
|
||||
"action": 1,
|
||||
"array": 1,
|
||||
"The": 1,
|
||||
"contains": 1,
|
||||
"invalid": 1,
|
||||
"#": 1,
|
||||
"array_merge": 1,
|
||||
"//Update": 1,
|
||||
"the": 1,
|
||||
"s": 1,
|
||||
"name": 5,
|
||||
"*": 2,
|
||||
"@return": 1,
|
||||
"*/": 1,
|
||||
"getName": 1,
|
||||
"setName": 1,
|
||||
"beforeMatch": 1,
|
||||
"callback": 2,
|
||||
"getBeforeMatch": 1,
|
||||
"getRouteId": 1,
|
||||
"getPattern": 1,
|
||||
"getCompiledPattern": 1,
|
||||
"getPaths": 1,
|
||||
"getReversedPaths": 1,
|
||||
"reversed": 4,
|
||||
"path": 3,
|
||||
"position": 3,
|
||||
"setHttpMethods": 1,
|
||||
"getHttpMethods": 1,
|
||||
"setHostname": 1,
|
||||
"hostname": 2,
|
||||
"getHostname": 1,
|
||||
"convert": 1,
|
||||
"converter": 2,
|
||||
"getConverters": 1
|
||||
}
|
||||
},
|
||||
"language_tokens": {
|
||||
"ABAP": 1500,
|
||||
"Agda": 376,
|
||||
"Alloy": 1143,
|
||||
"ApacheConf": 1449,
|
||||
"Apex": 4408,
|
||||
"AppleScript": 1862,
|
||||
@@ -54444,6 +54985,7 @@
|
||||
"Scilab": 69,
|
||||
"SCSS": 39,
|
||||
"Shell": 3744,
|
||||
"ShellSession": 233,
|
||||
"Shen": 3472,
|
||||
"Slash": 187,
|
||||
"SourcePawn": 2080,
|
||||
@@ -54471,11 +55013,13 @@
|
||||
"XQuery": 801,
|
||||
"XSLT": 44,
|
||||
"Xtend": 399,
|
||||
"YAML": 77
|
||||
"YAML": 77,
|
||||
"Zephir": 1026
|
||||
},
|
||||
"languages": {
|
||||
"ABAP": 1,
|
||||
"Agda": 1,
|
||||
"Alloy": 3,
|
||||
"ApacheConf": 3,
|
||||
"Apex": 6,
|
||||
"AppleScript": 7,
|
||||
@@ -54603,6 +55147,7 @@
|
||||
"Scilab": 3,
|
||||
"SCSS": 1,
|
||||
"Shell": 37,
|
||||
"ShellSession": 3,
|
||||
"Shen": 3,
|
||||
"Slash": 1,
|
||||
"SourcePawn": 1,
|
||||
@@ -54630,7 +55175,8 @@
|
||||
"XQuery": 1,
|
||||
"XSLT": 1,
|
||||
"Xtend": 2,
|
||||
"YAML": 2
|
||||
"YAML": 2,
|
||||
"Zephir": 2
|
||||
},
|
||||
"md5": "bea2304b61e5920c044b83aec7788dd8"
|
||||
"md5": "37a50c87400d09dbc9cc99f1276d7e33"
|
||||
}
|
||||
53
samples/Zephir/Cblock.zep
Normal file
53
samples/Zephir/Cblock.zep
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* CBLOCK tests
|
||||
* asfas
|
||||
*/
|
||||
|
||||
%{
|
||||
// top statement before namespace, add to after headers
|
||||
#define MAX_FACTOR 40
|
||||
}%
|
||||
|
||||
namespace Test;
|
||||
|
||||
%{
|
||||
// top statement before class, add to after headers
|
||||
// test include .h
|
||||
#include "kernel/require.h"
|
||||
}%
|
||||
|
||||
%{
|
||||
|
||||
// c implement fibonacci
|
||||
static long fibonacci(long n) {
|
||||
if (n < 2) return n;
|
||||
else return fibonacci(n - 2) + fibonacci(n - 1);
|
||||
}
|
||||
|
||||
}%
|
||||
|
||||
class Cblock
|
||||
{
|
||||
public function testCblock1()
|
||||
{
|
||||
int a = 0;
|
||||
|
||||
%{
|
||||
a = MAX_FACTOR;
|
||||
}%
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
public function testCblock2()
|
||||
{
|
||||
long a = 0;
|
||||
|
||||
%{
|
||||
a = fibonacci(MAX_FACTOR);
|
||||
}%
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
}
|
||||
557
samples/Zephir/Router.zep
Normal file
557
samples/Zephir/Router.zep
Normal file
@@ -0,0 +1,557 @@
|
||||
|
||||
namespace Test\Router;
|
||||
|
||||
/**
|
||||
* Test\Router\Route
|
||||
*
|
||||
* This class represents every route added to the router
|
||||
*/
|
||||
class Route
|
||||
{
|
||||
protected _pattern;
|
||||
|
||||
protected _compiledPattern;
|
||||
|
||||
protected _paths;
|
||||
|
||||
protected _methods;
|
||||
|
||||
protected _hostname;
|
||||
|
||||
protected _converters;
|
||||
|
||||
protected _id;
|
||||
|
||||
protected _name;
|
||||
|
||||
protected _beforeMatch;
|
||||
|
||||
/**
|
||||
* Test\Router\Route constructor
|
||||
*
|
||||
* @param string pattern
|
||||
* @param array paths
|
||||
* @param array|string httpMethods
|
||||
*/
|
||||
public function __construct(pattern, paths=null, httpMethods=null)
|
||||
{
|
||||
// Configure the route (extract parameters, paths, etc)
|
||||
this->reConfigure(pattern, paths);
|
||||
|
||||
// Update the HTTP method constraints
|
||||
let this->_methods = httpMethods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces placeholders from pattern returning a valid PCRE regular expression
|
||||
*
|
||||
* @param string pattern
|
||||
* @return string
|
||||
*/
|
||||
public function compilePattern(pattern)
|
||||
{
|
||||
var idPattern;
|
||||
|
||||
// If a pattern contains ':', maybe there are placeholders to replace
|
||||
if memstr(pattern, ":") {
|
||||
|
||||
// This is a pattern for valid identifiers
|
||||
let idPattern = "/([a-zA-Z0-9\\_\\-]+)";
|
||||
|
||||
// Replace the module part
|
||||
if memstr(pattern, "/:module") {
|
||||
let pattern = str_replace("/:module", idPattern, pattern);
|
||||
}
|
||||
|
||||
// Replace the controller placeholder
|
||||
if memstr(pattern, "/:controller") {
|
||||
let pattern = str_replace("/:controller", idPattern, pattern);
|
||||
}
|
||||
|
||||
// Replace the namespace placeholder
|
||||
if memstr(pattern, "/:namespace") {
|
||||
let pattern = str_replace("/:namespace", idPattern, pattern);
|
||||
}
|
||||
|
||||
// Replace the action placeholder
|
||||
if memstr(pattern, "/:action") {
|
||||
let pattern = str_replace("/:action", idPattern, pattern);
|
||||
}
|
||||
|
||||
// Replace the params placeholder
|
||||
if memstr(pattern, "/:params") {
|
||||
let pattern = str_replace("/:params", "(/.*)*", pattern);
|
||||
}
|
||||
|
||||
// Replace the int placeholder
|
||||
if memstr(pattern, "/:int") {
|
||||
let pattern = str_replace("/:int", "/([0-9]+)", pattern);
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the pattern has parantheses in order to add the regex delimiters
|
||||
if memstr(pattern, "(") {
|
||||
return "#^" . pattern . "$#";
|
||||
}
|
||||
|
||||
// Square brackets are also checked
|
||||
if memstr(pattern, "[") {
|
||||
return "#^" . pattern . "$#";
|
||||
}
|
||||
|
||||
return pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set one or more HTTP methods that constraint the matching of the route
|
||||
*
|
||||
*<code>
|
||||
* $route->via('GET');
|
||||
* $route->via(array('GET', 'POST'));
|
||||
*</code>
|
||||
*
|
||||
* @param string|array httpMethods
|
||||
* @return Test\Router\Route
|
||||
*/
|
||||
public function via(httpMethods)
|
||||
{
|
||||
let this->_methods = httpMethods;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts parameters from a string
|
||||
*
|
||||
* @param string pattern
|
||||
*/
|
||||
public function extractNamedParams(string pattern)
|
||||
{
|
||||
|
||||
char ch;
|
||||
var tmp, matches;
|
||||
boolean notValid = false;
|
||||
int cursor, cursorVar, marker, bracketCount = 0, parenthesesCount = 0, foundPattern = 0;
|
||||
int intermediate = 0, numberMatches = 0;
|
||||
string route, item, variable, regexp;
|
||||
|
||||
if strlen(pattern) <= 0 {
|
||||
return false;
|
||||
}
|
||||
|
||||
let matches = [],
|
||||
route = "";
|
||||
|
||||
for cursor, ch in pattern {
|
||||
|
||||
if parenthesesCount == 0 {
|
||||
if ch == '{' {
|
||||
if bracketCount == 0 {
|
||||
let marker = cursor + 1,
|
||||
intermediate = 0,
|
||||
notValid = false;
|
||||
}
|
||||
let bracketCount++;
|
||||
} else {
|
||||
if ch == '}' {
|
||||
let bracketCount--;
|
||||
if intermediate > 0 {
|
||||
if bracketCount == 0 {
|
||||
|
||||
let numberMatches++,
|
||||
variable = null,
|
||||
regexp = null,
|
||||
item = (string) substr(pattern, marker, cursor - marker);
|
||||
|
||||
for cursorVar, ch in item {
|
||||
|
||||
if ch == '\0' {
|
||||
break;
|
||||
}
|
||||
|
||||
if cursorVar == 0 && !((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
|
||||
let notValid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <='9') || ch == '-' || ch == '_' || ch == ':' {
|
||||
if ch == ':' {
|
||||
let variable = (string) substr(item, 0, cursorVar),
|
||||
regexp = (string) substr(item, cursorVar + 1);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
let notValid = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if !notValid {
|
||||
|
||||
let tmp = numberMatches;
|
||||
|
||||
if variable && regexp {
|
||||
|
||||
let foundPattern = 0;
|
||||
for ch in regexp {
|
||||
if ch == '\0' {
|
||||
break;
|
||||
}
|
||||
if !foundPattern {
|
||||
if ch == '(' {
|
||||
let foundPattern = 1;
|
||||
}
|
||||
} else {
|
||||
if ch == ')' {
|
||||
let foundPattern = 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if foundPattern != 2 {
|
||||
let route .= '(',
|
||||
route .= regexp,
|
||||
route .= ')';
|
||||
} else {
|
||||
let route .= regexp;
|
||||
}
|
||||
let matches[variable] = tmp;
|
||||
} else {
|
||||
let route .= "([^/]*)",
|
||||
matches[item] = tmp;
|
||||
}
|
||||
} else {
|
||||
let route .= "{" . item ."}";
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if bracketCount == 0 {
|
||||
if ch == '(' {
|
||||
let parenthesesCount++;
|
||||
} else {
|
||||
if ch == ')' {
|
||||
let parenthesesCount--;
|
||||
if parenthesesCount == 0 {
|
||||
let numberMatches++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if bracketCount > 0 {
|
||||
let intermediate++;
|
||||
} else {
|
||||
let route .= ch;
|
||||
}
|
||||
}
|
||||
|
||||
return [route, matches];
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconfigure the route adding a new pattern and a set of paths
|
||||
*
|
||||
* @param string pattern
|
||||
* @param array paths
|
||||
*/
|
||||
public function reConfigure(pattern, paths=null)
|
||||
{
|
||||
var moduleName, controllerName, actionName,
|
||||
parts, routePaths, realClassName, namespaceName,
|
||||
pcrePattern, compiledPattern, extracted;
|
||||
|
||||
if typeof pattern != "string" {
|
||||
throw new Exception("The pattern must be string");
|
||||
}
|
||||
|
||||
if paths !== null {
|
||||
if typeof paths == "string" {
|
||||
|
||||
let moduleName = null,
|
||||
controllerName = null,
|
||||
actionName = null;
|
||||
|
||||
// Explode the short paths using the :: separator
|
||||
let parts = explode("::", paths);
|
||||
|
||||
// Create the array paths dynamically
|
||||
switch count(parts) {
|
||||
case 3:
|
||||
let moduleName = parts[0],
|
||||
controllerName = parts[1],
|
||||
actionName = parts[2];
|
||||
break;
|
||||
case 2:
|
||||
let controllerName = parts[0],
|
||||
actionName = parts[1];
|
||||
break;
|
||||
case 1:
|
||||
let controllerName = parts[0];
|
||||
break;
|
||||
}
|
||||
|
||||
let routePaths = [];
|
||||
|
||||
// Process module name
|
||||
if moduleName !== null {
|
||||
let routePaths["module"] = moduleName;
|
||||
}
|
||||
|
||||
// Process controller name
|
||||
if controllerName !== null {
|
||||
|
||||
// Check if we need to obtain the namespace
|
||||
if memstr(controllerName, "\\") {
|
||||
|
||||
// Extract the real class name from the namespaced class
|
||||
let realClassName = get_class_ns(controllerName);
|
||||
|
||||
// Extract the namespace from the namespaced class
|
||||
let namespaceName = get_ns_class(controllerName);
|
||||
|
||||
// Update the namespace
|
||||
if namespaceName {
|
||||
let routePaths["namespace"] = namespaceName;
|
||||
}
|
||||
} else {
|
||||
let realClassName = controllerName;
|
||||
}
|
||||
|
||||
// Always pass the controller to lowercase
|
||||
let routePaths["controller"] = uncamelize(realClassName);
|
||||
}
|
||||
|
||||
// Process action name
|
||||
if actionName !== null {
|
||||
let routePaths["action"] = actionName;
|
||||
}
|
||||
} else {
|
||||
let routePaths = paths;
|
||||
}
|
||||
} else {
|
||||
let routePaths = [];
|
||||
}
|
||||
|
||||
if typeof routePaths !== "array" {
|
||||
throw new Exception("The route contains invalid paths");
|
||||
}
|
||||
|
||||
// If the route starts with '#' we assume that it is a regular expression
|
||||
if !starts_with(pattern, "#") {
|
||||
|
||||
if memstr(pattern, "{") {
|
||||
// The route has named parameters so we need to extract them
|
||||
let extracted = this->extractNamedParams(pattern),
|
||||
pcrePattern = extracted[0],
|
||||
routePaths = array_merge(routePaths, extracted[1]);
|
||||
} else {
|
||||
let pcrePattern = pattern;
|
||||
}
|
||||
|
||||
// Transform the route's pattern to a regular expression
|
||||
let compiledPattern = this->compilePattern(pcrePattern);
|
||||
} else {
|
||||
let compiledPattern = pattern;
|
||||
}
|
||||
|
||||
// Update the original pattern
|
||||
let this->_pattern = pattern;
|
||||
|
||||
// Update the compiled pattern
|
||||
let this->_compiledPattern = compiledPattern;
|
||||
|
||||
//Update the route's paths
|
||||
let this->_paths = routePaths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the route's name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return this->_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the route's name
|
||||
*
|
||||
*<code>
|
||||
* $router->add('/about', array(
|
||||
* 'controller' => 'about'
|
||||
* ))->setName('about');
|
||||
*</code>
|
||||
*
|
||||
* @param string name
|
||||
* @return Route
|
||||
*/
|
||||
public function setName(name)
|
||||
{
|
||||
let this->_name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a callback that is called if the route is matched.
|
||||
* The developer can implement any arbitrary conditions here
|
||||
* If the callback returns false the route is treaded as not matched
|
||||
*
|
||||
* @param callback callback
|
||||
* @return Test\Router\Route
|
||||
*/
|
||||
public function beforeMatch(callback)
|
||||
{
|
||||
let this->_beforeMatch = callback;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the 'before match' callback if any
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getBeforeMatch()
|
||||
{
|
||||
return this->_beforeMatch;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the route's id
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRouteId()
|
||||
{
|
||||
return this->_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the route's pattern
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getPattern()
|
||||
{
|
||||
return this->_pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the route's compiled pattern
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getCompiledPattern()
|
||||
{
|
||||
return this->_compiledPattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the paths
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getPaths()
|
||||
{
|
||||
return this->_paths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the paths using positions as keys and names as values
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getReversedPaths()
|
||||
{
|
||||
var reversed, path, position;
|
||||
|
||||
let reversed = [];
|
||||
for path, position in this->_paths {
|
||||
let reversed[position] = path;
|
||||
}
|
||||
return reversed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a set of HTTP methods that constraint the matching of the route (alias of via)
|
||||
*
|
||||
*<code>
|
||||
* $route->setHttpMethods('GET');
|
||||
* $route->setHttpMethods(array('GET', 'POST'));
|
||||
*</code>
|
||||
*
|
||||
* @param string|array httpMethods
|
||||
* @return Test\Router\Route
|
||||
*/
|
||||
public function setHttpMethods(httpMethods)
|
||||
{
|
||||
let this->_methods = httpMethods;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTTP methods that constraint matching the route
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public function getHttpMethods()
|
||||
{
|
||||
return this->_methods;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a hostname restriction to the route
|
||||
*
|
||||
*<code>
|
||||
* $route->setHostname('localhost');
|
||||
*</code>
|
||||
*
|
||||
* @param string|array httpMethods
|
||||
* @return Test\Router\Route
|
||||
*/
|
||||
public function setHostname(hostname)
|
||||
{
|
||||
let this->_hostname = hostname;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hostname restriction if any
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getHostname()
|
||||
{
|
||||
return this->_hostname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a converter to perform an additional transformation for certain parameter
|
||||
*
|
||||
* @param string name
|
||||
* @param callable converter
|
||||
* @return Test\Router\Route
|
||||
*/
|
||||
public function convert(name, converter)
|
||||
{
|
||||
let this->_converters[name] = converter;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the router converter
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getConverters()
|
||||
{
|
||||
return this->_converters;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user