2011-06-28 12 views
17

के रूप में पढ़ना है, मैं अपने विशाल 78,000 फ़ाइल C++ कोडबेस पर स्वचालित Doxygen रन सेट अप करने का प्रयास कर रहा हूं। यह मूल प्रकार और पदानुक्रम की जानकारी निकालने के साथ ठीक है, लेकिन मैं पहले से मौजूद दस्तावेज टिप्पणियों को चुनने के बारे में बेहतर बनाना चाहता हूं।Doxygen को डबल-स्लैश सी ++ टिप्पणियों को मार्कअप

वर्षों में जमा की गई अधिकांश टिप्पणियां सामान्य पैटर्न का पालन करती हैं, हालांकि डॉक्सिजन की अपेक्षा नहीं है। ज्यादातर वे, जैसे

// class description 
class foo 
{ 
    // returns ascii art of a fruit 
    const char* apples(void); 

    // does something to some other thing 
    customtype_t baz(foo &other); 

    enum 
    { 
     kBADGER, // an omnivorous mustelid 
     kMUSHROOM, // tasty on pizza 
     kSNAKE, // oh no! 
    }; 
} 

कौन सा डबल-घटा कर रहे हैं देखने के लिए /// या //! शैली टिप्पणी के बजाय कि Doxygen की उम्मीद है।

ऐसी सभी टिप्पणियों को खोजने और बदलने के माध्यम से बहुत सारी फाइलें हैं, और मेरे कई प्रोग्रामर अपने कोड में ट्रिपल-स्लेश देखने के लिए हिंसक रूप से एलर्जी हैं, इसलिए मैं डोक्सिजन को पढ़ने के लिए कुछ रास्ता ढूंढना चाहता हूं JavaDoc टिप्पणियों के रूप में सामान्य टिप्पणियां, जब वे सही जगह पर हों। क्या डॉक्सिजन ///// के रूप में पढ़ने का कोई तरीका है?

मुझे ऐसा कोई कॉन्फ़िगरेशन पैरामीटर नहीं मिला, इसलिए मुझे लगता है कि मुझे किसी भी तरह इनपुट को बदलने की आवश्यकता होगी। सामान्य तौर पर शासन मैं का उपयोग करना चाहते है:

  • अगर वहाँ सिर्फ एक टिप्पणी युक्त एक पंक्ति है, तुरंत एक समारोह/कक्षा/प्रकार/चर घोषणा से ठीक पहले, मान लें कि यह एक /// टिप्पणी है।
  • अगर वहाँ एक घोषणा एक // टिप्पणी से एक ही लाइन पर पीछा किया है, यह एक ///<

रूप में मानते हैं लेकिन मैं Doxygen इस नियम को पढ़ाने के बारे में जाने के लिए कैसे पता नहीं है। दो तरह से मैं के बारे में सोच सकते हैं:

  1. एक INPUT_FILTER, जो इनपुट सी पार्स ++ और जैसा कि ऊपर /// रों में // रों बदल देती है के रूप में एक कार्यक्रम लिखें। लेकिन इस प्रकार का परिवर्तन एक नियमित अभिव्यक्ति के रूप में करने के लिए बहुत जटिल है, और मैं वास्तव में एक अन्य सी ++ पार्सर में इनपुट फ़ीड करने के लिए एक पूर्ण उड़ा हुआ सी ++ पार्सर लिखना नहीं चाहता हूं! साथ ही, प्रत्येक फ़ाइल के लिए एक INPUT_FILTER प्रोग्राम को कताई करना डॉक्सिजन को अस्वीकार्य रूप से धीमा कर देता है: हमारे स्रोत में इसे चलाने में 30 मिनट से अधिक समय लगता है, और INPUT_FILTER जोड़ने में इसे छह घंटे लगते हैं।
  2. उपरोक्त टिप्पणी नियमों को शामिल करने के लिए डॉक्सीजन स्रोत कोड संशोधित करें। यह अपरिचित कोड में काम की डरावनी मात्रा की तरह लगता है।

कोई अन्य विचार? नहीं आप कर सकते हैं:

+3

निर्देशिकाओं के माध्यम से एक छोटी सी स्क्रिप्ट के बारे में क्या होता है, कोड में '//' (स्पेस के साथ) लगता है और इसे '///' में बदल देता है? साथ ही, यदि आपका कोडर '///' के खिलाफ एलर्जी है, तो उन्हें फ़ार्मेसी से कुछ प्राप्त करने के लिए कहें। – Xeo

+0

