2015-12-10 2 views
1

Это вопрос новичков, но мне не удалось сделать что-либо разумное, но просвечивающее по этому вопросу. У меня есть редактор Sublime Text и отличный плагин DocBlockrhttps://github.com/spadgos/sublime-jsdocs, который правильно комментирует кусок пирога. Что мне делать после того, как я закончил с комментариями? Как минимум, я хотел бы иметь возможность ссылаться на аннотации в REPL. Какая еще документация доступна? Я хочу что-то легкое и легкое, для средних скриптов.Использование docstrings

РЕДАКТИРОВАТЬ:

var helper = exports.helper = (function() { 

... 

    /** 
    * Reduces a sequence of names to initials. 
    * @param {String} name Space Delimited sequence of names. 
    * @param {String} sep A period separating the initials. 
    * @param {String} trail A period ending the initials. 
    * @param {String} hyph A hypen separating double names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInits(name, sep, trail, hyph) { 
    function splitBySpace(nm) { 
     return nm.trim().split(/\s+/).map(function(x) {return x[0]}).join(sep).toUpperCase(); 
    } 
    return name.split(hyph).map(splitBySpace).join(hyph) + trail; 
    } 
    /** 
    * Reduces a sequence of names to initials. 
    * @param {String} name Space delimited sequence of names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInitials(name) { 
    return makeInits(name, '.', '.', '-'); 
    } 

... 

})(); 

С $ jsdoc src.js без ошибок, но только фиктивная заголовка генерируется.

ответ

2

Когда вы пишете это

function bar (foo) { 
    return foo + foo; 
} 

Если вы поместите курсор в строке чуть выше function и вы пишете /** когда вы нажимаете «Enter» вы будете получать это:

/** 
* [bar description] 
* @param {[type]} foo [description] 
* @return {[type]}  [description] 
*/ 
function bar (foo) { 
    return foo + foo; 
} 

Есть много сходных коротких куртков.

Для Exemple, если вы поместите курсор после @param {[type]} foo [description], нажмите «Enter» создаст новую линию * и писать @ предложит вам (в IntelliSense) все комментарии JSDoc и валидация создать сплошную линию.

Когда ваш файл правильно задокументирован, просто используйте CLI jsdoc, чтобы создать свою документацию.

Документация: http://usejsdoc.org/

EDIT: Я просто понимаю, что ответ на ваш вопрос в вашей https://github.com/spadgos/sublime-jsdocs ссылке, может быть, вы хотите знать, как генерировать документацию так ...

Установка Node.js и использование CLI команда

npm install jsdoc -g 

Затем предполагается имя файла вы хотите документ foo.js, выполните следующую команду:

jsdoc foo.js 

Это создаст документацию в каталоге out.

Все CLI документация для создания док здесь: http://usejsdoc.org/about-commandline.html

+0

Я попробовал это. «Сайт» генерируется беззвучно. Страница пуста под заголовком. В моем источнике JavaScript есть две функции, экспериментально прокомментированные. Эти функции находятся внутри «модулей», то есть локальных в анонимных функциях, представляющих тело модуля. –

+0

Возможно, потому, что вы не используете свойство '@ memberOf' для ссылки на эту функцию в модуле, поэтому модуль' @ memberof': MyModuleName ~ может выполнить эту работу. Отредактируйте сообщение, чтобы предоставить код, который не отображается должным образом в вашей документации, если вы хотите. –

+0

Что-то вроде этого, надеюсь. Я попробовал модуль @memberOf: helper ~ ', безрезультатно. На самом деле мой модуль анонимен, поэтому я не удивлен. –

0

На Global

Чтобы JSDoc Шаблон для создания документации, вы должны добавить атрибут @function с именем функции. Ваши две функции появятся в глобальной части шаблона.

jsdoc your-exemple.js 

Но, из-за вашу функцию находятся в области видимости в анонимной функции (но не модуля для момента), вы делаете добавить функцию @private, чтобы сообщить, что функции не является действительно глобальным, но только доступным в его объеме. Но, поскольку по умолчанию JSDoc Generator Template игнорирует функции privateates, добавьте опции --private.

jsdoc your-exemple.js --private 

Так что ваш код выглядит так.

(function() { 
    "use strict"; 

    // ... 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInits 
    * @private 
    * @param {String} name Space Delimited sequence of names. 
    * @param {String} sep A period separating the initials. 
    * @param {String} trail A period ending the initials. 
    * @param {String} hyph A hypen separating double names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInits(name, sep, trail, hyph) { 
     function splitBySpace(nm) { 
      return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase(); 
     } 
     return name.split(hyph).map(splitBySpace).join(hyph) + trail; 
    } 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInitials 
    * @private 
    * @param {String} name Space delimited sequence of names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInitials(name) { 
     return makeInits(name, '.', '.', '-'); 
    } 

    // ... 

}()); 

в класс

Если вы подвергаете содержание анонимного закрытия к переменной var Helper, это возможно класса. Таким образом, ваш код не будет частью глобального контента, а частью класса с @class, следующим за именем класса. И поскольку вы предоставите свою функцию в отношении модуля класса, вам не нужно объявлять функцию как конфиденциальную.

Но вы объясните, что ваша предыдущая функция является частью класса, поэтому вы должны использовать @memberOf с полным путем к свойству.

  • Окончание по ., если это статический член (открыт через возврат).
  • Окончание по #, если это метод, не поддающийся воздействию (подвергается через него).
  • Окончание по ~ если это частная функция, которая не отображается вообще (и @private).

Так

/** 
* Helper Class 
* @Class Helper 
*/ 
var Helper = (function() { 
    "use strict"; 

    // ... 

    /** 
    * Split by Space 
    * @function privateExemple 
    * @private 
    * @memberOf Helper~ 
    * @return {String}  ... 
    */ 
    function privateExemple() { 
     return ""; 
    } 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInits 
    * @memberOf Helper. 
    * @param {String} name Space Delimited sequence of names. 
    * @param {String} sep A period separating the initials. 
    * @param {String} trail A period ending the initials. 
    * @param {String} hyph A hypen separating double names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInits(name, sep, trail, hyph) { 
     function splitBySpace(nm, sep) { 
      return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase(); 
     } 
     return name.split(hyph).map(splitBySpace).join(hyph) + trail; 
    } 

    /** 
    * Reduces a sequence of names to initials. 
    * @method makeInitials 
    * @memberOf Helper# 
    * @param {String} name Space delimited sequence of names. 
    * @return {String}  Properly formatted initials. 
    */ 
    this.makeInitials = function makeInitials(name) { 
     return makeInits(name, '.', '.', '-'); 
    } 

    // ... 

    return { 
     makeInits: makeInits 
    }; 
}()); 

В Molule

Но в вашем случае вы используете exports так, что означает, что ваш файл является модулем. Поэтому вы должны описать это с помощью @module и имени. Итак, все, что вы ранее комментировали, будет не частью Global, а теперь частью вашего модуля. И поскольку вы предоставите свою функцию за модулем Helper, вам не нужно объявлять функцию как конфиденциальную.

/** 
* Helper Module 
* @module Helper 
*/ 
exports.helper = (function() { 
    "use strict"; 

    // ... 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInits 
    * @memberOf module:helper. 
    * @param {String} name Space Delimited sequence of names. 
    * @param {String} sep A period separating the initials. 
    * @param {String} trail A period ending the initials. 
    * @param {String} hyph A hypen separating double names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInits(name, sep, trail, hyph) { 
     function splitBySpace(nm) { 
      return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase(); 
     } 
     return name.split(hyph).map(splitBySpace).join(hyph) + trail; 
    } 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInitials 
    * @private 
    * @memberOf module:helper~ 
    * @param {String} name Space delimited sequence of names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInitials(name) { 
     return makeInits(name, '.', '.', '-'); 
    } 

    // ... 

    return { 
     makeInitials: makeInitials 
    }; 
}()); 

модуля и класса

Но, потому что вы подвергаете через var Helper как класс и через exports в качестве модуля можно документировать и в пути.

/** 
* Helper Class 
* @class Helper 
* @memberOf module:helper~ 
* @see {@link module:helper|Module} 
*/ 
var Helper = (function() { 
    "use strict"; 

    // ... 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInits 
    * @memberOf module:helper. 
    * @param {String} name Space Delimited sequence of names. 
    * @param {String} sep A period separating the initials. 
    * @param {String} trail A period ending the initials. 
    * @param {String} hyph A hypen separating double names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInits(name, sep, trail, hyph) { 
     function splitBySpace(nm) { 
      return nm.trim().split(/\s+/).map(function (x) { return x[0]; }).join(sep).toUpperCase(); 
     } 
     return name.split(hyph).map(splitBySpace).join(hyph) + trail; 
    } 

    /** 
    * Reduces a sequence of names to initials. 
    * @function makeInitials 
    * @private 
    * @memberOf module:helper~ 
    * @param {String} name Space delimited sequence of names. 
    * @return {String}  Properly formatted initials. 
    */ 
    function makeInitials(name) { 
     return makeInits(name, '.', '.', '-'); 
    } 

    // ... 

    return { 
     makeInitials: makeInitials 
    }; 
}()); 

/** 
* helper Module 
* @module helper 
*/ 
exports.helper = Helper; 

Пространство имен или класс?

Разница между классом и пространством имен - это просто класс, выставляющий некоторые объекты/функции через this и не подлежит действию. Если к этому ничего не добавлено, у вас есть пространство имен, поэтому просто замените @class на @namespace, и этот код будет помещен в соответствующее пространство пространства имен.

Вы также проверяете, не является ли ваш класс не Mixin (просто используется поверх класса, но никогда напрямую), или интерфейс (определенный, но не реализуемый), если он является дополнительным классом другого класса.

и т.д.

Смотрите документ: http://usejsdoc.org/index.html

+0

Благодарим вас за подробный ответ, Haeresis! К сожалению, ничто не работает в моих кривых руках. Класс находится рядом с точкой (а не мгновенно), это либо модуль, либо пространство имен. Кстати, может ли быть более одного модуля на файл? Или более одного пространства имен? В крайнем случае я рискну дать вам ссылку на весь проект (это всего лишь образовательный эскиз) https://github.com/Tyrn/js-procr. Мое намерение (разумное инкапсулирование) должно быть самоочевидным. –

+0

Итак, я загрузил проект GitHub. Я открываю команду CLI в корневой каталог и запускаю следующую команду 'jsdoc procr/pcn.js', и у меня есть следующая ошибка: ' ERROR. Невозможно разобрать xxx Строка 291: Неверный оператор возврата' В строку 291 есть «возврат» в глобальной области. Это недопустимо. Удалите эту строку и перезапустите команду. Будет работать на этот раз. Чтобы создать документ без учета ошибок в файлах, выполните следующие действия: http://stackoverflow.com/questions/12890682/jsdoc-mark-some-code-to-not-be-parsed-but-retain-documentation/ 34092004 # 34092004 –

+0

(1) Я никогда не видел эту ошибку. (2) Необходим оператор if-return: сценарий не должен запускаться при импорте для модульного тестирования. Это похоже на идиому Python 'if __name__ == '__main__': run()'. Я должен потратить некоторое время, чтобы попытаться переварить ваши предложения. Еще раз спасибо! –

0

В странице: https://github.com/Tyrn/js-procr/blob/master/procr/pcn.js

У вас есть следующие строки:

if (require.main !== module) return false; 

, которые производят следующую ошибку: ERROR. Unable to parse xxx Line 291: Illegal return statement.

Это потому, что нет return не допускается в глобальном масштабе, так что используйте этот insteed:

if (require.main === module) { 
    main.copyAlbum(); 
} 

И вся ваша документация будет выпускаться как шарм.

На самом деле, я не знаю, почему ваша команда jsdoc не производит ошибок в вашей среде.