CcShell.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. App::uses('AppShell', 'Console/Command');
  3. App::uses('Folder', 'Utility');
  4. App::uses('File', 'Utility');
  5. if (!defined('LF')) {
  6. define('LF', PHP_EOL); # use PHP to detect default linebreak
  7. }
  8. /**
  9. * Code Completion Shell
  10. * Workes perfectly with PHPDesigner - but should also work with most other IDEs out of the box
  11. *
  12. * @version 1.1
  13. * @cakephp 2.x
  14. * @author Mark Scherer
  15. * @license MIT
  16. * 2011-11-24 ms
  17. */
  18. class CcShell extends AppShell {
  19. protected $plugins = null;
  20. protected $content = '';
  21. protected $appFiles = array();
  22. public function main() {
  23. $this->out('Code Completion Dump - customized for PHPDesigner');
  24. $this->filename = APP . 'CodeCompletion.php';
  25. # get classes
  26. $this->models();
  27. $this->behaviors();
  28. $this->controller();
  29. $this->helpers();
  30. $this->appFiles();
  31. # write to file
  32. $this->_dump();
  33. $this->out('...done');
  34. }
  35. public function models() {
  36. $files = $this->_getFiles('Model');
  37. $content = LF;
  38. $content .= '/*** model start ***/'.LF;
  39. $content .= 'class AppModel extends Model {'.LF;
  40. if (!empty($files)) {
  41. $content .= $this->_prepModels($files);
  42. }
  43. $content .= '}'.LF;
  44. $content .= '/*** model end ***/'.LF;
  45. $this->content .= $content;
  46. }
  47. public function behaviors() {
  48. $files = $this->_getFiles('Model/Behavior');
  49. $content = LF;
  50. $content .= '/*** behavior start ***/'.LF;
  51. $content .= 'class AppModel extends Model {'.LF;
  52. if (!empty($files)) {
  53. $content .= $this->_prepBehaviors($files);
  54. }
  55. $content .= '}'.LF;
  56. $content .= '/*** behavior end ***/'.LF;
  57. $this->content .= $content;
  58. }
  59. /**
  60. * components + models
  61. */
  62. public function controller() {
  63. $content = LF;
  64. $content .= '/*** component start ***/'.LF;
  65. $content .= 'class AppController extends Controller {'.LF;
  66. $files = $this->_getFiles('Controller/Component');
  67. if (!empty($files)) {
  68. $content .= $this->_prepComponents($files);
  69. }
  70. $content .= LF.LF;
  71. $files = $this->_getFiles('Model');
  72. if (!empty($files)) {
  73. $content .= $this->_prepModels($files);
  74. }
  75. $content .= '}'.LF;
  76. $content .= '/*** component end ***/'.LF;
  77. $this->content .= $content;
  78. }
  79. public function helpers() {
  80. $files = $this->_getFiles('View/Helper');
  81. $content = LF;
  82. $content .= '/*** helper start ***/'.LF;
  83. $content .= 'class AppHelper extends Helper {'.LF;
  84. if (!empty($files)) {
  85. $content .= $this->_prepHelpers($files);
  86. }
  87. $content .= '}'.LF;
  88. $content .= '/*** helper end ***/'.LF;
  89. $this->content .= $content;
  90. }
  91. public function appFiles() {
  92. $files = $this->appFiles;
  93. $content = LF;
  94. $content .= '/*** plugin files start ***/'.LF;
  95. if (!empty($files)) {
  96. $content .= $this->_prepAppFiles($files);
  97. }
  98. $content .= '/*** plugin files end ***/'.LF;
  99. $this->content .= $content;
  100. }
  101. protected function _prepAppFiles($files) {
  102. $res = '';
  103. foreach ($files as $name => $parent) {
  104. $res .= 'class ' . $name . ' extends '.$parent.' {}' . LF;
  105. }
  106. return $res;
  107. }
  108. protected function _prepModels($files) {
  109. $res = '';
  110. foreach ($files as $name) {
  111. $res .= '
  112. /**
  113. * '.$name.'
  114. *
  115. * @var '.$name.'
  116. */
  117. public $'.$name.';
  118. '.LF;
  119. }
  120. $res .= ' public function __construct() {';
  121. foreach ($files as $name) {
  122. $res .= '
  123. $this->'.$name.' = new '.$name.'();';
  124. }
  125. $res .= LF.' }'.LF;
  126. return $res;
  127. }
  128. protected function _prepBehaviors($files) {
  129. $res = '';
  130. foreach ($files as $name) {
  131. if (!($varName = $this->_varName($name, 'Behavior'))) {
  132. continue;
  133. }
  134. $res .= '
  135. /**
  136. * '.$name.'Behavior
  137. *
  138. * @var '.$varName.'
  139. */
  140. public $'.$varName.';
  141. '.LF;
  142. }
  143. $res .= ' public function __construct() {';
  144. foreach ($files as $name) {
  145. if (!($varName = $this->_varName($name, 'Behavior'))) {
  146. continue;
  147. }
  148. $res .= '
  149. $this->'.$varName.' = new '.$name.'();';
  150. }
  151. $res .= LF.' }'.LF;
  152. return $res;
  153. }
  154. /**
  155. * check on correctness to avoid duplicates
  156. */
  157. protected function _varName($name, $type) {
  158. if (($pos = strrpos($name, $type)) === false) {
  159. return '';
  160. //return $name;
  161. }
  162. return substr($name, 0, $pos);
  163. }
  164. protected function _prepComponents($files) {
  165. $res = '';
  166. foreach ($files as $name) {
  167. if (!($varName = $this->_varName($name, 'Component'))) {
  168. continue;
  169. }
  170. $res .= '
  171. /**
  172. * '.$name.'
  173. *
  174. * @var '.$varName.'
  175. */
  176. public $'.$varName.';
  177. '.LF;
  178. }
  179. $res .= ' public function __construct() {';
  180. foreach ($files as $name) {
  181. if (!($varName = $this->_varName($name, 'Component'))) {
  182. continue;
  183. }
  184. $res .= '
  185. $this->'.$varName.' = new '.$name.'();';
  186. }
  187. $res .= LF.' }'.LF;
  188. return $res;
  189. }
  190. protected function _prepHelpers($files) {
  191. # new ones
  192. $res = '';
  193. foreach ($files as $name) {
  194. if (!($varName = $this->_varName($name, 'Helper'))) {
  195. continue;
  196. }
  197. $res .= '
  198. /**
  199. * '.$name.'
  200. *
  201. * @var '.$varName.'
  202. */
  203. public $'.$varName.';
  204. '.LF;
  205. }
  206. $res .= ' public function __construct() {';
  207. foreach ($files as $name) {
  208. if (!($varName = $this->_varName($name, 'Helper'))) {
  209. continue;
  210. }
  211. $res .= '
  212. $this->'.$varName.' = new '.$name.'();';
  213. }
  214. $res .= LF.' }'.LF;
  215. return $res;
  216. }
  217. protected function _dump() {
  218. //$File = new File($this->filename, true);
  219. $content = '<?php exit();'.PHP_EOL.PHP_EOL;
  220. $content .= 'class CodeCompletion {'.PHP_EOL;
  221. $content .= '}'.PHP_EOL.PHP_EOL;
  222. $content .= '//Printed: '.date('d.m.Y, H:i:s').PHP_EOL;
  223. $content .= $this->content;
  224. //return $File->write($content);
  225. file_put_contents($this->filename, $content);
  226. }
  227. protected function _getFiles($type) {
  228. $files = App::objects($type, null, false);
  229. $corePath = App::core($type);
  230. $coreFiles = App::objects($type, $corePath, false);
  231. $files = array_merge($coreFiles, $files);
  232. //$paths = (array)App::path($type.'s');
  233. //$libFiles = App::objects($type, $paths[0] . 'lib' . DS, false);
  234. $appIndex = array_search('AppModel', $files);
  235. if ($appIndex !== false) {
  236. unset($files[$appIndex]);
  237. }
  238. if (!isset($this->plugins)) {
  239. $this->plugins = App::objects('plugin');
  240. }
  241. if (!empty($this->plugins)) {
  242. foreach ($this->plugins as $plugin) {
  243. $pluginType = $plugin.'.'.$type;
  244. $pluginFiles = App::objects($pluginType, null, false);
  245. if (!empty($pluginFiles)) {
  246. foreach ($pluginFiles as $file) {
  247. if (strpos($file, 'App'.$type) !== false) {
  248. //$this->appFiles[$file] = $plugin.'.'.$type;
  249. continue;
  250. }
  251. $files[] = $file;
  252. }
  253. }
  254. }
  255. }
  256. $files = array_unique($files);
  257. # no test/tmp files etc (helper.test.php or helper.OLD.php)
  258. foreach ($files as $key => $file) {
  259. if (strpos($file, '.') !== false || !preg_match('/^[\da-zA-Z_]+$/', $file)) {
  260. unset($files[$key]);
  261. }
  262. }
  263. return $files;
  264. }
  265. }