Alloy DAY 003: tss を @import する


DAY 003 は tss ファイルを @import するための用意を紹介します。これは最初にやっておくと幸せになれますね。
参照: https://gist.github.com/FokkeZB/6011624

いぁあ、import が公式でサポートされてないのに驚きだけどね


alloy generate jmk

jmk はコンパイル時に自前の処理を入れたい時に設定します。jade を xml にする場合もこれを利用できます。
まず、alloy プロジェクトのルートで下記コマンドを実行すると、app/alloy.jmk が生成される。

1
$ alloy generate jmk

alloy.jmk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
function explodeImport(event, logger) {
  var path = require('path'),
    wrench = require('wrench'),
    fs = require('fs');

  wrench.readdirSyncRecursive(event.dir.project).forEach(function(fileRelative) {

    if (!fileRelative.match(/\.tss$/)) {
      return;
    }

    var fileAbsolute = path.join(event.dir.project, fileRelative),
      fileContent = fs.readFileSync(fileAbsolute).toString(),
      match,
      importRelative,
      importAbsolute,
      importContent;

    while (match = /^@import ["'](.+)["'];?$/gim.exec(fileContent)) {
      importRelative = match[1];

      if (importRelative.indexOf(path.sep) !== -1) {
        importAbsolute = path.join(dir.project, match[1]);
      } else {
        importAbsolute = path.join(path.dirname(fileAbsolute), match[1]);
      }

      if (!fs.existsSync(importAbsolute)) {
        throw new Error('Cannot find ' + importAbsolute + ' to import into ' + fileAbsolute);
      }

      logger.debug('Importing ' + importAbsolute + ' for ' + fileAbsolute);

      importContent = fs.readFileSync(importAbsolute).toString();
      fileContent = fileContent.replace(match[0], '//' + match[0] + "\n" + importContent + "\n//@import");
    }

    fs.writeFileSync(fileAbsolute, fileContent);
  });
}

function implodeImport(event, logger) {
  var path = require('path'),
    wrench = require('wrench'),
    fs = require('fs');

  wrench.readdirSyncRecursive(event.dir.project).forEach(function(fileRelative) {

    if (!fileRelative.match(/\.tss$/)) {
      return;
    }

    var fileAbsolute = path.join(event.dir.project, fileRelative),
      fileContent = fs.readFileSync(fileAbsolute).toString(),
      match;

    while (match = /^\/\/(@import ["'].+["'];?)[\s\S]+\/\/@import/gim.exec(fileContent)) {
      fileContent = fileContent.replace(match[0], match[1]);
    }

    fs.writeFileSync(fileAbsolute, fileContent);
  });
}

task("pre:compile", function(event, logger) {
  explodeImport(event, logger);
});

task("post:compile", function(event, logger) {
  implodeImport(event, logger);
});
Loading Facebook Comments ...

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です