आप डॉक्सिजन के पार्सर को संशोधित कर सकते हैं ताकि यह कुछ स्थानों में '////' के बजाय '//' का उपयोग कर सके। Doxygen सब के बाद opensource है। अक्सर पूछे जाने वाले प्रश्नों से: 'संभवत: src/scanner.l' tvak करना बहुत कठिन नहीं है। – rve

+1

@Xeo यदि मैंने वास्तव में 78000 फ़ाइलों में चेक आउट, संशोधित और चेक किया है, तो किसी प्रारूप को टिप्पणियों को संशोधित करने के लिए बस कोई भी पसंद नहीं करेगा, मैं चाहता हूं दोपहर के भोजन से पहले निकाल दिया जाना चाहिए। – Crashworks

उत्तर

0

आप Doxygen शैली टिप्पणी को बदलने के लिए एक स्क्रिप्ट का उपयोग कर सकते हैं, यहाँ एक सरल अजगर स्क्रिप्ट है, बस इसे का प्रयास करें:


#!/usr/bin/env python 

import os 
import sys 
import re 

def main(input_file, output_file): 
    fin = open(input_file, 'r') 
    fout = open(output_file, 'w') 
    pattern1 = '^\s*//\s.*' 
    pattern2 = '^\s*\w.*\s//\s.*' 
    for line in fin.readlines(): 
     if re.match(pattern1, line) != None: 
      line = line.replace('//', '///', 1) 
     if re.match(pattern2, line) != None: 
      line = line.replace('//', '///<', 1) 
     fout.write(line) 
    fin.close() 
    fout.close() 

if __name__ == '__main__': 
    if len(sys.argv) != 3: 
     print 'usage: %s input output' % sys.argv[0] 
     sys.exit(1) 
    main(sys.argv[1], sys.argv[2]) 
+0

यह उन टिप्पणियों को भी संशोधित करेगा जो तुरंत घोषणाओं से पहले नहीं होते हैं - यह हर जगह हर टिप्पणी को बदल देगा। इससे बड़ी मात्रा में झूठी इनपुट उत्पन्न होगी। जिस तरह से INPUT_FILTER प्रत्येक इनपुट फ़ाइल के लिए एक नया पायथन इंस्टेंस लॉन्च करता है, वह भी बनाता है डॉक्सिजन बहुत धीमी गति से चलती है (निर्माण 30 मिनट के बजाय बारह घंटे लेता है) – Crashworks

+0

दो बिंदु: 1. आप उन टिप्पणियों को छोड़ने के लिए रेगेक्स अभिव्यक्ति का उपयोग कर सकते हैं जो तुरंत घोषणाओं से पहले नहीं हैं, उपर्युक्त स्क्रिप्ट सिर्फ एक साधारण है; 2. प्रोजेक्ट की हर इमारत से पहले टिप्पणियों की शैलियों को बदलने की आवश्यकता नहीं है, बस इसे एक बार करें, इसे अगली बार करने की आवश्यकता नहीं है। –

+1

लेकिन मैं किसी रेगेक्स को कैसे लिखूं जो किसी भी घोषणा से मेल खाता है? यही कारण है कि मुझे इससे पहले यह कोशिश कर रहा हूं: मैं अनुमान लगा सकता हूं कि एक रेगेक्स कैसे लिखना है जो ज्ञात आदिम प्रकारों की सरल घोषणाओं से मेल खाता है, जैसे 'int foo (char bar, bool baz)', लेकिन जब उनमें से प्रत्येक प्रकार स्वयं एक हेडर फ़ाइल से कहीं भी एक जटिल टाइपपीफ लाए जा सकते हैं, उदाहरण के लिए 'ResultVar_t foo (सीबीएजर और ए, सीपीजा बी, ..) ' – Crashworks

2

जवाब सरल है।

दस्तावेज़ के रूप में टिप्पणी को चिह्नित करने के लिए डॉक्सिजन की विशेष शैली का उपयोग किया जाना चाहिए।

डॉक्सिजन न केवल टिप्पणियां लेता है, जो घोषणा से पहले है। आप उन्हें कोड में हर जगह भी इस्तेमाल कर सकते हैं।

यदि आप डॉक्सिजन सुविधाओं का उपयोग करना चाहते हैं, तो आपको टिप्पणियों को हाथ से अपडेट करना होगा, या एक स्क्रिप्ट/टूल लिखना होगा जो घोषणाओं को देखता है और उन्हें बदलने के लिए टिप्पणियों से पहले।

आपको निर्णय लेना होगा, 3 समाधानों में से एक (अपने दो, और स्क्रिप्ट, उत्तर के रूप में जोड़ा गया) चुनें या डॉक्सिजन का उपयोग न करें।

संबंधित मुद्दे