analysis.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. require_once 'config.php';
  3. /**
  4. *
  5. * 分析源码引入及依赖关系,提供单次读取中的文件载入缓存 dfddf
  6. * @author yangbo
  7. *
  8. */
  9. class Analysis{
  10. /**
  11. * 缓存数据提高效率,c映射内容,i映射依赖列表,s映射缩略名称
  12. * @var array
  13. */
  14. static private $_cache = array();
  15. //static private $projpath = array();
  16. var $circle = array();
  17. public function Analysis(){
  18. $ss = explode('/', substr($_SERVER['SCRIPT_NAME'], 1));
  19. /*配置修改为使用Config.php中的配置, by bell 2011-3-25
  20. * if(sizeof(self::$projpath) == 0){
  21. self::$projpath[0] = '../../../_src/';
  22. self::$projpath[1] = '../../../../tangram/src/';
  23. self::$projpath[2] = '../../../../base-me/src/';
  24. self::$projpath[3] = '../../../../Tangram-base/src/';
  25. //TODO : 项目路径提取方式应该考虑使用test切分,用于支持ui项目使用同一套框架
  26. }*/
  27. }
  28. /**
  29. * 因测试需要更新的引入方法,domain支持多个通过,分割,支持第二参数忽略已经引入内容,递归判定跳过的入口必须提前
  30. * @param $domain 期望载入的依赖库
  31. * @param $exclude 期望排除的依赖库
  32. * @param $parent 解决相互依赖问题
  33. */
  34. public function get_import_srcs($domain, $recurse = true){
  35. if(Config::$DEBUG) var_dump("分析$domain");
  36. if(array_search($domain, $this->circle)) return array();//如果已经被分析过则直接返回
  37. array_push($this->circle, $domain);
  38. $include = array();
  39. $cnts = self::get_src_cnt($domain);
  40. $is = $cnts['i'];
  41. if(sizeof($is) > 0)
  42. foreach($is as $d){
  43. if($recurse)
  44. $include = array_merge($include, $this->get_import_srcs($d));
  45. else
  46. $include[$d] = self::$_cache[$d];
  47. }
  48. //因为依赖关系的前后联系,最后在include中加入当前domain
  49. if($recurse)
  50. $include[$domain] = $cnts['c'];
  51. return $include;
  52. }
  53. /**
  54. * 读取源文件内容,支持缓存,支持覆盖率文件读取,覆盖率路径在Config中配置
  55. * @param string $domain
  56. * @see Config::$COVERAGE_PATH
  57. */
  58. static function get_src_cnt($domain){
  59. new Analysis();
  60. if(!array_key_exists($domain, self::$_cache)){
  61. $cnt =''; $covcnt = '';
  62. //$path = join('/', explode('.', $domain)).'.js'; //为了支持xx.xx.js类型的文件名而修改 田丽丽
  63. //文件在当前项目存在则取当前项目,否则取tangram项目
  64. require_once 'config.php';
  65. foreach(Config::$SOURCE_PATH as $i=>$d){
  66. if(Config::$DEBUG)
  67. var_dump($d.$path);
  68. if(file_exists($d.$path)){
  69. $cnt = file_get_contents($d.$path);
  70. $cnt.="\n";//读取文件内容必须加个回车
  71. break;
  72. }
  73. }
  74. //尝试读取cov目录下的文件,如果不存在则忽略
  75. $covpath = Config::$COVERAGE_PATH.$path;
  76. if(file_exists($covpath)){
  77. if(Config::$DEBUG)var_dump($covpath);
  78. $covcnt = file_get_contents($covpath);
  79. }
  80. else $covcnt = $cnt;
  81. if($cnt == ''){
  82. if(Config::$DEBUG)
  83. print "fail read file : ".$path;
  84. return array('', array(), '');
  85. }
  86. if(Config::$DEBUG)
  87. print "start read file $domain<br />";
  88. $is = array();
  89. //正则匹配,提取所有(///import xxx;)中的xxx
  90. preg_match_all('/\/\/\/import\s+([^;]+);?/ies', $cnt, $is, PREG_PATTERN_ORDER);
  91. //移除//,顺便移除空行
  92. // $cnt = preg_replace('/\/\/.*/m', '', $cnt);TODO:正则处理出现在“”或者正则中的//时出现问题
  93. //移除/**/
  94. // $cnt = preg_replace('/\/\*.*\*\//sU', '', $cnt);
  95. self::$_cache[$domain] = array('c'=>$cnt, 'i'=>$is[1], 'cc'=>$covcnt);
  96. }
  97. return self::$_cache[$domain];
  98. }
  99. }
  100. ?>