2016-02-15 1 views
6

Existe-t-il un analyseur de code JavaScript qui peut être utilisé du côté client pour analyser les modèles de code? J'ai trouvé ce qui suit mais il semble que ce soit juste pour le texte normal et vous donne le signe = etc. J'ai besoin d'une analyse de code qui peut fonctionner du côté client (code JS), y en a-t-il?Analyseur de code JavaScript côté client

function parseData() { 
 
    var rawData = document.getElementById('data').value.trim(), 
 
     result, 
 
     output = $('#output'), 
 
     table = $('table').remove(), 
 
     header, 
 
     row, 
 
     cell, 
 
     ul, 
 
     slice, 
 
     wpm = [],   
 
     wpmAvg = []; 
 

 
    output.empty(); 
 
    table.find('thead, tbody').empty(); 
 

 
    if ($('[name="format"]:checked').val() === 'text') { 
 
    // Simple text   
 
    result = analyzeText(rawData); 
 
    output.append('Word count: ' + result.count + '<br><br>Frequent words:<br>'); 
 
    ul = $('<ul>'); 
 
    _.forEach(result.frequentWords, function(value, key) { 
 
     ul.append('<li>' + value.word + ': ' + value.count + '</li>'); 
 
    }); 
 
    output.append(ul);  
 
    } 
 
    else { 
 
    // JSON 
 
    try { 
 
     data = JSON.parse(rawData); 
 
    } 
 
    catch(e) { 
 
     console.log('Error parsing JSON', e); 
 
    } 
 
    header = table.find('thead'); 
 
    body = table.find('tbody'); 
 
    row = $('<tr>'); 
 
    body.append(row); 
 
    // Loop over slices 
 
    _.forEach(data, function(value, key) { 
 
     slice = ''; 
 
     // Loop over statements 
 
     _.forEach(value, function(value, key) { 
 
     slice += value.words + ' '; 
 
     }); 
 

 
     result = analyzeText(slice); 
 

 
     addCell(slice, key); 
 

 
    }); 
 
    $.plot('#wpm', [wpm], { 
 
     xaxes: [{ 
 
     axisLabel: 'Time index (1-minute increments)', 
 
     }], 
 
     yaxes: [{ 
 
     position: 'left', 
 
     axisLabel: 'Words per minute', 
 
     }] 
 
    }); 
 
    output.append(table); 
 
    } 
 

 
    function addCell(data, index) { 
 
    var cell1, cell2, ul1, ul2, result; 
 
    cell1 = $('<td>'); 
 
    cell2 = $('<td>'); 
 
    ul1 = $('<ul>'); 
 
    ul2 = $('<ul>'); 
 
    cell1.append(ul1); 
 
    cell2.append(ul2); 
 
    row.append(cell1, cell2); 
 
    result = analyzeText(data); 
 
    header.append('<th>' + index + '</th><th class="subText">(' + result.count + ')</th>'); 
 
    wpm.push([index, result.count]); 
 
    _.forEach(result.frequentWords, function(value, key) { 
 
     ul1.append('<li>' + value.word + '</li>'); 
 
     ul2.append('<li>' + value.count + '</li>'); 
 
    }); 
 
    } 
 
} 
 

 
function analyzeText(rawData) { 
 
    var result = { 
 
    count: 0, 
 
    frequentWords: [] 
 
    }, 
 
     data = rawData.split(/[\s.,]+/g) 
 
    counts = {}, 
 
    countsArray = [], 
 
    commonWords = [ 
 
    0,1,2,3,4,5,6,7,8,9,    
 
    '-', 
 
    'a', 
 
    'about', 
 
    'function', 
 
    'object' 
 
    ]; 
 

 
    if (!data[data.length]) { 
 
    data.splice(-1, 1); 
 
    } 
 

 
    // Word count 
 
    result.count = data.length; 
 

 
    // Word frequency (filtered for common words, sorted descending by count) 
 
    for (var i = 0; i < data.length; i++) { 
 
    if (!counts.hasOwnProperty(data[i].toLowerCase())) { 
 
     counts[data[i].toLowerCase()] = 1; 
 
    } 
 
    else { 
 
     counts[data[i].toLowerCase()] += 1; 
 
    } 
 
    }  
 
    _.forEach(counts, function(value, key) { 
 
    if (commonWords.indexOf(key.toLowerCase()) === -1) { 
 
     countsArray.push({ 
 
     word: key.toLowerCase(), 
 
     count: value 
 
     }); 
 
    } 
 
    }); 
 
    countsArray = _.sortBy(countsArray, 'count').reverse();  
 
    _.forEach(countsArray, function(value, index) { 
 
    if (value.count > 1) { 
 
     result.frequentWords.push(value);    
 
    } 
 
    }); 
 

 
    return result; 
 
}
body { 
 
    font-family: arial; 
 
} 
 
table, tr, td, th { 
 
    border-collapse: collapse; 
 
    border: solid 1px #ddd; 
 
} 
 
th, td { 
 
    padding: 4px 8px;  
 
} 
 
.subText { 
 
    color:#999; 
 
    font-style: italic; 
 
} 
 
#wpm { 
 
    width:600px; 
 
    height: 400px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<script src="https://code.jquery.com/jquery-2.1.4.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.js"></script> 
 

 
<textarea id="data" cols="80" rows="20" placeholder="Paste text or JSON here"></textarea><br /> 
 
<label for="text"><input type="radio" name="format" checked value="text" id="text"> Simple text</label> 
 
<button type="button" onclick="parseData()">Analyze text</button> 
 
<br><br> 
 
<div id="output"></div><br><br> 
 
<div id="wpm"></div> 
 
<table> 
 
    <thead> 
 
    </thead> 
 
    <tbody> 
 
    </tbody> 
 
</table>

https://jsfiddle.net/fxn5q8y0/6/

+0

Parlez-vous des expressions régulières? – Jai

+0

@Jai - peut-être sous le capot je veux fournir un code qui sera analysé par rapport à une structure de mot-clé ou peut-être un modèle –

+0

S'il vous plaît être plus précis .. De quoi avez-vous besoin ** exactement ** . –

Répondre

0

boucle simplement par chaque élément d'une portée et détecter son type.

Voici un exemple rapide:

var analyse = function(obj){ 
 
    var results = {} 
 
    
 
    for(var b in obj) { // for each element 
 
    if(obj.hasOwnProperty(b)){ 
 
     var detectedType = (typeof obj[b]) // detect the type 
 
     if (!(detectedType in results)){ results[detectedType] = 0; } // if the type was detected for the first time, add its name to the results 
 
     
 
     results[detectedType]++; // increase the counter for the detected type 
 
    } 
 
    } 
 
    
 
    return results; 
 
} 
 

 

 

 
/** 
 
    example for a testObject 
 
**/ 
 

 
testObject = { 
 
    a: undefined, // type undefined 
 
    b: { xx: "xx", yy: 123 }, // type object 
 
    c: false, // type boolean 
 
    d: 987, // type number 
 
    e: "abc", // type string 
 
    f: Symbol("foo"), // type symbol 
 
    g: function(){}, // type function 
 
    h: "jkl", // type number 
 
    i: 654 // type number 
 
}; 
 

 
console.log(analyse(testObject));

+0

Bien que cet extrait de code puisse résoudre la question, [y compris une explication] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) contribue vraiment à améliorer la qualité de votre message. Rappelez-vous que vous répondez à la question pour les lecteurs dans le futur, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, ceci réduit la lisibilité du code et des explications! – Rizier123