const regex = /[\r\n]+\s*\/\/.*TODO:+.*/gi;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('[\\r\\n]+\\s*\\\/\\\/.*TODO:+.*', 'gi')
const str = `angular
.module('mdKeyboard', ['material.components.bottomSheet'])
.directive('mdKeyboard', MdKeyboardDirective)
.provider('\$mdKeyboard', MdKeyboardProvider);
function MdKeyboardDirective(\$mdKeyboard, \$mdBottomSheet, \$timeout, \$injector, \$log) {
return {
restrict: 'A',
require: '?ngModel',
scope: {
clickOutsideToClose: '=',
preserveScope: '=',
showInMobile: '='
},
link: function (scope, element, attrs, ngModelCtrl) {
if (!ngModelCtrl) {
return;
}
var bottomSheet;
// Don't show virtual keyboard in mobile devices (default)
//TODO: test detection and reimplement if neccessary
//TODO: dissolve dependency to UAParser if possible / use angular or material utils
if (\$injector.has('UAParser')) {
var UAParser = \$injector.get('UAParser');
var results = new UAParser().getResult();
var isMobile = results.device.type === 'mobile' || results.device.type === 'tablet';
isMobile = isMobile || (results.os && (results.os.name === 'Android'));
isMobile = isMobile || (results.os && (results.os.name === 'iOS'));
isMobile = isMobile || (results.os && (results.os.name === 'Windows Phone'));
isMobile = isMobile || (results.os && (results.os.name === 'Windows Mobile'));
if (isMobile && attrs.showInMobile !== true) {
return;
}
}
/*
ngVirtualKeyboardService.attach(elements[0], scope.config, function() {
\$timeout(function() {
ngModelCtrl.\$setViewValue(elements[0].value);
});
});
*/
\$log.debug(attrs);
element
.bind('focus', showKeyboard)
.bind('blur', hideKeyboard);
function showKeyboard() {
\$log.info('showKeyboard');
bottomSheet = \$mdBottomSheet
.show({
template: '<md-bottom-sheet class="md-grid" layout="column" ng-cloak>{{keyboard}}</md-bottom-sheet>',
controller: KeyboardController,
clickOutsideToClose: attrs.clickOutsideToClose || false,
preserveScope: attrs.preserveScope || true
})
.then(function () {
});
}
function hideKeyboard() {
\$log.info('hideKeyboard');
if (bottomSheet) {
\$mdBottomSheet.hide();
delete bottomSheet;
}
}
function KeyboardController(\$scope, \$mdBottomSheet) {
\$scope.keyboard = 'TEST';
}
// open bottomsheet with keyboard on focus TODO: and without backdrop
scope.keyboard = 'test';
// When navigation force destroys an interimElement, then
// listen and \$destroy() that interim instance...
scope.\$on('\$destroy', function () {
\$mdKeyboard.destroy();
});
}
};
}
function MdKeyboardProvider(\$\$interimElementProvider) {
return \$\$interimElementProvider('\$mdKeyboard')
.setDefaults({
options: keyboardDefaults
});
function keyboardDefaults() {
return {
themable: true,
layout: defaultLayout
};
function defaultLayout() {
// get default language
return 'en-us';
}
}
}
`;
// Reset `lastIndex` if this regex is defined globally
// regex.lastIndex = 0;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
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 JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions