2011-10-16 5 views
0

Je travaille avec une langue tentante qui prend en charge la portée de changer en utilisant délimiteurs spéciaux, comme ceci:langue Templating, déterminer la portée actuelle

%% scope Foo %% 
Stuff 
%% end %% 

Les blocs peuvent être imbriquées indéfiniment comme ceci:

%% scope Foo %% 
Stuff in the Foo namespace 
    %% scope Bar %% 
    Stuff in the bar namespace 
    %% end %% 
%% end %% 

Lorsque vous modifiez l'un de ces modèles dans une zone de texte, j'aimerais qu'une fonction Javascript soit exécutée pour signaler la portée actuelle. Le numéro de ligne actuel et la position du curseur sont déjà connus et peuvent être transmis à la fonction. En d'autres termes, en utilisant l'exemple ci-dessus, si mon curseur se trouve n'importe où sur la deuxième ligne, la fonction devrait enregistrer 'Foo'. De même, si je suis sur la 4ème ligne, il devrait enregistrer 'Bar'. Si je suis au tout début de la troisième ligne, (avant le %%), il devrait enregistrer "Foo".

+0

Comment obtenir la position du curseur? –

Répondre

0

Cela pourrait fonctionner pour vous:

value = "%% scope Foo %% \nStuff in the Foo namespace\n %% scope Bar %% \n  Stuff in the bar namespace \n %% end %% \n%% end %%" // the value of the text area 
cursor= Math.round(Math.random() * value.length) //just to get a random cursor position for testing 

console.log(logTag(cursor,value), cursor); // should be foo or bar 

function logTag (pos,string) { 
    string = string.slice(0,pos); 
    string = string.match(/%%\s*scope\s*(\w*)\s*%%/g); 
    string = string[string.length - 1].match(/%%\s*scope\s*(\w*)\s*%%/)[1]; 
    return string; 
} 

Cette fonction obtient simplement tous les %% scope <something> %% et retourne la dernière qui serait le champ dans lequel l'utilisateur est en train de taper dans les espaces peuvent être ignorés.. Et ne peut contenir que des caractères alphanumériques et des traits de soulignement.

+0

Parfait. Je vous remercie. – UncleCheese

+0

Vous pouvez également utiliser '+' au lieu de '*'. '+ 'signifie que les caractères doivent être répétés une ou plusieurs fois,' *' vaut 0 ou plus d'une fois. Faites-moi savoir si cela a fonctionné. –

Questions connexes