2013-10-12 13 views
8

Sto cercando di capire come funziona la mappa di origine CSS. Ho creato un file scss molto semplice.Come leggere il codice VLQ Base64?

#navbar { 
    color: black; 
} 

Quando compilo lo scss precedente, ottengo il seguente file di mappa.

{ 
"version": "3", 
"mappings": "AAAA,OAAQ;EACP,KAAK,EAAE,KAAK", 
"sources": ["test.scss"], 
"file": "test.css" 
} 

quando decodifico "mapping", ottengo i seguenti valori.

0) [0,0,0,0], [7,0,0,8] 
1) [2,0,1,-7], [5,0,0,5], [2,0,0,2], [5,0,0,5] 

Quali sono questi valori?

risposta

3

Ho trovato un esempio su http://www.thecssninja.com/javascript/source-mapping, nella sezione "Base64 VLQ e mantenendo la mappa di origine piccola".

Il diagramma AAgBC volta elaborato ulteriormente restituirebbe 0, 0, 32, 16, 1 - 32 essendo il bit prosecuzione che aiuta a costruire il seguente valore di 16. B puramente decodificato in Base64 è 1. Quindi la i valori importanti usati sono 0, 0, 16, 1. Questo ci fa sapere che la riga 1 (le righe vengono tenute contate dai semi-colon) colonna 0 del file generato si associa al file 0 (l'array di file 0 è foo. js), riga 16 nella colonna 1.

+0

Grande FOUND !!! Grazie mille!! – Moon

1

Nonostante gli esempi che ho trovato, mi ci è voluto un po 'per capire come funziona davvero la codifica/decodifica. Così ho pensato che avrei imparato meglio cercando di fare qualcosa io stesso in modo molto esplicito, passo dopo passo. Ho iniziato con la spiegazione di VLQ a this blog,

Io uso il seguente functor Python per generare sourcemaps per Transcrypt. Il codice è semplice e penso che dia una buona idea di come la codifica/decodifica funzioni in linea di principio. Per raggiungere la velocità nonostante la sua semplicità, memorizza nella cache i primi 256 numeri, che vengono utilizzati più spesso nella generazione di una v3 sourcemap.

import math 

class GetBase64Vlq: 
    def __init__ (self): 
     self.nBits32 = 5 
     self.encoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/' 
     self.prefabSize = 256 
     self.prefab = [self (i, True) for i in range (self.prefabSize)] 

    def __call__ (self, anInteger, init = False): 
     if not init and 0 < anInteger < self.prefabSize: 
      return self.prefab [anInteger] 
     else: 
      signed = bin (abs (anInteger)) [2 : ] + ('1' if anInteger < 0 else '0') 
      nChunks = math.ceil (len (signed)/float (self.nBits32)) 
      padded = (self.nBits32 * '0' + signed) [-nChunks * self.nBits32 : ] 
      chunks = [('1' if iChunk else '0') + padded [iChunk * self.nBits32 : (iChunk + 1) * self.nBits32] for iChunk in range (nChunks - 1, -1, -1)] 
      return ''.join ([self.encoding [int (chunk, 2)] for chunk in chunks]) 

getBase64Vlq = GetBase64Vlq() 

Esempio di utilizzo:

while (True): 
    print (getBase64Vlq (int (input ('Give number:'))))