import Foundation
let pattern = #"{.+|(?<=var)\s+([^\s]+)\s*=\s*['"]([^'"]+?)['"];"#
let regex = try! NSRegularExpression(pattern: pattern, options: .dotMatchesLineSeparators)
let testString = #"""
//stuff
var RootJsURL = "/trunk/js/portal"; //The root of the OpenMap Application
var RootRestUrl = "/trunk/rest"; //root of the restful services directory
var stripePublicKey = 'pk_test_rAYTGcpiFtrXvXpYic4C0Mt0';//the public key for your stripe account
//global functions for any tool to use
var showErrorPopup = function(title, message) {
Ext.MessageBox.show({
title: title,
msg: "Error: " + message,
buttons: Ext.MessageBox.OK,
icon: Ext.Msg.ERROR
});
};
/**
* checks if there is an error, if so display it
* @param obj the response json to check for an error
* @param title the title of the error pop up box
* @returns {boolean} true if there is an error, false otherwise
*/
var checkResponseForError = function(obj, title) {
if (obj.error) {
if (obj.loggedIn) {
showErrorPopup(title, obj.error);
return true;
}
else {
countdown.modal.show();
}
}
return false;
};
//The configure object that puts it all together
var Configure = {
LBAR:[],
TBAR:[],
BBAR:[],
RBAR:[],
centerbar:null,
/**
* List of window resize functions
*/
ResizeEvents:[],
/**
* Gets the working size of the main panel
* @returns {number}
*/
GetClientHeight:function(){
//var body = document.body;
//var html = document.documentElement;
var bannerHeight = document.getElementById("bannerimg").height;
//return Math.max(body.scrollHeight, body.offsetHeight,html.clientHeight, html.scrollHeight, html.offsetHeight)-bannerHeight-5;//Buffer of 5px --> need to fix and make it universal
return Ext.getBody().getViewSize().height -bannerHeight-5;
},
/**
* Configure all global variables
*/
Globals:function(){
//Create the dynamic content panel
this.centerbar = Ext.create('Ext.panel.Panel',{
region:'center',
autoScroll:true
});
},
/**
* Assembles all tools into the main panel before drawing
*/
MainPanel:function(){
//If LBar and BBar are empty, don't bother rendering them --> set to null
var topArray = [];
var bottomArray = [];
if(this.TBAR.length >0){
topArray = topArray.concat(this.TBAR);
}
if(this.BBAR.length >0){
bottomArray = bottomArray.concat(this.BBAR);
}
//Top bar --> Persistant tools
var TopBar = Ext.create('Ext.panel.Panel',{
region: 'north',
width:'100%',
layout:{
type:'hbox',
align: 'left',
pack: 'end'
},
margin: '0 0 0 0',
items: topArray
});
//Bottom bar --> usually pertinant info
var BottomBar = Ext.create('Ext.panel.Panel',{
region: 'south',
width:'100%',
layout:'hbox',
margin: '0 0 0 0',
items: bottomArray
});
//Side tool panel --> Extensible tools
var toolbar = Ext.create('Ext.panel.Panel',{
region: 'west',
width: 200,
minWidth: 200,
maxWidth: 400,
collapsible: false,
animCollapse:true,
hideCollapseTool: true,
floatable: true,
split: false,
margin: '0 0 0 0',
layout:{
type: 'vbox'
},
items:this.LBAR
});
//Right tool panel --> Extensible tools
var Rightbar = Ext.create('Ext.panel.Panel',{
region: 'east',
title:'Portal Information',
width: 200,
minWidth: 200,
maxWidth: 400,
collapsible: true,
animCollapse:true,
hideCollapseTool: true,
floatable: true,
split: false,
margin: '0 0 0 0',
layout:{
type: 'fit'
},
items:this.RBAR
});
if(!Rightbar.getCollapsed()){
Rightbar.toggleCollapse();
}
var cb = this.centerbar;
//Overall Panel --> Contains everything
MainPanel = Ext.create('Ext.panel.Panel',{
layout: {
type:'border',
padding: '0 0 0 0',
margin: '0 0 0 0'
},
width: '100%',
height:Configure.GetClientHeight(),//Buffer of 3px --> need to fix and make it universal
items:[toolbar,cb,TopBar,BottomBar,Rightbar],
renderTo: Ext.getBody()
});
//Window resize event
Ext.EventManager.onWindowResize(function () {
var width = '100%';
var height = Configure.GetClientHeight();
MainPanel.setSize(width, height);
for(var i = 0; i< Configure.ResizeEvents.length;i++){
Configure.ResizeEvents[i]();
}
});
},
/**
* Adds an element to the left hand side of the page
* @param {Array} elements
* @return void
*/
AddToLeftbar:function(elements){
this.LBAR = this.LBAR.concat(elements);
},
/**
* Adds an element to the top of the page
* @param {Array} elements
* @return void
*/
AddToTopbar:function(elements){
this.TBAR = this.TBAR.concat(elements);
},
/**
* Adds an element to the bottom of the page
* @param {Array} elements
* @return void
*/
AddToBottombar:function(elements){
this.BBAR = this.BBAR.concat(elements);
},
/**
* Adds an element to the right hand side of the page
* @params {Array} elements
* @return void
*/
AddToRightbar:function(elements){
this.RBAR = this.RBAR.concat(elements);
},
/**
* Replaces the center panel content
* @params {Ext.Component} element
* @return void
*/
UpdateContent:function(element){
WindowManager.Clear();
this.centerbar.removeAll(false);
this.centerbar.add(element);
},
/**
* Adds a window resize event
* @params {function} func
* @return void
*/
AddResizeEvent:function(func){
this.ResizeEvents = this.ResizeEvents.concat(func);
}
}
"""#
let stringRange = NSRange(location: 0, length: testString.utf16.count)
let matches = regex.matches(in: testString, range: stringRange)
var result: [[String]] = []
for match in matches {
var groups: [String] = []
for rangeIndex in 1 ..< match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
guard !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) else { continue }
let string = (testString as NSString).substring(with: nsRange)
groups.append(string)
}
if !groups.isEmpty {
result.append(groups)
}
}
print(result)
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Swift 5.2, please visit: https://developer.apple.com/documentation/foundation/nsregularexpression