2017-07-14 8 views
0

この便利なPHPスクリプトは、SVGパスをコンテナに対して相対的に作成するため、フロントエンドで実装したときに反応します。SVGパス0 - 1 JavaScriptでの範囲変換

$absolute_path = "M0,67.9586133 M0,67.9586133.....Z"; 
function regex_callback($matches) { 
    static $count = -1; 
    $count++; 
    $width = 1072.01; 
    $height = 399.23; 
    if($count % 2) { 
     return $matches[0]/$height; 
    } else { 
     return $matches[0]/$width; 
    } 
} 

$relative_path = preg_replace_callback('(\d+(\.\d+)?)', 'regex_callback', $absolute_path); 

出典:Convert SVG path data to 0-1 range

現在、私はJavaScriptとノードで働いているので、私はJavaScriptを使用してこの機能を再作成しようとしています。ここまでは私が今までに得たものですが、返されるデータは入力されたものとまったく同じですので、私は立ち往生しています。

function replacer(match, svgWidth, svgHeight) { 
 
    let count = -1; 
 
    count++; 
 
    if (count % 2) { 
 
    return match[0]/svgHeight; 
 
    } else { 
 
    return match[0]/svgWidth; 
 
    } 
 
} 
 

 
let svgPath = "M0,67.9586133 M0,67.9586133.....Z" 
 
let nuPath = svgPath.replace('(\d+(\.\d+)?)', replacer); 
 
console.log(nuPath);

任意の助け - 方向及び/又は補正が理解されます。

ありがとうございます!

+0

「応答性を保つための要素は? – lilezek

+0

私はSVGをクリップパスとして 'clipPathUnits =" objectBoundingBox "と使用しています。これを応答可能なユニットにするには、私の理解に基づいて0 - 1でなければなりません。 – mmarquez

+0

どのような種類のSVGがその座標に有効数字を必要としますか? XDとにかく 'viewBox'属性を設定することもできます。 –

答えて

1

グローバルフラグでregular expressionを使用します。

let nuPath = svgPath.replace(/(\d+(\.\d+)?)/g, replacer); 

また、あなたは関数の外幅と高さを定義する必要があります。

let svgHeight = 399.23; 
let svgWidth = 1072.01; 

をそして最後に、あなたが未使用の関数の引数を消去する必要があります。

+0

応答ありがとうございます - 非常にはっきりしていますが、出力は元のPHPスクリプトが私に与えるものとは異なります。例えば、 '' M0,67.9586133 L53.72258,297.209905 ... 'をパスとして渡すと、PHPは '' M0,0.170224214864 L0.0501138795347 ... 'を出力します.JSは出力します:' 'M0、 0.005596962714900048 L0.004664135595750039..'人間の間違いのように見えますが、二重チェックして理由を見つけることができません。 – mmarquez

+0

私は関数から 'count'変数を取り出しました。 PHPが汚れています – lilezek

+0

ありがとうございました!本当に助けてくれてありがとう - 同じ問題は出力が正しいものではありませんが、少なくとも私は元の入力から別の出力を得ているので、 。 – mmarquez

関連する問題