okular PDF görüntüleyici çift tıklama ile seçim

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,695
Linux'ta yaygın kullanılan bir PDF görüntüleyici olan okular kullanarak bir işlemci dokümanından register isimlerini kopyalayıp ghidra'ya aktarmaya çalışıyordum. Register ismi üzerine çift tıklayıp copy/paste yapıyordum. Ama dokümanda register isimlerinin etrafında bazan normal parantez, bazan köşeli, bazan da farklı bir parantez oluyor. Her seferinde seçilen bölgeyi ayarlamam gerekiyordu. Yüzlerce register var aktarılması gereken, yeterince canımı sıktı ve bu konuda birşey yapmaya karar verdim.

Okular ve bağımlı olduğu bütün kütüphanelerin kaynak kodlarını ve debug sembollerini indirdim. Sonra da okular'da "double click" işinin gereğini yapan fonksiyonu araştırdım ilgili fonksiyonu bulup analiz ettim. Benim tanımladığım bir listedeki karakterleri de "delimiter" olarak kabul edecek şekilde değiştirdim. Başkasının da işini yarayabilir o yüzden yaptığım değişikliği paylaşıyorum. Benim kullandığım okular 23.08.11, ama değişikliğin mantığı basit, başka sürümlere de uyarlanabilir.

Kod:
diff --git a/core/textpage.cpp b/core/textpage.cpp
index 0693fcf..39470c3 100644
--- a/core/textpage.cpp
+++ b/core/textpage.cpp
@@ -1775,6 +1775,23 @@ TextEntity::List TextPage::words(const RegularAreaRect *area, TextAreaInclusionB
     return ret;
 }
 
+static char delimiters[] = {'[', ']', '(', ')', '{', '}'};
+
+static bool is_delimiter(const QChar& c, const char* delim, unsigned int count)
+{
+    bool rc = false;
+
+    for (unsigned int i = 0; i < count; ++i)
+    {
+        if (c.toLatin1() == delim[i])
+        {
+            rc = true;
+        }
+    }
+
+    return rc;
+}
+
 RegularAreaRect *TextPage::wordAt(const NormalizedPoint &p, QString *word) const
 {
     TextList::ConstIterator itBegin = d->m_words.constBegin(), itEnd = d->m_words.constEnd();
@@ -1795,7 +1812,8 @@ RegularAreaRect *TextPage::wordAt(const NormalizedPoint &p, QString *word) const
         while (posIt != itBegin) {
             --posIt;
             const QString itText = (*posIt)->text();
-            if (itText.right(1).at(0).isSpace()) {
+            if (itText.right(1).at(0).isSpace() ||
+                    is_delimiter(itText.right(1).at(0), delimiters, sizeof(delimiters))) {
                 if (itText.endsWith(QLatin1String("-\n"))) {
                     // Is an hyphenated word
                     // continue searching the start of the word back
@@ -1819,7 +1837,8 @@ RegularAreaRect *TextPage::wordAt(const NormalizedPoint &p, QString *word) const
         RegularAreaRect *ret = new RegularAreaRect();
         for (; posIt != itEnd; ++posIt) {
             const QString itText = (*posIt)->text();
-            if (itText.simplified().isEmpty()) {
+            if (itText.simplified().isEmpty() ||
+                is_delimiter(itText.simplified().right(1).at(0), delimiters, sizeof(delimiters))) {
                 break;
             }
 
Son düzenleme:
Daha önce register ismi parantezler dahil olarak seçiliyordu çift tıklayınca, şimdi sadece parantez içi seçiliyor

1729364113837.png
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
7,276
Mesajlar
123,031
Üyeler
2,935
Son üye
AtifK

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top