CcShell.php 5.9 KB

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