diff --git a/Atom/src/OnigRegexpExtension.mm b/Atom/src/OnigRegexpExtension.mm index 956cc42e9..b94870c4e 100644 --- a/Atom/src/OnigRegexpExtension.mm +++ b/Atom/src/OnigRegexpExtension.mm @@ -37,6 +37,39 @@ public: return resultArray; } + CefRefPtr GetCaptureTree(CefRefPtr string, CefRefPtr index) { + OnigResult *result = [m_regex search:stringFromCefV8Value(string) start:index->GetIntValue()]; + if ([result count] == 0) return CefV8Value::CreateNull(); + return BuildCaptureTree(result); + } + + CefRefPtr BuildCaptureTree(OnigResult *result) { + int currentIndex = 0; + return BuildCaptureTree(result, currentIndex); + } + + CefRefPtr BuildCaptureTree(OnigResult *result, int ¤tIndex) { + int index = currentIndex++; + NSString *text = [result stringAt:index]; + int startPosition = [result locationAt:index]; + int endPosition = startPosition + [text length]; + + CefRefPtr childCaptures; + + while (currentIndex < [result count] && [result locationAt:currentIndex] < endPosition) { + if ([result lengthAt:currentIndex] == 0) continue; + if (!childCaptures.get()) childCaptures = CefV8Value::CreateArray(); + childCaptures->SetValue(childCaptures->GetArrayLength(), BuildCaptureTree(result)); + } + + CefRefPtr tree = CefV8Value::CreateObject(NULL, NULL); + tree->SetValue("index", CefV8Value::CreateInt(index), V8_PROPERTY_ATTRIBUTE_NONE); + tree->SetValue("text", CefV8Value::CreateString([text UTF8String]), V8_PROPERTY_ATTRIBUTE_NONE); + tree->SetValue("position", CefV8Value::CreateInt(startPosition), V8_PROPERTY_ATTRIBUTE_NONE); + if (childCaptures.get()) tree->SetValue("captures", childCaptures, V8_PROPERTY_ATTRIBUTE_NONE); + return tree; + } + CefRefPtr CaptureCount() { return CefV8Value::CreateInt([m_regex captureCount]); }