2014-09-12 88 views
1

命令我使用這個在線工具http://www.professorcloud.com/svg-to-canvas/轉換帆布JS把結構緊湊

現在轉換SVG圖像的畫布JS命令我告訴你一些一塊代碼:

... 
ctx.beginPath(); 
ctx.moveTo(1080.756,172.244); 
ctx.lineTo(1077.382,175.618); 
ctx.lineTo(1079.223,177.458); 
ctx.lineTo(1081.677,175.004); 
ctx.lineTo(1082.903,171.63); 
ctx.lineTo(1080.756,172.244); 
ctx.closePath(); 
ctx.fill(); 
ctx.stroke(); 



ctx.beginPath(); 
ctx.moveTo(1089.039,169.79); 
ctx.lineTo(1091.492,169.79); 
ctx.quadraticCurveTo(1091.492,169.79,1091.492,169.79); 
ctx.lineTo(1091.492,171.32399999999998); 
ctx.quadraticCurveTo(1091.492,171.32399999999998,1091.492,171.32399999999998); 
ctx.lineTo(1089.039,171.32399999999998); 
ctx.quadraticCurveTo(1089.039,171.32399999999998,1089.039,171.32399999999998); 
ctx.quadraticCurveTo(1089.039,169.79,1089.039,169.79); 
ctx.lineTo(1089.039,169.79); 
ctx.closePath(); 
ctx.fill(); 
ctx.stroke(); 
... 

每個beginPath-closePath段的代碼繪製在畫布上分離對象。
當我想要做進一步的操作與此對象我來,我需要此命令列表轉換爲結構緊湊:

a = [ 
    { 
     name: 'name1', 
     coords: [ 
      ['m',21,22], 
      ['l',[1,2], [3,4], [5,6]], 
      ['b',7,8,9,10], 
      ['l',[11,12],[13,14]]    
     ] 
    }, 
    { 
     name: 'name2', 
     coords: [ 
      ['m',21,22], 
      ['l',[21,22], [23,4], [5,6]], 
      ['b',[27,28,9,10], [11,12,13,14]], 
      ['l',[211,212],[213,214]]    
     ] 
    }   
]; 

每個單獨的對象我想要被轉換成JS對象{}。並且在這個對象中'coords'屬性將擁有所有的js canvas功能並以數組方式進行協調錶示。其中第一個字母表示功能(moveTolineTo等),然後 - 此功能的參數。但在這裏額外的事情是,如果我有多行lineTo函數,我想將它們組合到一個數組中。所以,當我有這樣的代碼:

ctx.lineTo(1,2); 
ctx.lineTo(3,4); 

我希望它被轉化爲

['l',[1,2], [3,4]] 

而不是到

['l',[1,2]], 
['l',[3,4]] 

我應該怎樣做呢?
看不到用php正則表達式的方式。
我看到循環解決方案和多個preg_match es和if子句,但真的很想看到更簡單的解決方案。

+0

爲什麼使用正則表達式?你可以寫一個解析器。看起來像一個嵌套循環。 – 2014-09-12 20:26:43

+0

我看到循環和多個preg_mathches的sulution,如果是子句,但希望看到更簡單的東西。 – 2014-09-12 20:35:16

+1

不,不要在PHP中擴展它,在客戶端解析它要簡單得多。絕對不需要這樣的正則表達式 - 你已經有了一個JSON結構 - 無論是迭代JSON對象 - 在解析到客戶端的JS對象或服務器上的PHP關聯數組之後。 – 2014-09-12 20:36:52

回答

0
Underscore.js

魔轉換[ ['l',[1,2]],...,['l',[3,4]] ]['l',[1,2],...,[3,4]]

function compact_arr(data) { // helper function 
    return _.union(data[0][0], _.pluck(data, [1])) 
} 

接着,掃描coords:分組的連續集合 'L'(或 'B' 或 'M')的,並要求對每個組compact_arr()

+0

但是我需要將它轉換一次並將結果保存在文件中,然後使用該新文件。您的解決方案似乎可以即時轉換。 – 2014-10-16 17:46:19

+0

另外我的輸入文件看起來不像[['l',[1,2]],...,['l',[3,4]]]。但它看起來就像我在我的問題中寫的代碼 - 只是在單詞後面「現在我向你展示一些代碼:' – 2014-10-16 17:47:44