mirror of
https://github.com/atom/atom.git
synced 2026-02-15 00:55:14 -05:00
Return absolute minimum capture data from OnigRegExp
This commit is contained in:
@@ -37,37 +37,27 @@ public:
|
||||
return resultArray;
|
||||
}
|
||||
|
||||
CefRefPtr<CefV8Value> GetCaptureTree(CefRefPtr<CefV8Value> string, CefRefPtr<CefV8Value> index) {
|
||||
CefRefPtr<CefV8Value> GetCaptureIndices(CefRefPtr<CefV8Value> string, CefRefPtr<CefV8Value> index) {
|
||||
OnigResult *result = [m_regex search:stringFromCefV8Value(string) start:index->GetIntValue()];
|
||||
if ([result count] == 0) return CefV8Value::CreateNull();
|
||||
return BuildCaptureTree(result);
|
||||
return BuildCaptureIndices(result);
|
||||
}
|
||||
|
||||
CefRefPtr<CefV8Value> BuildCaptureTree(OnigResult *result) {
|
||||
int index = 0;
|
||||
return BuildCaptureTree(result, index);
|
||||
}
|
||||
CefRefPtr<CefV8Value> BuildCaptureIndices(OnigResult *result) {
|
||||
CefRefPtr<CefV8Value> array = CefV8Value::CreateArray();
|
||||
int i = 0;
|
||||
|
||||
CefRefPtr<CefV8Value> BuildCaptureTree(OnigResult *result, int &index) {
|
||||
int currentIndex = index++;
|
||||
int startPosition = [result locationAt:currentIndex];
|
||||
int endPosition = startPosition + [result lengthAt:currentIndex];
|
||||
|
||||
CefRefPtr<CefV8Value> tree = CefV8Value::CreateArray();
|
||||
int i = 0;
|
||||
tree->SetValue(i++, CefV8Value::CreateInt(currentIndex));
|
||||
tree->SetValue(i++, CefV8Value::CreateInt(startPosition));
|
||||
tree->SetValue(i++, CefV8Value::CreateInt(endPosition));
|
||||
|
||||
while (index < [result count] && [result locationAt:index] < endPosition) {
|
||||
if ([result lengthAt:index] == 0) {
|
||||
index++;
|
||||
} else {
|
||||
tree->SetValue(i++, BuildCaptureTree(result, index));
|
||||
}
|
||||
int resultCount = [result count];
|
||||
for (int index = 0; index < resultCount; index++) {
|
||||
int captureLength = [result lengthAt:index];
|
||||
if (captureLength == 0) continue;
|
||||
int captureStart = [result locationAt:index];
|
||||
array->SetValue(i++, CefV8Value::CreateInt(index));
|
||||
array->SetValue(i++, CefV8Value::CreateInt(captureStart));
|
||||
array->SetValue(i++, CefV8Value::CreateInt(captureStart + captureLength));
|
||||
}
|
||||
|
||||
return tree;
|
||||
return array;
|
||||
}
|
||||
|
||||
CefRefPtr<CefV8Value> CaptureCount() {
|
||||
@@ -91,11 +81,11 @@ bool OnigRegexpExtension::Execute(const CefString& name,
|
||||
CefRefPtr<CefV8Value>& retval,
|
||||
CefString& exception) {
|
||||
|
||||
if (name == "getCaptureTree") {
|
||||
if (name == "getCaptureIndices") {
|
||||
CefRefPtr<CefV8Value> string = arguments[0];
|
||||
CefRefPtr<CefV8Value> index = arguments.size() > 1 ? arguments[1] : CefV8Value::CreateInt(0);
|
||||
OnigRegexpUserData *userData = (OnigRegexpUserData *)object->GetUserData().get();
|
||||
retval = userData->GetCaptureTree(string, index);
|
||||
retval = userData->GetCaptureIndices(string, index);
|
||||
return true;
|
||||
}
|
||||
else if (name == "buildOnigRegExp") {
|
||||
|
||||
Reference in New Issue
Block a user