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,931
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
 

Forum istatistikleri

Konular
7,444
Mesajlar
125,446
Üyeler
3,026
Son üye
hsng

Son kaynaklar

Son profil mesajları

Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
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ı
Back
Top